Хм, разгледајући веб и тражећи понешто о страничењу, Гугл ме посла и на Елитсекјурити форуме. Тамо се расправља о разликама између сегментирања и страничења, или о врстама језгара оперативних система.
Оно што је мени занимљиво сада је да напоменем које су то разлике између сегментирања и страничења, бар на Интеловим процесорима, пошто о њима једино понешто и знам.
На првом месту, сегментирање је обавезно на Интеловим процесорима — оно се не може искључити, већ се једино може привидно заобићи тако што се направе сегменти за код, податке, стек исте величине, и са истим положајем.
Страничење, са друге стране, обезбеђује виртуелни адресни простор, и то је основни разлог зашто се оно чешће користи од сегментирања. Па, можда вас занима чему служи виртуелни адресни простор?
Виртуелни адресни простор своју примену најчешће има у обезбеђивању „размене/замене за меморију“ (на енглеском „swap“, што говори о техничком начину изведбе овога: страница у меморији се размењује са страницом уписаном на диску) помоћу неког јефтинијег уређаја, као што је диск. На неким системима ово зову и „виртуелна меморија“, али то се не слаже са општеприхваћеном употребом.
Ваља поменути и да странице на Интел процесорима новијим од Пентијума могу бити и 4МБ, чиме се обезбеђује знатно већи адресни простор, а у ограниченом пољу примена и већа брзина.
Сегментирање, са друге стране, је одличан механизам у који је уложено много више труда и напора при стварању Интел процесора. Једина, условно речено, „мана“ у односу на страничење је што не користи блокове утврђене величине, и самим тим је проналажење одговарајућег сегмента операција која се обавља у два корака (1. погледај где се налази тражени сегмент; 2. припреми тај сегмент за употребу — код страничења се положај странице имплицира њеном адресом [мада у пракси, и то захтева једно гледање у табелу], и она се може одмах „довући“).
Као и странице, и сегменти се могу користити за обезбеђивање „размене за меморију“, и то са много бољим учинком, зато што је један сегмент углавном посвећен једном процесу, и много је већа вероватноћа да ће баш подаци из њега требати ускоро (наравно, ово значи да је потребно уложити и много више труда у развој распоређивача процеса на вишепрограмским системима, и одредити оптималну политику избора сегмената за довлачење, њихов редослед, итд. пошто је једна грешка много скупља од погрешно довучене странице).
Оно што говори о супериорности сегмената у односу на странице је то што је могуће сегменте додељивати на произвољан начин, и то било као „глобалне“ (уписане у глобалну табелу описника, тј. GDT) или „локалне“ (за појединачни процес, дефинисан помоћу TSS-а, а ово се уписује у засебну табелу за сваки од таквих процеса: LDT).
И где је овде предност сегмената у односу на странице? Као прво, раздвајањем сваког дела оперативног система, корисничке спреге, и корисничких програма у засебне сегменте аутоматски повећава безбедност — нпр. драјвер (гонич :) не може да приступи осталим услугама језгра, или меморији других драјвера и програма (иначе, садашњи оперативни системи то решавају тако што користе друге могућности Интел процесора за заштиту, као што је „ниво рада“, где се нулти ниво резервише за језгро; ово, наравно, не чува друге програме до самог језгра). Ово је хардверски безуслован начин да се обезбеди заштита меморије.
А одговор на питање зашто се страничење ипак много више користи од сегментирања је веома једноставан и сигурно се може назрети и изнад: пристојну политику додељивања страница је много лакше направити од политике сегментирања која би донела значајна побољшања. А уз то, што се тиче безбедности, још увек преовладавају условни (а не безусловни) механизми забране приступа, и иако се са њима иде све даље — они су кривци за већину модерних проблема са програмима.
Са практичне стране, сегментирањем се може постићи исто што и страничењем, док обрнуто није случај. Када се користе заједно, може се рећи да је страничење „испод“ сегментирања, тј. сегменти су одређени у односу на виртуелни адресни простор постављен страничењем.
На несрећу, већина језгара је одлучила да поједностави што је више могуће основну спрегу са процесором, па тако имамо случај где нпр. у Линукс језгру није могуће омогућити процесу директан приступ У/И портовима већим од одређеног броја, зато што њихова битмапа није стала у једну меморијску страницу (тј. 4КБ, односно У/И портови преко 0x8000) заједно са TSS-ом (ово је било тачно бар до 2.2 серије, али сумњам да је ишта измењено од тада). На тај начин, софтвер намеће ограничења ради једноставности израде, иако хардвер нуди много више.
Жеља ми је да једног дана нађем више времена да о овоме размислим, и покушам можда да направим и прототип језгра које ће увелико користити сегментирање. Е па, зато и сва ова писанија — не желим да заборавим на све ово у потпуности :)