To otwarte pytanie z wieloma tematami.
Zakładając typowy kompilator -> asembler -> linker toolchain. Kompilator nie wie dużo, po prostu koduje względne stosy, nie dba o to, ile i gdzie jest stos, to jest cel/piękno stosu, nie obchodzi. Kompilator generuje assembler asembler jest zmontowany na obiekt, a następnie łącznik trwa informacji linker skrypt niektórych argumentów wiersza smakowych lub dowodzenia, że powiedzieć, że szczegóły dotyczące miejsca w pamięci, kiedy
gcc hello.c -o hello
instalacja binutils ma domyślny skrypt linkera, który jest dostosowany do twojego celu (Windows, Mac, Linux, cokolwiek używasz). Skrypt ten zawiera informacje o tym, gdzie zaczyna się przestrzeń programu, a następnie stamtąd wie, gdzie rozpocząć stertę (po tekście, danych i bss). Wskaźnik stosu jest prawdopodobnie ustawiony przez ten skrypt łącznika i/lub os zarządza nim w inny sposób. I to określa twój stos.
Dla systemu operacyjnego z mmu, który jest tym, co mają twoje okna i komputery przenośne oraz komputery stacjonarne i przenośne z Mac i BSD, tak, każdy program jest kompilowany przy założeniu, że ma własną przestrzeń adresową zaczynającą się od 0x0000, co nie oznacza, że Program jest połączony z uruchomieniem przy 0x0000, zależy to od systemu operacyjnego od tego, jakie są te reguły systemu operacyjnego, niektóre zaczynają się na przykład od 0x8000.
Dla aplikacji typu "desktop", gdzie jest to w pewnym stopniu pojedyncza liniowa przestrzeń adresowa z perspektywy programów, najprawdopodobniej najpierw pojawi się .text, potem albo .data, albo .bss, a potem po tym wszystkim sterty zostaną wyrównane w pewnym momencie po tym. Stos jednak ustawiony jest zwykle wysoko i działa, ale może to być procesor i specyficzny system operacyjny. ten stos zwykle znajduje się w widoku programów świata na szczycie jego pamięci.
Pamięć wirtualna jest w tym wszystkim niewidoczna - aplikacja zwykle nie zna pamięci wirtualnej ani jej nie obchodzi. jeśli i kiedy aplikacja pobiera instrukcję lub przesyła dane, przechodzi przez sprzęt skonfigurowany przez system operacyjny i konwertujący pomiędzy wirtualnym i fizycznym.Jeśli mmu wskazuje na błąd, co oznacza, że miejsce nie zostało zmapowane na adres fizyczny, może to czasem być celowe, a następnie inne zastosowanie terminu "pamięć wirtualna". Ta druga definicja systemu operacyjnego może na przykład wziąć inną porcję pamięci, twoją lub kogoś innego, na przykład przenieść na dysk twardy, zaznaczyć, że inny fragment nie istnieje, a następnie oznaczyć swój kawałek jako posiadający barana, który następnie przepuścił wykonujesz, nie wiedząc, że przerwał ci jakiś baran, którego nie wiedziałeś, że musisz wziąć od kogoś innego. Twoja aplikacja przez projekt nie chce nic z tego wiedzieć, po prostu chce działać, system operacyjny zajmuje się zarządzaniem pamięcią fizyczną i mmu, która daje wirtualną (zerową) przestrzeń adresową ...
Jeśli Miałem zrobić trochę nagiego programowania metalu, bez początkowo MMU, potem później, mikrokontrolera, qemu, raspberry pi, beaglebone, itd. Możesz zabrudzić sobie ręce kompilatorem, skryptem linkera i konfiguracją mmu. Używałbym ramienia lub mipów dla tego nie x86, aby ułatwić Ci życie, ogólny duży obraz przekłada się bezpośrednio na cele.
Czy mogę poprosić o szybkie sprawdzenie? Czy jest to podstawowa maszyna do wywoływania funkcji, tworzenia ich zmiennych lokalnych i dodawania ich do stosu zawartego w programie podczas kompilacji? Czy maszyna jest częścią systemu operacyjnego? –