首页
社区
课程
招聘
[旧帖] 重头再来之新疑惑(一) 0.00雪花
发表于: 2010-11-17 14:09 3699

[旧帖] 重头再来之新疑惑(一) 0.00雪花

2010-11-17 14:09
3699
花个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是大家都可以共享的(都在合法偏移内且线性地址就等于物理地址),那么保护岂不是失效了?该如何定义堆栈段已确保任务之间的隔离呢?
问题有点多,先谢谢各位了!!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 197
活跃值: (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
通过虚拟地址(段选择子)可以索引到的段基地址,段基地址+偏移称为线性地址。
当没有使用启用分页机制的话,线性地址就是物理地址
当启用分页机制的话,线性地址需要通过页目录转换得到物理地址
我的猜想是:每个任务 索引出来的段描述符中的段基地址是不同的,所以没有分页机制的情况下对应到的物理地址也就不同了,呵呵,保护模式还没深入的看过呢,只是个人拙见。还是期待高人指点。

可以推荐下学习保护模式的好书么,要好好学习下段机制和页机制。。
2010-11-17 15:20
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我现在在看杨季文的《80x86汇编语言程序设计教程》,保护模式的内容比较教条,但是能学到很多!
2010-11-18 13:42
0
雪    币: 197
活跃值: (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵,等有时间也看看。。现在还在看汇编呢。。杯具
2010-11-18 16:29
0
雪    币: 5540
活跃值: (264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
保护模式 记得当时学的时候的理解是  我么操作的并不是实际的物理地址,而是编译器给我们在物理内存划出来的的一块地址。比如oxFFFF0000到oxFFFF0100。(当然,在实际情况下,这块地址有可能是不连续的)而我们在编写代码的时候 就可以把它当成是一块完整系统内存来操作。oxFFFF0000就相当于ox00000000。 这个原理和虚拟内存有点相似。
2010-11-18 19:26
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
呵呵···慢慢来!不能急!!!!
2010-11-19 09:58
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多了解一点也好。
2010-11-20 02:51
0
游客
登录 | 注册 方可回帖
返回
//