[ etoxiuq @ 25.07.2007. 02:35 ] @
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.
[ etoxiuq @ 27.07.2007. 16:13 ] @
Evo da mi odgovorim :-)

U razgovoru sa ljudima koji su eksperti u ovoj oblasti, ovo je otprilike odgovor:

Iako bi u ovoj "mojoj" segmentnoj-zasticenoj varijanti verovatno dobili neki stepen zastite, prakticno se isti efekat dobija na sledeci (uobicajen) nacin:

memorija se predstavlja u "ravnom" (flat memory model), u sve segment deskriptore se stavi bazna adresa 0 i limit 4Gb. Odredjivanje prava pristupa (zastita) se implementira na nivou "paging". "Paging" (ne znam kako bih ovo preveo: stranicenje?) je drugi stepen indirekcije koju rade intelovi procesori i moze da se koristi za implementaciju virtuelne memorije i zastite: na nivou stranica memorije (page) se oznaci da li je data stranica kod, podaci, da li moze da se cita/pise/izvrsava.


I jos, ova "moja" varijanta bi unela jako mnogo komplikacija na nivou kompajlera/linkera i operativnog sistema jer adresni prostor vise ne bi bio linearan (32-bitni ofset ne bi bio dovoljan da jednoznacno odredi lokaciju, nego bi morali da koristimo i segment selektore).