首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
深入学习LINUX内核之五(图文讲解)
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2008-04-15  


⑶ 检查新任务的TSS描述符号是标注为存在的(P=1),並且TSS段长度有效(大於0x67)。当试图执行会產生错误的指令时,都会恢复对处理器状态的任何改变。这使得異常处理行程的返回位址指向出错指令,而非出错指令随后的一条指令。因此異常处理行程可以处理出错条件並且重新执行任务。異常处理行程的介入处理对应用程式来說是完全透明的。



⑷ 如果任务切換產生自JMP或1RET指令,处理器就会把当前任务(老任务)TSS描述符号中的忙标志B重定;如果任务切換是由CALL指令、異常或中断產生,则忙标志B不动。

⑸ 如果任务切換由IRET產生,则处理器会把临时保存的EFLAGS映射中的NT标志重定;如果任务切換由CALL、JMP指令或者異常或中断產生,则不用改动上述NT标志。


⑹ 把当前任务的状态保存到当前任务的TSS中。处理器会从任务寄存器中取得当前任务TSS的基底位址,並且把一下寄存器內容复制到当前TSS中:所有通用寄存器、段寄存器中的段选择符号、标志寄存器EFLAGS以及指令指标EIP。

⑺ 如果任务切換是由CALL指令、異常或中断產生,则处理器就会把从新任务中载入的EFLAGS中的NT标志置位元。如果任务切換產生自JMP或IRET指令,就不改动新载入EFLAGS中的标志。

⑻ 如果任务切換由CALL、JMP指令或者異常或中断產生,处理器就会设置新任务TSS描述符号中的忙标志B。如果任务切換由IRET產生,则不去改动B标志。

⑼ 使用新任务TSS的段选择符号和描述符号载入任务寄存器TR(包括隐藏部分)。设置CR0寄存器的TS标志。

⑽ 把新任务的TSS状态载入进处理器。这包括LDTR寄存器、PDBR(CR3)寄存器、
EFLAGS寄存器、EIP寄存器以及通用寄存器和段选择符号。在此期间检测到的任何错误都将出现在新任务的上下文中。

⑾ 开始执行新任务(对於異常处理行程,新任务的第一条指令显现出还沒有执行)。


当成功地进行了任务切換操作,当前执行任务的状态总是会被保存起来。当任务恢复执行时,任务将从保存的EIP指向的指令处开始执行,並且所有寄存器都恢复到任务掛起时的值。

当执行任务切換时,新任务的特权级与原任务的特权级沒有任何关系。新着任务在CS寄存器的CPL栏位指定的特权级上开始执行。因为各个任务透过它们独立的位址空间和TSS段相互隔絕,並且特权级规则已经控制对TSS的存取,所以在任务切換时软件不需要再进行特权级检查。

每次任务切換都会设置控制寄存器CR0中的任务切換标志TS。该标志对系统软件非常有用。系统软体可用TS标志来协调处理器和浮点辅助运算器之间的操作。TS标志指明辅助运算器中的上下文可能与当前任务的不同。


4.7.5 任务链

TSS的前一任务连接(Backlink)栏位以及EFLAGS中的NT标志用於返回到前一个任务操作中。NT标志指出了当前执行的任务是否是巢状嵌在另一个任务中执行,并且当前任务的前一任务连接栏位中存放着巢状层中更高层任务的TSS选择符号,若有的话(见图4-38所示)。







当CALL指令、中断或異常造成任务切換,处理器把当前TSS段的选择符号复制到新任务TSS段的前一任务链结栏位中,然后在EFLAGS中设置NT标志。NT标志指明TSS的前一任务链结栏位中存放有保存的TSS段选择符号。如果软件使用IRET指令挂起新任务,处理器就会使用前一任务链接栏位中值和NT标志返回到前一任务。也即如果NT标志是置位元的话,处理器会切换到前一任务链接栏位的任务去执行。


注意,当任务切換是由JMP指令造成,那麼新任务就不会是巢状的。也即,NT标志会被设置为0,並且不使用前一任务链结栏位。JMP指令用於不希望出现巢状的任务切換中。

表4-9总结了任务切換期间,忙标志B(在TSS段描述符号中)、NT标志、前一任务链结栏位和TS标志(在CR0中)的用法。注意,执行於任何特权级上的程式都可以修改NT标志,因此任何程式都可以设置NT标志並执行IRET指令。这种做法会让处理器去执行当前任务TSS的前一任务链结栏位指定的任务。为了避免这种偽造的任务切換执行成功,作业系统应该把每个TSS的该栏位初始化为0。






4.7.6 任务位址空间的

任务的位址空间由任务能夠存取的段构成。这些段包括代码段、资料段、堆栈段、TSS中引用的系统段以及任务代码能夠存取的任何其他段。这些段都被映射到处理器的線性位址空间中,並且随后被直接地或者透过分页机制映射到处理器的实体位址空间中。

TSS中的LDT栏位可以用於给出每个任务自己的LDT 。对於一个给定的任务,透过把与任务相关的所有段描述符号放入LDT中,任务的位址空间就可以与其他任务的隔絕开来。

当然,几个任务也可以使用同一个LDT。这是一种简单而有效的允许某些任务互相通信或控制的方法,而无须拋棄整个系统的保护屏障。


因为所有任务都可以存取GDT,所以也同樣可以建立透过此表存取的共用段。

如果开啟了分页机制,则TSS中的CR3暂存器栏位可以让每个任务有它自己的页表。或者,几个任务能夠共用相同页表集。


把任务映射到線性和实体位址空间

有两种方法可以把任务映射到線性位址空间和实体位址空间:

▓ 所有任务共用一个線性到实体位址空间的映射。当沒有开啟分页机制时,就只能使用这个办法。不开啟分页时,所有線性位址映射到相同的实体位址上。当开啟了分页机制,那麼透过让所有任务使用一个页目錄,我们就可以使用这种从線性到实体位址空间的映射形式。如果支援需求页虛拟储存技术,则線性位址空间可以超过现有实体位址空间的大小。

▓ 每个任务有自己的線性位址空间,並映射到实体位址空间。透过让每个任务使用不同的页目錄,我们就可以使用这种映射形式。因为每次任务切換都会载入PDBR (控制暂存器CR3) ,所以每个任务可以有不同的页目錄。

不同任务的線性位址空间可以映射到完全不同的实体位址上。如果不同页目錄的条目(表项)指向不同的页表,而且页表也指向实体位址中不同的页面上,那麼各个任务就不会任何实体位址。

共7页: 上一页 [1] [2] 3 [4] [5] [6] [7] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·深入学习LINUX内核之四(图文讲解
·深入学习LINUX内核之六(图文讲解
·深入学习LINUX内核之三(图文讲解
·深入学习LINUX内核之七(图文讲解
·深入学习LINUX内核之二(图文讲解
·深入学习Linux内核文档一(图文讲
·Linux系统内核漏洞分析
·如何在Linux内核中的实现SYN Coo
·简析Linux与FreeBSD的syscall
·Linux操作系统“警惕”内核汉化
·Linux操作系统核心的汉字显示机
·如何利用异常表处理Linux内核态

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!