Wykorzystanie rejestrów segmentacji

Próbuję zrozumieć, jak zarządzanie pamięcią idzie na niskim poziomie i mam kilka pytań.

1) Książka o języku asemblerowym autorstwa Kip R. Irvine mówi, że w trybie rzeczywistym pierwsze trzy rejestry segmentowe są ładowane z bazowymi adresami kodu, danych i segmentu stosu podczas uruchamiania programu. To jest dla mnie trochę dziwne. Czy te wartości są określone ręcznie, czy asembler generuje instrukcje zapisywania wartości w rejestrach? Jeśli zdarzy się to automatycznie, jak dowie się, jaki jest rozmiar tych segmentów?

2) Wiem, że Linux używa płaskiego modelu liniowego, tzn. Używa segmentacji w bardzo ograniczony sposób. Ponadto według „Understanding the Linux Kernel” autorstwa Daniela P. Boveta i Marco Cesatiego istnieją cztery główne segmenty: dane użytkownika, kod użytkownika, dane jądra i kod jądra w GDT. Wszystkie cztery segmenty mają ten sam rozmiar i adres bazowy. Nie rozumiem, dlaczego w czterech z nich jest potrzeba, jeśli różnią się tylko typem i prawami dostępu (wszystkie wytwarzają ten sam adres liniowy, prawda?). Dlaczego nie użyć tylko jednego z nich i zapisać jego deskryptor do wszystkich rejestrów segmentów?

3) W jaki sposób systemy operacyjne, które nie używają programów dzielenia segmentacji na segmenty logiczne? Na przykład, w jaki sposób odróżniają stos od kodu bez deskryptorów segmentów. Czytałem, że stronicowanie może być używane do obsługi takich rzeczy, ale nie rozumiem jak.

questionAnswers(3)

yourAnswerToTheQuestion