一个关于保护模式LDT的问题,请高手指点!

liuyu790810 2008-12-06 10:29:45
情形:如果当前任务没有任何局部段,都是系统段,那么,当前的LDTR中的内容是0x0000,指向GDT的第一个空描述符(全0),对吗?

那么这个时候,比如我的段选择子为xxxx,其中TI为1,表示描述符在LDT中,偏移为yyyyyyyy,计算线性地址的流程如下:
1)根据LDTR中的内容(0x0000),找到LDT在GDT中的描述符,得到的结果还是全0,即LDT的基地址为0
2)根据xxxx中的高13位,找到LDT中对应的描述符zzzzzzzz,即地址0+xxxx
3)取出描述符zzzzzzzz中的基地址,加上偏移yyyyyyyy,得到最终的线性地址

但是,这个过程明显得到了个错误的地址,高手能告诉我哪里错了吗?
...全文
38 点赞 收藏 2
写回复
2 条回复
heeten 2009年01月05日
ding
回复 点赞
xdkui 2008年12月07日
LDTR和GDTR是并行的两个概念,LDTR指向LDT,GDTR指向GDT.
段寄存器CS,DS之类的TI位为0表示使用GDT, 为1使用LDT, 只能选择其一. 所以LDTR内容是0 和GDT的第一个项没有关系.
Linux内核里只使用GDT

对于你的例子,如果LDTR是0, 那么第一步就会出异常了
如果要用LDT,你得先用LLDT指令加载LDT
回复 点赞
发动态
发帖子
Linux_Kernel
创建于2007-08-27

3141

社区成员

1.7w+

社区内容

Linux/Unix社区 内核源代码研究区
社区公告
暂无公告