社区
Linux_Kernel
帖子详情
linux GDT、 LDT
xiaoshun123
2009-11-29 06:12:35
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。
可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
...全文
1579
9
打赏
收藏
linux GDT、 LDT
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。 由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。 这样的话,GDT与LDT是各自独立的。 可最近看论坛,发现一种说法: “LDT放在GDT中” 这是什么意思? 先谢谢,我怀疑之前理解有问题。充电。
复制链接
扫一扫
分享
转发到动态
举报
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设计的任务切换机制。
Linux
在x86上内存管理
Linux
操作系统当前主要在Intel 80386、80486和Petium系列机器上运行,它们统称为x86机器。x86具有两种存储器管理模式:实地址模式和受保护的虚地址模式,后者简称保护模式。
Linux
内存管理报告[收集].pdf
Linux
内存管理报告[收集].pdf
Linux
内存管理报告[定义].pdf
Linux
内存管理报告[定义].pdf
深入理解
Linux
内核笔记
学生时代的读书笔记整理,希望对新手学习有所帮。欢饮转载,非喜勿喷。
Linux
内核及0 号进程启动分析_徐晨升.pdf
Linux
内核及0 号进程启动分析_徐晨升.pdf
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章