花个2个月的闲暇时间学习了保护模式,除了V8086,其它都学完了,感觉收获了很多,今天又从头开始看
,打算完整的梳理一遍,期间遇到了一些疑惑,我会一一给出,忘各位高手予以指教 ^_^
今天我有3个问题:
1。在不启用分页机制的情况下,如果实现任务之前的保护?杨季文《80x86》中有这么一段:通过把每个
任务放置在不同的虚拟地址空间中的方法来实现任务与任务之间的隔离,达到应用程序之间保护的目的。
虚拟地址到物理地址的映射函数在每个任务中进行定义,随着任务的切换,映射函数也切换。任务A的虚拟
地址空间映射到物理地址空间的某个区域。任务B的虚拟地址空间映射到物理地址空间的另外区域,彼此独
立,互不相干。
我的疑惑是,任务TSS段中并没有地方来定义映射函数,唯一能挂上钩的就是LDT,难道可以这样理解:段
描述符就可以看作是虚拟地址空间到物理地址空间的转换“函数”?但如果任务A中定义了一个段基地址为
X,任务B中也定义了一个段,基地址也为X,那么在未启用分页机制下,X都是物理地址空间中的地址X,那
么这样保护就无从谈起。所以上面那段话的意思是不是说:如果想要在分段机制下实现多任务,那么对于
每个任务私有的段的段描述符中定义的段基址和段界限不能相互重叠???
2。在向低扩展的段内,有效偏移为何是从limit+1 ~ MAX-1,而不是limit ~ MAX-1,如果基地址为0,界
限为0(此时对于向低扩展的段,达到最大段值),那么就是从1~MAX-1,0所在的字节无法访问,请问这是
作何考虑?另外,向低扩展的段的实际大小应该如何算?是不是 BASE+MAX - (BASE+limit) - 1?
3。向低扩展的段用作堆栈的时候,有几种情况我不太明白会有什么结果:
(1)。段基址+limit已经超出了MAX,比如,Base = 0xfffffff0,而Limit为0x000000ff。
(2)。虽然有效的偏移为limit+1 ~ MAX-1,但有效不一定合法,如果 Base+Limit超出了MAX,那么会出
现什么情况?比如:BASE = 0xffff0000, limit = 0x0000ff00,那么合法的偏移应该是
0x0000ff01~0xffffffff, 但在limit为0x0000ffff时,BASE+limit已经到达了4G的极限值0xffffffff,那
么如果在程序运行时limit为0x00010000,是不是会抛出异常?
(3)。既然偏移为limit+1 ~ MAX-1,那么很多个任务定义的很多个堆栈段总有一部分要相同,如下图:
-------- 0
xxxxxxxx BaseA
xxxxxxxx LimitA
--------
xxxxxxxx BaseB
xxxxxxxx LimitB
--------
xxxxxxxx BaseC
xxxxxxxx LimitC
--------
xxxxxxxx
-------- MAX-1
那么这3个任务中的3个不同的向低扩展的堆栈段中,LimitC+1~MAX-1是大家都可以共享的(都在合法偏移内且线性地址就等于物理地址),那么保护岂不是失效了?该如何定义堆栈段已确保任务之间的隔离呢?
问题有点多,先谢谢各位了!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课