请教GDTR、LDTR寄存器
最近刚开始学习《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字段内容,当段寄存器的值正好找到这个表项时,是不是就可能访问到别的进程空间了? 关于第一句话的解释,已经找到一个回答:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1933037
其实在第10而也有这个回答:每当一个段寄存器的内容改变时,CPU就把由这段寄存器的新内容所决定的段描述项装入CPU内部的一个“影子”描述项。这样,CPU中有几个段寄存器就有几个影子描述项,所以也可以看作是对段寄存器的扩充。扩充后的段寄存器分成两部分,一部分是可见的(对程序而言),还与原先的段寄存器一样;另一部分是不可见的,就是用来存放影子描述项的空间,这一部分是供CPU内部使用的。 第二句话可以在第11页得到确定:前面已经提到过特权指令的设置,如用来装入和存储GDTR和LDTR的指令LDTR/LLDT和SGDT/SLDT等就是特权指令。正是由于这些指令都只能在系统状态(也就是在操作系统的内核中)使用,才使得用户程序不但不能改变GDTR和LDTR的内容,还因为既无法确知其段描述表在内中的位置,又无法访问其段描述表所在的空间(只能在系统状态下才能访问),从而无法通过修改段描述项来打破系统的保护机制。
并且引出下一个话题:怎么区分和切换系统状态和用户状态。
还剩一个疑问:就是GDTR/LDTR存储的值可不可能被专门的程序反推计算出来?
页:
[1]