Imam pitanje u vezi intelove arhitekture IA-32 i korišćenja mogućnosti iste za različite memorijske modele.
Moram prvo kratko da objasnim kako ja to razumem, da bi eventualno mogli da vidite da li negde grešim u svojim pretpostavkama:
Koliko mi je poznato, windows (a mislim i linux) kerneli (windows NT i noviji) prave tzv. "flat memory model" što ukoliko razumem dobro znači da svi segment deskriptori (CS, DS, SS, ES...) "pokazuju" isti linearni adresni prostor što dalje omogućuje da recimo na stek ubacimo nekoliko op-kodova i zatim izvršimo takav kod. Microsoft na primer koristi tehniku "thunking" u kojoj dinamički pravi malu rutinu u dinamički alociranoj memoriji. Mislim da je mogućnost ovog "trika" posledica preklapanja DS i CS segment deskriptora. U njihovom slučaju to je zgodno, ali u vezi toga imam pitanje:
Zbog čega se u opšte korišćenim operativnim sistemima ne koristi ova, koliko mi se čini, prilično dobra platforma koju nudi intelova arhitektura (nudi je još od 386-tice)? Šta je razlog nekorišćenja ovog mehanizma, pretpostavljam da postoji neki dobar razlog koji ne vidim.
Ne razumem zbog čega se ne bi definisali deskriptori za CS, DS, SS svaki na različitoj baznoj adresi, i to tako da CS bude označen kao samo "executable", DS bude R/W, SS bude R/W, a ES da se preklapa sa DS. Eventualno može da se postavi još neki slog u LDT za konstante (za pravljenje "soft ROM-a"). Pretpostavljam da bi ovo unekoliko zakomplikovalo loader operativnog sistema, ali čini mi se da bi dobit bila velika u smislu pouzdanosti i sigurnosti. (alternativno bi CS mogao da bude R/X da bi mogle konstante da se smeste tamo). Sa odgovarajućim limitima, nikako ne bi mogao da se izvršava kod koji nije u CS što je u većini aplikacija poželjno.