一个关于保护模式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,得到最终的线性地址

但是,这个过程明显得到了个错误的地址,高手能告诉我哪里错了吗?
...全文
64 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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

4,441

社区成员

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

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