Citat:
... kad bi npr. kernel bio u ringu 0, driveri u ringu 1, standardni sistemski libraryji (libc, libm i slicno) u ringu 2 te user aplikacije u ringu 3...
Ma koja 4 prstena covjece, i 2 su previse :) ring3->ring2->ring1->ring0 prelaz je moguc ofkors, samo bi bio *iznimno* zahtjevan u terminima procesorskih ciklusa. OS koji bi takve prstenove zastite implementirao bi morao leeetjeti na nekom super-hardveru, jer x86 nije ring-friendly u tome smislu...
Pogledaj samo kroz povijest: win32 podrzava samo 2 prstena iz jednostavnog razloga sto su, dok je jos projekt NT kernela bio u punom zamahu ranih 90-ih, bile podrzane i platforme koje su implementirale samo 2 prstena, npr. Compaq Alpha i Silicon Graphics MIPS. Danas se naravno windoze vrte iskljucivo na x86, ali tko je onda jos mislio na to da ce jednog dana sigurnost OS-a po prioritetu (uzokovanog ponajvise direktnim financijskim gubicima :) zauzimati mjesto ispred portabilnosti.
Npr. GDI i USER, dakle window manager i graficki servisi su bili dio user-mode win32 subsystema do NT 4.0, nakon cega su prebaceni u kernel-mode. Razlog? Grafika je bila sugava unatoc dobrom izvornom dizajnu. Svatko tko je sa par godina rada na win9x presao na winXP ce biti jasno o cemu govorim. Osim toga, jos se koristi "batching", tj. buffering GDI API-ja unutar user-modea, jer je transakcija u kernel-mode za svaki API jednostavno neucinkovita.
Ovo je nesto slicno kao sto libc implementira I/O buffering, umjesto da za svaki bajt poziva read/write, poziva ga za znatno vece jedinice podataka pri cemu se stedi procesorsko vrijeme. Od XP-a se koriste 2-bajtni mnemonici sysneter/sysexit koji su optimiziranija verzija tradicionalnog "trap gate" mehanizma (win9x cesto koristi i call gate u obliku VxdCall). Sjeca li se jos itko int 2eh? :) To sto je intel izmislio ove instrukcije (AMD ima druge, ne da mi se sad traziti tocan naziv, osim toga, AMD sux :) i sto se savrseno poklapaju sa ring3/ring0 zahtjevima selektora koje ima NT je druga wintel (win-intel) prica... koincidencija my arse.
Moj fejvorit slackware trosi zasad samo int 80h :( Nadalje, sa dolaskom winFX kao buduceg subsystema koji ce zamijeniti win32, vecina API-ja postaju wrapperi za svoje kernel-mode ekvivalente, jednostavno implementiraju minimalan error-checking i pozivaju Nt* rutine. Uostalom mozes vidjeti u izvornom kodu :) Toliko sto se tice OS-a koji bi mozda najvise beneficirao od takvih mjera sigurnosti :)
Ne mogu odoljeti a da ne parafraziram Tolkiena: One ring to rule them all, one ring to bind them, one ring to bring them all and in buffer overflows bind them....mwhahahaha