[ 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ň