Дескрипторные таблицы: GDT, IDT, LDT
Content by: johnfine@erols.com
Есть 2 формата :
Гейт-дескриптор включает :
- Смещение
- Селектор
- Атрибуты
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
63............. 48 |
47..............32 |
31..............16 |
15...............0 |
Offset 31..............16 |
Attributes |
Selector |
Offset 15...............0 |
Негейтовый дескриптор включает :
- База
- Ограничение
- Атрибуты
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
63........56 |
55..52 |
51..48 |
47........40 |
39................................16 |
15.....................0 |
Base 31........24 |
Attr |
Limit 19..16 |
Attr |
Base 23.................................0 |
Limit 15.....................0 |
Т.о. дескрипторы имеют фрагментарную структуру - (для совместимости)
- База (base) - 32-битное значение , которое разбито на 2 части , первая часть лежит в битах 16-39 , вторая - в битах 56-63.
- Ограничение (limit) - 20-битное значение , разбито на 2 части , первая лежит в битах 0-15 , вторая - в битах 48-51 .
- смещение (offset) - 32-битное значение , разбито на 2 части , первая лежит в 0-15 , вторая - в 48-63.
- Селектор (selector) - 16-битное значение , лежит в битах 16-31.
- Атрибуты (attributes) - коллекция битов в диапазоне 32-47 либо 40-47 либо 52-55 of.
В отличие от базы,ограничения и смещения , биты атрибутов фиксированы к определенной позиции.
- Биты с 8 по 15 - дескрипторные биты с 40 по 47
- Биты с 0 по 7 для гейта - дескрипторные биты с 32 по 39
- Биты с 4 по 7 для не-гейта - дескрипторные биты с 52 по 55
- Биты с 0 по 3 для не-гейта не существуют - их у него всего 12
Descriptor byte |
6 |
5 |
4 |
Descriptor bits |
55..52 |
51..48 |
47..........40 |
39..........32 |
Gate Attribute bits |
|
15..........................0 |
nonGate Attribute bits |
7....4 |
|
15..........8 |
Это дает возможность обьединить все атрибуты в одно 16-битное значение
для передачи функции или макросу , которые строят дескрипторную таблицу.
Это также дает возможность определить символические константы для атрибутивных значений ,
которые могут быть скомбинированы независимо от их битового порядка расположения.
Descriptor bit number | 55 | 54 | 53 | 52 | | 47 | 46 | 45 | 44 | 43 | 42 | 41 | 40 |
39..37 | 36..32 |
Attribute bit number | 7 | 6 | 5 | 4 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
7....5 | 4....0 |
Gate |
Task Gate |
|
P r e s e n t |
D P L |
0 |
Z |
1 |
0 |
1 |
? |
Call Gate |
3 2 B i t |
0 |
Z |
count |
Interrupt Gate |
1 |
0 |
? |
Trap Gate |
1 |
nonGate |
TSS |
G r a n |
? |
Z |
A v a i l |
0 |
B |
1 |
LDT |
Z |
1 |
0 |
Code Segment |
B i g |
1 |
1 |
C |
R |
A c c |
Data Segment |
0 |
E |
W |
Биты , отмеченные как "Z", "?", "Avail" - недокументированы.
Эти биты должны быть обнулены.
Дескриптор в принципе может работать корректно , если какой-то из этих бит не обнулен.
Биты зарезервированы интелом.
Attribute бит 15, "Present" - должен быть установлен в 1, иначе фолт.
Его очистка может понадобиться при реализации виртуальной памяти.
Attribute биты 13 и 14, "dpl" - 2 бита на уровень привилегий.
Attribute бит 11 - для TSS. При возникновении прерывания этот бит решает , в какой стек сохраняются
регистры eip,cs,flags - в 16-битный или в 32-битный.
Attribute биты с 0 с 4 для call gate - parameter count.
Attribute бит 7 для nongate - бит гранулярности. Если бит=0 , размер страницы произволен.
Если бит установлен , размер страницы вычисляется по формуле :
limit = ( limit_field SHL 12 ) + 0xFFF
Attribute бит 9 для TSS, если бит установлен , TSS занят.
Attribute бит 6 для code или data segment, "big" - указывает на размер по умолчанию
В CS он контролирует размер операнда.
В SS он контролирует выбор sp или esp для push, pop.
Attribute бит 10 code segment, "C" - подтверждение code segments.
Attribute bit 10 data segment, "E" - расширение вниз - "expand down" для
data segments.
Attribute бит 9 в code segment, "R" - сегмент на выполнение или чтение.
Attribute бит 9 в data segment, "W" - сегмент может быть прочитан или записан , не execute.
Attribute бит 8 для code или data segment, "Acc" - сигнал о доступе к сегменту.
Следующий код включает константы и макросы для создания GDT, LDT, IDT .
Он помогает в создании читабельности кода , создающего дескрипторы.
; gdtn.inc symbols and macros for building descriptors
;
; This is an HTML version of a subset of my GDT.INC file.
; This GDTN.INC subset does not require my linker JLOC, it does require
; NASM version 0.98-J4 or later.
;
; You can find (nonHTML) GDTN.INC here and you can find other
; versions of GDT.INC in various .ZIP files at
; http://www.execpc.com/~geezer/johnfine/index.htm
; The versions that require JLOC support some features that the nonJLOC
; versions can't support.
;_____________________________________________________________________________
;
; The start_gdt macro marks the beginning of a GDT and uses the first 8 bytes
; of the GDT as a psuedo-descriptor for the LGDT instruction.
;_____________________________________________________________________________
;
; The end_gdt macro marks the end of a GDT and computes the limit value.
;_____________________________________________________________________________
;
; The desc macro pieces together a segment descriptor.
;
; SLCTR desc OFFSET, SELECTOR, ATTRIB ;For gate descriptors
; SLCTR desc BASE, LIMIT, ATTRIB ;For all other descriptors
;
; SLCTR (optional) is a label. Unlike an ordinary label, it will not be
; defined as the address of the descriptor. Instead it will be
; defined as the selector used to access the descriptor.
; OFFSET is the offset of the routine pointed to by a gate.
; SELECTOR is the selector of the routine pointed to by a gate.
; BASE is the full 32 bit base address of the segment
; LIMIT is one less than the segment length in 1 or 4K byte units
; ATTRIB the sum of all the "D_" equates which apply (for call gates, you
; also add the "parameter dword count" to ATTRIB).
;_____________________________________________________________________________
;Each descriptor should have exactly one of next 8 codes to define the type of
;descriptor (see attribute bit numbering)
D_LDT EQU 200h ;LDT segment
D_TASK EQU 500h ;Task gate
D_TSS EQU 900h ;TSS
D_CALL EQU 0C00h ;386 call gate
D_INT EQU 0E00h ;386 interrupt gate
D_TRAP EQU 0F00h ;386 trap gate
D_DATA EQU 1000h ;Data segment
D_CODE EQU 1800h ;Code segment
;Descriptors may include the following as appropriate:
D_DPL3 EQU 6000h ;DPL3 or mask for DPL
D_DPL2 EQU 4000h
D_DPL1 EQU 2000h
D_DPL0 EQU 0000h
D_PRESENT EQU 8000h ;Present
D_NOT_PRESENT EQU 8000h ;Not Present
;Note, the PRESENT bit is set by default
;Include NOT_PRESENT to turn it off
;Do not specify D_PRESENT
;Segment descriptors (not gates) may include:
D_ACC EQU 100h ;Accessed (Data or Code)
D_WRITE EQU 200h ;Writable (Data segments only)
D_READ EQU 200h ;Readable (Code segments only)
D_BUSY EQU 200h ;Busy (TSS only)
D_EXDOWN EQU 400h ;Expand down (Data segments only)
D_CONFORM EQU 400h ;Conforming (Code segments only)
D_BIG EQU 40h ;Default to 32 bit mode (USE32)
D_BIG_LIM EQU 80h ;Limit is in 4K units
%macro start_gdt 0
%push table
%$startoftable:
dw %$limitoftable
dd %$startoftable
dw 0
%endmacro
%macro end_gdt 0
%$limitoftable equ $-%$startoftable-1
%pop
%endmacro
%macro desc 3
%ifid %00
%00 equ $-%$startoftable ;Define selector
%endif
%if (%3) & (~(%3)>>2) & 0x400 ;Gate
dw %1
dw %2
dw (%3)+D_PRESENT
dw (%1) >> 16
%else ;Not a gate
dw %2
dw %1
db (%1) >> 16
db ((%3)+D_PRESENT) >> 8
db (%3) + ((%2) >> 16)
db (%1) >> 24
%endif
%endmacro
;-----------------------------------------------------------------------------
;
; A gate is identified as any descriptor whose attributes has bit 10 set and
; bit 12 clear.
;
; For a gate, the following rearrangement occurs:
;
; subField Final location
; ------------------ --------------
; Selector[0..15] 16..31
; Minor attribute bits 32..39
; Major attribute bits 40..47
; Offset[0..15] 0..15
; Offset[16..31] 48..63
;
; For non-gates the following rearrangement occurs:
;
; subField Final location
; ------------------ --------------
; Limit[0..15] 0..15
; Limit[16..19] 48..51
; Minor attribute bits 52..55
; Major attribute bits 40..47
; Base[0..23] 16..39
; Base[24..31] 56..63
;
; The last parameter to the desc macro contains all the attribute bits
; combined. It is generated by adding together the appropriate
; D_ constants. For all descriptors, it has the major attribute bits in D_
; bits 8 to 15. The minor attribute bits are in either D_ bits 0 to 7 or
; bits 4 to 7 depending on the type of descriptor.
;_____________________________________________________________________________
Процессор не использует первые 8 байт GDT.
Эти байты например можно использовать как псевдо-дескриптор для LGDT.
Адрес псевдо-дескриптора - это тот же самый адрес самой GDT.
|