linux 进程 ldt,LInux 描述符GDT, IDT LDT结构定义
說(shuō)明:此博文是Kernel有關(guān)GDT,LDT以及LDT的相關(guān)源碼剖析,而對(duì)有關(guān)GDT,LDT以及IDT的詳細(xì)說(shuō)明以及原理講解都可以在Intel IA-32架構(gòu)手冊(cè)中查到!這里不再贅述,(手冊(cè)地址)
1、描述符(64bits)分類(lèi)
2、三者的關(guān)系
a、GDT,IDT都是全局的。LDT是局部的(在GDT中有它的描述符)
b、GDT用來(lái)存儲(chǔ)描述符(門(mén)或非門(mén));系統(tǒng)中幾個(gè)CPU,就有幾個(gè)GDT
struct gdt_page {
struct desc_struct gdt[GDT_ENTRIES];
} __attribute__((aligned(PAGE_SIZE)));
DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page);
c、IDT整個(gè)系統(tǒng)只有一個(gè)
d、系統(tǒng)啟動(dòng)時(shí)候需要初始化GDT和IDT。LDT和進(jìn)程相關(guān),并不一定必有
3、IA-32各種描述符的結(jié)構(gòu)
4、描述符結(jié)構(gòu)定義
struct desc_struct {
union {
struct {
unsigned int a;
unsigned int b;
};
struct {
u16 limit0;
u16 base0;
unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8;
};
};
} __attribute__((packed));
聯(lián)合體——對(duì)成員域訪問(wèn)和設(shè)置成為一種很優(yōu)美的方法。上面第一個(gè)匿名結(jié)構(gòu)體用來(lái)作為成員訪問(wèn)取值的出口,下面第二個(gè)結(jié)構(gòu)體對(duì)真實(shí)的成員設(shè)置值的入口。
字段(結(jié)合上面的圖示):
limit:段長(zhǎng)度
base:段的首字節(jié)的線性地址,有base0,base1,base2三部分構(gòu)成
type:段的類(lèi)型和存取權(quán)限
s:系統(tǒng)標(biāo)志。1-系統(tǒng)段;0-普通段
dpl:描述符特權(quán)級(jí)
p:segment-Present。linux下總是1
avl:linux不用
d:區(qū)分代碼段還是數(shù)據(jù)段
g:段大小粒度。以4K倍數(shù)計(jì)算
在32位機(jī)器上,這就是所有描述符的數(shù)據(jù)結(jié)構(gòu)嘍,沒(méi)有細(xì)分門(mén)和非門(mén)!
typedef struct desc_struct gate_desc;
typedef struct desc_struct ldt_desc;
typedef struct desc_struct tss_desc;
由于三類(lèi)描述符都是一個(gè)結(jié)構(gòu)類(lèi)型,從而一律使用下面宏初始化在GDT中表項(xiàng)
#define GDT_ENTRY_INIT(flags, base, limit) { { { \
.a = ((limit) & 0xffff) | (((base) & 0xffff) << 16), \
.b = (((base) & 0xff0000) >> 16) | (((flags) & 0xf0ff) << 8) | \
((limit) & 0xf0000) | ((base) & 0xff000000), \
} } }
但是在64位機(jī)器上,Linux則進(jìn)行了細(xì)致劃分:
16字節(jié)門(mén)描述符結(jié)構(gòu)
/* 16byte gate */
struct gate_struct64 {
u16 offset_low;
u16 segment;
unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
u16 offset_middle;
u32 offset_high;
u32 zero1;
} __attribute__((packed));
16字節(jié)LDT或TSS描述符結(jié)構(gòu)
/* LDT or TSS descriptor in the GDT. 16 bytes. */
struct ldttss_desc64 {
u16 limit0;
u16 base0;
unsigned base1 : 8, type : 5, dpl : 2, p : 1;
unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
u32 base3;
u32 zero1;
} __attribute__((packed));
typedef struct gate_struct64 gate_desc;
typedef struct ldttss_desc64 ldt_desc;
typedef struct ldttss_desc64 tss_desc;
從上面代碼看出無(wú)論是32位還是64位機(jī)器上,都使用typedef重新定義,以提供給系統(tǒng)其他使用此描述符的部分一致的類(lèi)型名
區(qū)分描述符的枚舉量
enum {
GATE_INTERRUPT = 0xE,
GATE_TRAP = 0xF,
GATE_CALL = 0xC,
GATE_TASK = 0x5,
};
enum {
DESC_TSS = 0x9,
DESC_LDT = 0x2,
DESCTYPE_S = 0x10, /* !system */
};
系統(tǒng)GDT,IDT指針描述結(jié)構(gòu)
struct desc_ptr {
unsigned short size;
unsigned long address;
} __attribute__((packed)) ;這個(gè)結(jié)構(gòu)記錄了系統(tǒng)的GDT或者IDT的大小以及在系統(tǒng)中的線性基地
Reference:
http://www.osdever.net/tutorials/pdf/descriptors.pdf。
總結(jié)
以上是生活随笔為你收集整理的linux 进程 ldt,LInux 描述符GDT, IDT LDT结构定义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: glassfish java环境_Cen
- 下一篇: python学习笔记——类与对象、常用函