[ DESKRIPTOR SEGMENTU ] Tak tady se nachází takové povídání o deskriptorech. Jazyková lekce z angličtiny - co je to DESCRIPTion? Ano, správně, je to POPIS. A to je vlastně význam deskriptorů - popisují určitou oblast paměti... Popisují segmenty. Když jsem říkal, že neexistují segmenty, jaké je znáte, měl jsem na mysli tohle. Něco jako segment tu je, ale může to začínat kdekoliv a může to mít délku jinou než 64 kB. A tyhle všechny informace jsou nacpány v deskriptoru. Teď jde jenom o to, jak... Deskriptor je osmibajtová datová struktura. Existují tyto typy deskriptorů: - segmentové deskriptory - tyto deskriptory definují velikost a umístění datového nebo kódového segmentu v paměti. Existují dva druhy - Code Segment Descriptor a Data Segment Descriptor. - deskriptory systémových datových segmentů - tyto deskriptory definují velikost a umístění systémových datových struktur používaných pro řízení multitaskingu. Existují dva druhy - Task State Segment Descriptor a Local Descriptor Table Descriptor. - deskriptory předávání řízení - tyto deskriptory definují mechanismy předávání řízení mezi code segmenty a úlohami a vstupní body procedur. Existují čtyři druhy - Call Gate, Task Gate, Interrupt Gate a Trap Gate. Nakreslená struktura deskriptoru segmentu vypadá asi takhle: +-15--14--13--12--11--10--9---8-+-7-+-6-+-5-+-4-+-3---2---1---0-+ 7 | BASE (bity 31-24) | G | D | 0 | U | LIMIT (19-16) | 6 +---+-------+---+---+---+---+---+---+---+---+---+---------------+ 5 | P | DPL | S | E |D/W|C/R| A | BASE (bity 23-16) | 4 +---+-------+---+---+---+---+---+-------------------------------+ 3 | BASE (bity 15-0) | 2 +---------------------------------------------------------------+ 1 | LIMIT (bity 15-0) | 0 +---------------------------------------------------------------+ BASE Bázová adresa segmentu (na které adrese bude vlastně 'segment' začínat) LIMIT Velikost segmentu (doporučuju okamžitě kouknout na bit G - Granular!!) [Velikosti bázové adresy a limitu (velikosti) segmentu jsou popsány trochu dál v tomhle článku] -------------------------------------------------------------------- Bit Jméno Popis -------------------------------------------------------------------- G Granular 0 - velikost segmentu je rovna poli LIMIT. 1 - velikost segmentu je rovna LIMIT * 4096 D Default 0 - segment je 16bitový 1 - segment je 32bitový U User Volné pro libovolné použití -------------------------------------------------------------------- P Present 0 - segment určený deskriptorem není ve fyzické paměti. 1 - segment je ve fyzické paměti určen poli BASE a LIMIT. DPL Descriptor Úroveň privilegií nutná k jakékoli operaci se Privilege segmentem popsaným v deskriptoru (0-3). Označuje Level se DPL. S Segment 0 - deskriptor nepopisuje segment paměti Descriptor 1 - deskriptor popisuje code nebo data segment -------------------------------------------------------------------- (Pouze pro deskriptor datového segmentu) E Executable 0 - deskriptor popisuje data segment D Expansion 0 - segment roste nahoru (data), offset ≤ limit Direction 1 - segment roste dolů (stack), offset > limit W Writeable 0 - do segmentu nelze zapisovat 1 - do segmentu je možné zapisovat -------------------------------------------------------------------- (Pouze pro deskriptor kódového segmentu) E Executable 1 - deskriptor popisuje code segment C Conforming 0 - do kódu lze skočit jen s privilegii DPL 1 - do kódu lze skočit s privilegii nejméně DPL R Readable 0 - ze segmentu nelze číst 1 - ze segmentu je možné číst -------------------------------------------------------------------- A Accessed 0 - se segmentem nebylo operováno 1 - selektor segmentu byl použit ---------------------------------------------------------------------- výheň