社区
Linux_Kernel
帖子详情
linux GDT、 LDT
xiaoshun123
2009-11-29 06:12:35
我一直以为,GDT用GDTR来引导,LDT用LDTR来引导。
由ES选择子中的某一位来决定是用LDTR还是GDTR来引导。
这样的话,GDT与LDT是各自独立的。
可最近看论坛,发现一种说法:
“LDT放在GDT中”
这是什么意思?
先谢谢,我怀疑之前理解有问题。充电。
...全文
1714
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
内存管理(二)之
GDT
与
LDT
在
Linux
系统中,
GDT
()和
LDT
()是用来管理和定义内存段(segment)的数据结构。它们是在 x86 架构下操作系统使用的关键概念,用于实现内存保护和虚拟内存管理。全局描述符表(
GDT
在单处理器系统中只有一个
GDT
,而在多处理器系统中每个 CPU 对应一个
GDT
。
GDT
可以放置在内存的任何位置。当程序员通过段寄存器引用一个段描述符时,CPU 必须知道
GDT
的入口地址,即基地址放在何处。为此,Intel 的设计者提供了一个
GDT
R 寄存器,用于存放
GDT
的基地址。
Linux
之
GDT
和
LDT
GDT
是一个全局的描述符表,它存储了系统中所有段的描述符,包括操作系统本身使用的段以及所有进程共享的段。
GDT
在系统启动时被初始化,并且在整个系统运行期间保持不变。它提供了系统范围内的内存段信息,是系统进行内存管理和段访问的重要依据。
LDT
是每个进程私有的描述符表,它包含了该进程所使用的私有段的描述符。每个进程都有自己独立的
LDT
,当进程切换时,系统会切换到相应进程的
LDT
,以确保每个进程只能访问自己的私有段,从而实现进程之间的内存隔离和保护。
Linux
中的分段,
GDT
,
LDT
②任务状态段(TSS),每个处理器一个,每个TSS的线性地址空间都是内核数据段相应一个线性空间的一个子集,所有的任务状态段都顺序的存放在init_tss数组,第n个cpu的TSS描述符的Base字段指向init_tss数组,G=0,Limit=0xeb(236字节),Type=9或11,(进程能否在CPU下运行),DPL=0,不允许用户态下的进程访问TSS段。所有的段都从0x00开始,得到的结论是,
Linux
下逻辑地址与线性地址是一致的,即逻辑地址的偏移量字段的值与相应的线性地址的值总是一致的。
linux
内核
gdt
,第三天:
Linux
内核完全剖析之
GDT
+
LDT
+IDT
GDT
R: 保存全局描述符表的32位基址和16位表长度值IDTR:中断描述符表的32位线性基址和16位表长度值
lDT
R:由两部分组成,当使用L
LDT
把含有
LDT
表段的选择符加载到
LDT
R时,
LDT
的段描述符的段基址,段限长,以及描述符属性也会被加载到
LDT
R中。当进行任务切换时,处理器会把新任务
LDT
的段选择符合和段描述符会被自动加载到
LDT
R
GDT
和
LDT
关系:系统中所有任务共享的段由
GDT
来映...
LInux
描述符
GDT
, IDT &
LDT
结构定义
说明:此博文分析Kernel有关
GDT
,
LDT
以及
LDT
的相关源码剖析,而对有关
GDT
,
LDT
以及IDT的详细说明以及原理讲解都可以在Intel IA-32架构手册中查到!这里不再赘述,(手册地址) 1、描述符(64bits)分类 2、三者的关系 a、
GDT
,IDT都是全局的。
LDT
是局部的(在
GDT
中有它的描述符) b、
GDT
用来存储描述符(门或非门);系统中几个CPU,就有几个
Linux_Kernel
4,469
社区成员
17,458
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章