首页
社区
课程
招聘
[旧帖] 页机制的一点疑惑 0.00雪花
发表于: 2010-12-10 17:29 4297

[旧帖] 页机制的一点疑惑 0.00雪花

2010-12-10 17:29
4297
我在看书的时候,有以下一段话:
由于TSS存储在线性地址空间中,因而可以由分页机制对TSS重新进行定位,甚至可以把TSS换出到虚拟存储系统的磁盘中。要把TSS从内存换出,只有一个特别的要求,即任务切换中间不允许发生页异常。如TSS所在的页不在存储器中,则对此TSS的访问将产生页异常,TSS所在的页可从磁盘上读回内存。由于在任务切换操作期间,处理器只访问TSS的前104个字节,所以,采用一些简单的策略可以保证在任务切换中间不会发生页异常:一种策略是不要把TSS换到磁盘上,或者把段标记为不存在。另一种策略是,通过保证每个TSS段都不跨越页的边界,从而保证TSS被对换时,要么整个段存在,要么整个段不存在。事实上,这一点再设计的时可以很容易地实现。这只要把每个段对齐在线性地址空间的128字节边界即可。如果对其在128字节的边界,由于4K可以被128整除,因而TSS的前104字节不会跨越页边界。
各位高手能否解释下这段话的含义?我看不太懂。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
处理异常是有点麻烦
2010-12-10 19:21
0
雪    币: 93
活跃值: (55)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
我想,大概是
在进行任务切换时,TSS必须在内存中 的意思吧~
2010-12-11 22:16
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
TSS 是在non-paged 页中,是永驻内存,不会swap out
在OS初始化好, 地址就是确定了
2010-12-12 21:50
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我反复看了几遍,还不不大理解,我分成几个问题来问:
1。要把TSS从内存换出,只有一个特别的要求,即任务切换中间不允许发生页异常。这句话的疑惑是:要把TSS从内存换出,为什么不允许任务切换中间不允许发生页异常?换出和任务切换之间有关系吗?
2。段标记为不存在,如果保证在任务切换中间不会发生页异常?
3。保证每个TSS段都不跨越页的边界,如果保证在任务切换中间不会发生页异常?
2010-12-13 10:17
0
雪    币: 84
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我的理解,不确认是否正确,仅供参考:
1. 任务切换是在内核态处理,缺页异常也是在内核态处理。有些资料显示,linux缺页异常处理时,会发生任务切换,挂起当前进程,执行另外的进程。如果一次任务切换过程中,又出现页异常,相当于任务切换出现了递归嵌套,这会增加处理复杂度,所以内核设计时避免这种情况,不允许出现。

2. 段标记为不存在。网上可以搜到一段相关信息,如下:
“(6)段存在标志P(Segment present):用于指出一个段是在内存中(P=1)还是不在内存中(P=0)。当一个段描述符的P标志为0时,那么把指向这个段描述符的选择符加载进段寄存器将导致产生一个段不存在异常。内存管理软件可以使用这个标志来控制在某一给定时间实际需要把那个段加载进内存中。这个功能为虚拟存储提供了除分页机制以外的控制。”
我理解,这样就可以在进行任务切换之前,首先确保把段加载到内存。

3. 保证每个TSS段都不跨越页的边界。
在任务切换之前,有2种情况:
a) TSS段对应页在内存中:由于TSS段不跨页,此时进行任务切换,可以顺利访问TSS段,不会发生缺页异常。
b) TSS段对应页不在内存中:在任务切换之前,就产生缺页异常,缺页异常被正确处理后,转变为情况a)。
2011-2-26 13:11
0
游客
登录 | 注册 方可回帖
返回
//