当前位置: 技术问答>linux和unix
linux GDT、 LDT
来源: 互联网 发布时间:2017-01-15
本文导语: 我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。 由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。 这样的话,GDT与LDT是各自独立的。 可最近看论坛,发现一种说法: “LDT放在GDT中” 这是什么意思? 先谢谢,我...
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。
可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。
可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
|
你可以去看一下,这本书,里面讲的很清楚, LDT是GDT表里的一项。就是所有的进程共用一个LDT,在linux内核2.4版本之前都是每一个进程一个LDT的,这完全是没有必要的,因为linux没有采用intel设计的任务切换机制。
|
谢过,我自己再仔细研究研究看看
|
GDT是每个CPU都有一个拷贝,用GDTR保存, 而每个进程或有LDT或没有,但Linux内核一般不使用LDT,它在GDT中设一个LDT表项来指向为所有进程共享的LDT,具体用途没有研究。
如果用户级进程自己需要LDT可以自己申请,即得到自定义的LDT,同时执行这个进程的CPU的GDT拷贝中的LDT项就会改变为这个进程自定义的LDT。这样说不知道对不对
如果用户级进程自己需要LDT可以自己申请,即得到自定义的LDT,同时执行这个进程的CPU的GDT拷贝中的LDT项就会改变为这个进程自定义的LDT。这样说不知道对不对
|
LDT是放在GDT中的
当选择字的T1位=1 表明取的是LDT
那么还是要先从GDTR中取出GDT中的基地址,然后从LDTR中获取LDT所在段的位置索引(即在GDT中的索引),然后再获取LDT段中的段描述符,得到段的基地址后,再加上偏移地址就可以得到最后的线性地址了
当选择字的T1位=1 表明取的是LDT
那么还是要先从GDTR中取出GDT中的基地址,然后从LDTR中获取LDT所在段的位置索引(即在GDT中的索引),然后再获取LDT段中的段描述符,得到段的基地址后,再加上偏移地址就可以得到最后的线性地址了
|
附楼上,这属于intel386的分段机制,LDT也是一个需要在GDT中用描述符指向的段.所以先用LDTR在GDT中找到这个LDT段,再在这个段中找选择子对应的局部描述符