免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3064 | 回复: 2
打印 上一主题 下一主题

[内核入门] 请教GDTR、LDTR寄存器 [复制链接]

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-04 21:37 |只看该作者 |倒序浏览
最近刚开始学习《LINUX内核源代码情景分析》这本书,刚看几页就犯迷糊了,主要是第8页有2句话我捉摸不明白,钻到牛角尖去了,所以请大牛们指教:
第一句话:虽然段描述结构存储在内存中,在实际使用时却将其装载入CPU中的一组“影子”结构,而CPU在运行时则使用其在CPU中的“影子”。
   不明白词语:装载入、“影子”
   “装载入”指的是将段描述结构在内存的位置写到GDTR或LDTR吗,而“影子”也就是指GDTR或LDTR吗?
第二句话:GDTR或LDTR中的段描述表指针和段寄存器中给出的下标结合在一起,才决定了具体的段描述表项在内存中的什么方,... 。因此就无法通过修改描述表项的内容来玩弄诡计,从而起到保护作用。
   不明白词语:因此就无法
   “因此”到底是因什么,是因为访问GDTR或LDTR必须是“特权指令”吗,也就是说一个普通进程无法知道GDTR或LDTR的值,也就不知道段描述表项在哪,也就无法像实地址模式那样通过修改段基地址,而访问到其它进程的空间,这是样吗?但我有个疑问,可能在大牛看来很无知,就是GDTR或LDTR的值能不能计算出来?因为"GDTR/LDTR+段寄存器->最终的基址",而段寄存器普通进程应该是可以访问的吧,最终的基址及其他一些信息,大概也能确定段描述表项在什么位置,那这样是不是可以反推出GDTR/LDTR的值,也就是说描述表的位置知道了,那么改一下某个段描述表项的B31-B24、B23-B16、B15-B0字段内容,当段寄存器的值正好找到这个表项时,是不是就可能访问到别的进程空间了?

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
2 [报告]
发表于 2014-05-04 22:19 |只看该作者
关于第一句话的解释,已经找到一个回答:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1933037
其实在第10而也有这个回答:每当一个段寄存器的内容改变时,CPU就把由这段寄存器的新内容所决定的段描述项装入CPU内部的一个“影子”描述项。这样,CPU中有几个段寄存器就有几个影子描述项,所以也可以看作是对段寄存器的扩充。扩充后的段寄存器分成两部分,一部分是可见的(对程序而言),还与原先的段寄存器一样;另一部分是不可见的,就是用来存放影子描述项的空间,这一部分是供CPU内部使用的。

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
3 [报告]
发表于 2014-05-04 22:30 |只看该作者
第二句话可以在第11页得到确定:前面已经提到过特权指令的设置,如用来装入和存储GDTR和LDTR的指令LDTR/LLDT和SGDT/SLDT等就是特权指令。正是由于这些指令都只能在系统状态(也就是在操作系统的内核中)使用,才使得用户程序不但不能改变GDTR和LDTR的内容,还因为既无法确知其段描述表在内中的位置,又无法访问其段描述表所在的空间(只能在系统状态下才能访问),从而无法通过修改段描述项来打破系统的保护机制。

并且引出下一个话题:怎么区分和切换系统状态和用户状态。
还剩一个疑问:就是GDTR/LDTR存储的值可不可能被专门的程序反推计算出来?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP