能力值:
( LV2,RANK:10 )
|
-
-
2 楼
处理异常是有点麻烦
|
能力值:
( LV7,RANK:110 )
|
-
-
3 楼
我想,大概是
在进行任务切换时,TSS必须在内存中 的意思吧~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
TSS 是在non-paged 页中,是永驻内存,不会swap out
在OS初始化好, 地址就是确定了
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我反复看了几遍,还不不大理解,我分成几个问题来问:
1。要把TSS从内存换出,只有一个特别的要求,即任务切换中间不允许发生页异常。这句话的疑惑是:要把TSS从内存换出,为什么不允许任务切换中间不允许发生页异常?换出和任务切换之间有关系吗?
2。段标记为不存在,如果保证在任务切换中间不会发生页异常?
3。保证每个TSS段都不跨越页的边界,如果保证在任务切换中间不会发生页异常?
|
能力值:
( 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)。
|
|
|