2009-08-24 21 views

Odpowiedz

11

Czy pytasz ogólnie o wskaźniki?

W większości systemów operacyjnych są to adresy logiczne.

System operacyjny jest odpowiedzialny za przetłumaczenie ich na adresy fizyczne za pomocą mechanizmu pamięci wirtualnej i mechanizmu stronicowania. Jest to niewidoczne dla programu. Dlatego błędny program "uderza w granice" i GPF.

W przypadku niektórych starych systemów (np. DOS) byłyby one fizyczne, co pozwala na nadpisywanie danych w innych częściach pamięci.

7

Zależy od systemu operacyjnego i poziomu działania kodu.

W przypadku normalnego programu użytkownika w nowoczesnym systemie operacyjnym, otrzymasz adres wirtualny.

+1

ale jeśli uruchomię następujący prog: int main() {int (* p)(); p = main; printf ("% p", p);} podaje adres taki jak 0x80483c4, uważa, że ​​jest to adres fizyczny, dlaczego wirtualny adres głównego startu ma taki duży adres? używam tego na linux.plz wyjaśnić czy się mylę? – mawia

+4

Mylisz się. To jest adres wirtualny. Nikt nie powiedział, że twoja funkcja main() jest ładowana pod adres wirtualny 0. W rzeczywistości, w plikach binarnych ELF (używanych w Linuksie) segment kodu zaczyna się od wirtualnego adresu 0x80482c0, który wygląda dokładnie na prawo (jest jakaś ukryta konfiguracja kod przed głównym()). Należy pamiętać, że wirtualna przestrzeń adresowa jest często nieciągła, a adresy wirtualne są przydzielane tylko w miarę ich używania. Tylko dlatego, że twój program jest załadowany pod adresem 0x80482c0, nie oznacza to, że wszystko pomiędzy nim a 0x0 zostało już przydzielone. –

+0

Jeśli naprawdę chcesz dowiedzieć się, jak program jest zorganizowany w pamięci pod Linuksem, przeczytaj ten artykuł: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html –