<?xml version="1.0" encoding="UTF-8"?>
<!-- name="generator" content="pyblosxom/1.4.1 7/27/2007" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
<channel>
<title>Блогчетање 30 Jan 2004</title>
<link>https://danilo.segan.org/blog</link>
<description>Данилово блогче</description>
<language>en</language>
<item>
  <title>Архитектура меморијског подсистема на x86 процесорима</title>
  <link>https://danilo.segan.org/blog/os/arhitektura-memorijskog-podsistema-na-x86-procesorima</link>
  <description><![CDATA[
<p>Хм, разгледајући веб и тражећи понешто о страничењу, Гугл ме посла и на <a href="http://www.elitesecurity.org">Елитсекјурити</a> форуме. Тамо се расправља о разликама између <a href="http://www.elitesecurity.org/tema/38600">сегментирања и страничења</a>, или о <a href="http://www.elitesecurity.org/tema/39355">врстама језгара оперативних система</a>.</p><p>
Оно што је мени занимљиво сада је да напоменем које су то разлике између сегментирања и страничења, бар на Интеловим процесорима, пошто о њима једино понешто и знам.</p><p>
На првом месту, сегментирање је <strong>обавезно</strong> на Интеловим процесорима — оно се не може искључити, већ се једино може привидно заобићи тако што се направе сегменти за код, податке, стек исте величине, и са истим положајем.</p><p>
Страничење, са друге стране, обезбеђује <em>виртуелни адресни простор</em>, и то је основни разлог зашто се оно чешће користи од сегментирања. Па, можда вас занима чему служи виртуелни адресни простор?</p><p>
Виртуелни адресни простор своју примену најчешће има у обезбеђивању „размене/замене за меморију“ (на енглеском „swap“, што говори о техничком начину изведбе овога: страница у меморији се размењује са страницом уписаном на диску) помоћу неког јефтинијег уређаја, као што је диск. На неким системима ово зову и „виртуелна меморија“, али то се не слаже са општеприхваћеном употребом.</p><p>
Ваља поменути и да странице на Интел процесорима новијим од Пентијума могу бити и 4МБ, чиме се обезбеђује знатно већи адресни простор, а у ограниченом пољу примена и већа брзина.</p><p>
Сегментирање, са друге стране, је одличан механизам у који је уложено много више труда и напора при стварању Интел процесора. Једина, условно речено, „мана“ у односу на страничење је што не користи блокове утврђене величине, и самим тим је проналажење одговарајућег сегмента операција која се обавља у два корака (1. погледај где се налази тражени сегмент; 2. припреми тај сегмент за употребу — код страничења се положај странице имплицира њеном адресом [мада у пракси, и то захтева једно гледање у табелу], и она се може одмах „довући“).</p><p>
Као и странице, и сегменти се могу користити за обезбеђивање „размене за меморију“, и то са много бољим учинком, зато што је један сегмент углавном посвећен једном процесу, и много је већа вероватноћа да ће баш подаци из њега требати ускоро (наравно, ово значи да је потребно уложити и много више труда у развој распоређивача процеса на вишепрограмским системима, и одредити оптималну политику избора сегмената за довлачење, њихов редослед, итд. пошто је једна грешка много скупља од погрешно довучене странице).</p><p>
Оно што говори о супериорности сегмената у односу на странице је то што је могуће сегменте додељивати на произвољан начин, и то било као „глобалне“ (уписане у глобалну табелу описника, тј. GDT) или „локалне“ (за појединачни процес, дефинисан помоћу TSS-а, а ово се уписује у засебну табелу за сваки од таквих процеса: LDT).</p><p>
И где је овде предност сегмената у односу на странице? Као прво, раздвајањем сваког дела оперативног система, корисничке спреге, и корисничких програма у засебне сегменте аутоматски повећава безбедност — нпр. драјвер (гонич :) не може да приступи осталим услугама језгра, или меморији других драјвера и програма (иначе, садашњи оперативни системи то решавају тако што користе друге могућности Интел процесора за заштиту, као што је „ниво рада“, где се нулти ниво резервише за језгро; ово, наравно, не чува друге програме до самог језгра). Ово је хардверски безуслован начин да се обезбеди заштита меморије.</p><p>
А одговор на питање зашто се страничење ипак много више користи од сегментирања је веома једноставан и сигурно се може назрети и изнад: пристојну политику додељивања страница је много лакше направити од политике сегментирања која би донела значајна побољшања. А уз то, што се тиче безбедности, још увек преовладавају условни (а не безусловни) механизми забране приступа, и иако се са њима иде све даље — они су кривци за већину модерних проблема са програмима.</p><p>
Са практичне стране, сегментирањем се може постићи исто што и страничењем, док обрнуто није случај. Када се користе заједно, може се рећи да је страничење „испод“ сегментирања, тј. сегменти су одређени у односу на виртуелни адресни простор постављен страничењем.</p><p>
На несрећу, већина језгара је одлучила да поједностави што је више могуће основну спрегу са процесором, па тако имамо случај где нпр. у Линукс језгру није могуће омогућити процесу директан приступ У/И портовима већим од одређеног броја, зато што њихова битмапа није стала у једну меморијску страницу (тј. 4КБ, односно У/И портови преко 0x8000) заједно са TSS-ом (ово је било тачно бар до 2.2 серије, али сумњам да је ишта измењено од тада). На тај начин, софтвер намеће ограничења ради једноставности израде, иако хардвер нуди много више.</p><p>
Жеља ми је да једног дана нађем више времена да о овоме размислим, и покушам можда да направим и прототип језгра које ће увелико користити сегментирање. Е па, зато и сва ова писанија — не желим да заборавим на све ово у потпуности :)</p>
]]></description>
</item>

</channel>
</rss>
