linux内核编程学习笔记二:保护模式


追寻


关于保护模式涉及到很多概念,比如分段、段描述符、分页、页表和任务状态段(TSS)等,内容比较繁多。要真正深入了解保护模式,就必须弄清这些概念。对于不熟悉保护模式的人来说,怎么能够一下子抓住保护模式的关键呢?什么是保护模式?保护模式的核心就是通过段页式寻址机制来实现多个任务之间的有效隔离!
   关于保护模式有两个要点:一是在段页式寻址机制下cpu能访问多达4GB的寻址空间,突破了实模式下的640KB的限制,使得同时装入执行多个任务成为可能;二是分段机制使得段具有访问权限和特权级,操作系统的代码和数据不允许被应用程序访问,使得操作系统与应用程序有效隔离。

1、分段机制和段表述符表
   保护模式下还是延续实模式下的“段:偏移”的地址格式,但是其中的“段”的含义完全不同。在保护模式下,CS,DS,ES,SS这些寄存器中的值是“段选择符”,需要查全局描述符表(GDT)或者局部描述符表(LDT)来获得段的基地址,在加上偏移,才能得到线性地址。简单的说,CS,DS,ES,SS寄存器里存的是段的索引而不是段本身!这个索引指向一个数据结构的一个表项,表项中详细定义了段的起始地址、界限、属性等内容,这个数据结构就是GDT或者LDT。GDT中的表项也有一个专门的名字,叫做描述符(Descriptor)
   段描述符分为两大类:存储描述符(存储段是存放可由程序直接访问的代码和数据的段)和系统段描述符或门描述符(系统段是80386分段机制所使用的特别段,门与中断、异常及陷阱对应)。关于描述符的属性的详细内容大家可以找相关的书籍参考,这里就不多讲了。
   用来选择段描述符的是段选择符又叫选择子,它是一个16位的结构,15~3位用来选择段描述符,第2位用来表示是在GDT里选还是在LDT里选,1~0位是访问权限级别(RPL)。
2、虚拟存储器和分页机制
   在80386以上的cpu中,还提出了虚拟存储器(Virtual Memory)概念,这可使得应用程序能够使用远超过实际数量的内存。程序访问存储器时使用虚拟地址,虚拟地址在经过分段和分页两种机制才能得到物理地址,从而达到存储器保护的目的。
   这里涉及到存储器管理的一些知识。首先要区别逻辑地址,线性地址和物理地址。逻辑地址即段地址:偏移的方式,通过段地址和偏移的组合形成线性地址。如果启用了分页机制,则线性地址会通过分页机制转换成物理地址送到地址线上,如果没有启用分页机制,则得到的线性地址就是物理地址。
   这里再介绍一下分页机制方面的知识。存储器是有一个个的存储单元所组成的,但是,与需要占用存储空间的数据规模相比,以存储单元为分配单位则显得过于细微,一个直接的办法就是对整个存储空间进行分区。在计算机技术中,存储器中的一个分区叫做一页,在linux中一页通常是4KB大小。
   初始的主存就相当于一张方格纸,每一个方格相当于一个存储单元。而分页就是把整个主存分为大小相等的若干区,即每个区都有相同数目的存储单元,符合这个规定的分区就叫做页。然后对所有的页从0开始依次命名一个页号。分页就相当于把一张方格纸裁剪成大小相等若干张,然后把它们看成是一本方格纸,每张方格纸都有一个页码。分页后,就可以以页为单位为程序实体分配存储空间。
   我们知道,32位地址线其最大寻址空间是4G,但是一般计算机没有配备那么大的实际内存,因此提出了虚拟存储器的概念,把处理器所提供的地址空间叫做虚拟地址空间或者逻辑地址空间,而真正的实际配备的存储器所提供的空间叫做物理空间。对于程序员所能看到的是虚拟地址空间,所以在编程是,可以不用考虑实际的物理内存容量,只要不超过计算机处理器寻址空间就可以。
   更详细的关于存储器管理方面的知识大家可以参考《现代操作系统》一书。
   保护模式方面的知识就介绍到这里,只能给大家一个大概的认识,更多的细节需要大家自己去阅读相关书籍了。

相关内容

    暂无相关文章