社区
Linux_Kernel
帖子详情
linux GDT、 LDT
xiaoshun123
2009-11-29 06:12:35
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。
可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
...全文
1611
9
打赏
收藏
linux GDT、 LDT
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。 由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。 这样的话,GDT与LDT是各自独立的。 可最近看论坛,发现一种说法: “LDT放在GDT中” 这是什么意思? 先谢谢,我怀疑之前理解有问题。充电。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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上内存管理
逻辑地址首先根据段选择符在
GDT
或
LDT
中找到对应的段描述符,得到段基址和段限,然后逻辑地址加上段基址得到线性地址。线性地址空间是进程实际使用的地址空间,尽管逻辑地址可以超过4GB,但线性地址仍限制在32位的4GB...
Linux
内存管理报告[收集].pdf
实验部分,通过Bochs模拟器,观察了
Linux
0.11版本的
GDT
和
LDT
表的内容。通过调试工具,查看了程序的逻辑地址、线性地址以及物理地址之间的转换。实验步骤中,首先编写了一个简单的C程序,输出局部变量的地址,并利用...
Linux
内存管理报告[定义].pdf
在实验中,通过Bochs模拟器可以观察到这个转换过程,以及
GDT
和
LDT
的内容,进而理解内存管理的具体实现。 实验步骤中,首先建立
Linux
实验环境,编写C程序并观察变量的逻辑地址。接着,通过Bochs的调试模式查看寄存器...
深入理解
Linux
内核笔记
Linux
几乎不使用
LDT
,因此所有
GDT
都指向一个默认的
LDT
。 分页技术是
Linux
内存管理的另一重要组成部分,它提供了虚拟内存的实现。硬件分页将线性地址(即逻辑地址)映射到物理地址,使得每个进程拥有自己的虚拟地址...
Linux
内核及0 号进程启动分析_徐晨升.pdf
7. **初始化
GDT
和
LDT
**:
GDT
和
LDT
定义了各个段的属性。 8. **内存管理初始化**:设置页表,启用分页机制。 9. **创建 0 号进程**:作为所有用户进程的父进程。 10. **启动 init 进程**:0 号进程负责启动第一...
Linux_Kernel
4,469
社区成员
17,459
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章