最近在阅读Linux内存管理时,突然对GDT(Glocal Descriptor Table)和LDT(Local Descriptor Table)产生了一些疑问。他们在内存是怎样存放的呢?程序在运行时又是如何对GDT和LDT产生了影响?
以下配图均来自《Linux内核完全注释(1.9.5版)》,所有的内容也都是基于Linux内核0.11版。其他Linux版本则需查看相应的代码进行分析
在Linux内核0.11中,对GDT和LDT的声明和配置如下:
从上图可以看到LDTR指向的是GDT中的一部分,确切的说是指向了GDT的第五个描述符,而从这个描述符开始,包含了LDT。
从相应的内核代码中,我们看到在task_struct的声明中,有如下内容:
struct task_struct {
...
struct desc_struct ldt[3];
struct tss_struct tss;
};
这说明ldt是和每个task有关。每当需要创建新的process时,就需要在内存中把一块相应的区域划分给这个process的LDT:
int copy_process(int nr, ...)
{
struct task_struct *p;
p=(struct task_struc