0xFFFFFFF0
to miejsce, w którym procesor zgodny z x86 rozpoczyna wykonywanie instrukcji po włączeniu. Jest to sztywny, niezmienny (bez dodatkowego sprzętu) aspekt procesora, a różne typy procesorów zachowują się inaczej.
Dlaczego pierwsza instrukcja BIOS znajduje się na „górze” 4 GB pamięci RAM?
Znajduje się na „szczycie” 4 GB przestrzeni adresowej - i po włączeniu BIOS lub ROM UEFI ROM jest ustawiony na reagowanie na odczyt tych adresów.
Moja teoria, dlaczego to jest:
Prawie wszystko w programowaniu działa lepiej z sąsiadującymi adresami. Projektant procesora nie wie, co konstruktor systemu będzie chciał zrobić z procesorem, dlatego złym pomysłem jest, aby procesor wymagał różnych adresów na środku przestrzeni do różnych celów. Lepiej trzymać to „na uboczu” na górze lub na dole przestrzeni adresowej. Oczywiście należy pamiętać, że ta decyzja została podjęta, gdy 8086 był nowy, który nie miał MMU .
W 8086 wektory przerwania istniały w miejscu pamięci 0 i powyżej. Wektory przerwań muszą znajdować się pod znanymi adresami i wymagały elastyczności w pamięci RAM - jednak projektant procesora nie mógł wiedzieć, ile pamięci RAM będzie w systemie. Więc zaczynając od 0 i praca nad nimi ma sens (ponieważ żaden system w 1978 roku, kiedy wynaleziono 8086, nie miałby 4 GB pamięci RAM - więc oczekiwanie RAM na 0xFFFFFFF0 nie było dobrym pomysłem), a następnie ROM musiałby być na górnej granicy.
Oczywiście, zaczynając od co najmniej 80286, wektory przerwań można przenieść do innej lokalizacji początkowej innej niż 0, ale współczesne 64-bitowe procesory x86 nadal uruchamiają się w trybie 8086, więc wszystko nadal działa po staremu w celu zachowania zgodności (jest to śmieszne jak się wydaje w 2015 roku, aby nadal potrzebować procesora x86, aby móc uruchomić DOS).
Ponieważ wektory przerwań zaczynają się od 0 i pracują w górę, ROM musiałby zaczynać od góry i pracować w dół.
Co by się stało, gdyby mój komputer miał tylko 1 GB pamięci RAM?
32-bitowy procesor ma 4 294 967 296 adresów, ponumerowanych od 0 (0x00000000) do 4294967295 (0xFFFFFFFF). ROM może żyć pod niektórymi adresami, a RAM może żyć pod innymi. Dzięki MMU procesora można to nawet przełączać na bieżąco. Pamięć RAM nie musi istnieć pod wszystkimi adresami.
Mając tylko 1 GB pamięci RAM, niektóre adresy nie będą reagować, gdy zostaną odczytane lub zapisane. Może to spowodować odczytanie nieprawidłowych danych podczas uzyskiwania dostępu do takich adresów lub blokowania systemu.
Co z systemami z więcej niż 4 GB pamięci RAM (np. 8 GB, 16 GB itp.)?
Upraszczając nieco: 64-bitowe procesory mają więcej adresów (co jest jedną z rzeczy, które sprawiają, że są 64-bitowe - na przykład 0x0000000000000000 do 0xFFFFFFFFFFFFFFFFFF), więc dodatkowa pamięć RAM „pasuje”. Zakładając, że procesor jest w trybie długim . Do tego czasu pamięć RAM jest dostępna, ale nie można jej adresować.
Dlaczego stos jest inicjowany z pewną wartością (w tym przypadku wartością znajdującą się pod 0xFFFFFFF0)?
Nie mogę natychmiast znaleźć niczego na temat tego, co x86 przypisuje wskaźnik stosu przy włączaniu, ale w końcu musiałoby to zostać ponownie przypisane przez procedurę inicjalizacji, gdy tylko dowie się, ile pamięci RAM jest w systemie. (@Eric Towers w komentarzach poniżej informuje, że jest ustawiony na zero po włączeniu).