linux GDT、 LDT

xiaoshun123 2009-11-29 06:12:35
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。

可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
...全文
1579 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zaicizhibu 2011-11-11
  • 打赏
  • 举报
回复
我的理解是:
GDTR是一个48位的全局描述符寄存器,高32位存放GDT的基址,低16位存放GDT限长。
LDTR是一个16位的局部描述符寄存器,高13位存放LDT在GDT中的索引值。
GDT中包含着段描述符0,段描述符1,段描述2。。。和LDT1描述符,LDT2描述符。。。这些所占空间大小相同。

若逻辑地址a:b,根据逻辑地址的a(段选择符)的T1位确定是选择GDT还是LDT。
1)若是T1选择GDT,根据GDTR找到GDT的基址,根据a的3~15位确定GDT的相对位置,基址+相对位置:确定段描述符X,再根据段描述符提取出其中包含的段基址信息,段基址+b(段内偏移):确定线性地址。
2)若是T1选择LDT,根据GDTR找到GDT的基址,根据LDTR的高13位找到GDT的相对位置,基址+相对位置:确定LDTX描述符。LDT描述符可以确定LDT的基址(LDT描述符确定LDT表在内存中的起始位置),再根据段选择符确定的相对位置,可以确定LDT中的私有段描述符Y。接下来同上面的:再根据段描述符提取出其中包含的段基址信息,段基址+b(段内偏移):确定线性地址。

GDT中包含的段描述符X和LDT中包含的私有段描述符Y,所占空间相同。
GDT中包含的段描述符X和GDT中包含的LDT描述符,所占用空间相同。

结论是:LDT不包含在GDT中。GDT中只是包含了LDT描述符(一个指向LDT起始地址的指针)。


xiaoshun123 2009-12-02
  • 打赏
  • 举报
回复
gdtr中存放着gdt表的物理地址信息。
gdt表中存放着各个进程的ldt表的位置信息。
ldtr中存放着当前进程ldt表在gdt中的索引信息。
ldt表实际上在自己所属进程的task_struct里。


例如在用户态当前进程要访问一个数据(ds : 偏移量)
寻找物理地址的过程:
要根据段选择符ds,查询ldt表
根据ldtr中的偏移量去gdt表中寻找一个表项(gdt表是根据gdtr找到的,gdtr中存着物理地址)
该表项记录了ldt表所在的物理地址。
找到以后就能查出真正的数据段基地址,然后加上偏移量就是线性地址了。


以上
引自old linux网友
qb_2008 2009-12-02
  • 打赏
  • 举报
回复
附楼上,这属于intel386的分段机制,LDT也是一个需要在GDT中用描述符指向的段.所以先用LDTR在GDT中找到这个LDT段,再在这个段中找选择子对应的局部描述符
小魔菇 2009-11-30
  • 打赏
  • 举报
回复
LDT是放在GDT中的
当选择字的T1位=1 表明取的是LDT
那么还是要先从GDTR中取出GDT中的基地址,然后从LDTR中获取LDT所在段的位置索引(即在GDT中的索引),然后再获取LDT段中的段描述符,得到段的基地址后,再加上偏移地址就可以得到最后的线性地址了
arczee 2009-11-30
  • 打赏
  • 举报
回复
  GDT是每个CPU都有一个拷贝,用GDTR保存, 而每个进程或有LDT或没有,但Linux内核一般不使用LDT,它在GDT中设一个LDT表项来指向为所有进程共享的LDT,具体用途没有研究。
  如果用户级进程自己需要LDT可以自己申请,即得到自定义的LDT,同时执行这个进程的CPU的GDT拷贝中的LDT项就会改变为这个进程自定义的LDT。这样说不知道对不对
naruto__ 2009-11-29
  • 打赏
  • 举报
回复
谢过,我自己再仔细研究研究看看
xiaoshun123 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoshun123 的回复:]
谢过,我自己再仔细研究研究看看。
[/Quote]
能不能给个通俗易懂的讲解?
xiaoshun123 2009-11-29
  • 打赏
  • 举报
回复
谢过,我自己再仔细研究研究看看。
刘军卫 2009-11-29
  • 打赏
  • 举报
回复
你可以去看一下<深入理解linux内核>,这本书,里面讲的很清楚, LDT是GDT表里的一项。就是所有的进程共用一个LDT,在linux内核2.4版本之前都是每一个进程一个LDT的,这完全是没有必要的,因为linux没有采用intel设计的任务切换机制。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧