Linux操作系统基础(三)保护模式内存管理(1)

Linux操作系统基础(三)保护模式内存管理(1)

 

转载请注明出处:http://blog.csdn.net/rosetta

保护模式内存管理

    本节描述IA-32架构保护模式下内存管理机制,包括段机制和页机制。

内存管理简介

         IA-32架构内存管理机制分两部分:分段机制和分页机制。分段机制使代码段、数据段和堆栈段相互独立,这样多任务才可以在一个处理器上运行还不会被其它程序干扰。分页机制为传统需求页、虚拟内存系统提供了实现机制。其中虚拟内存系统用于实现程序代码按需映射到物理内存中。分页也使多任务之前相关隔离。在保护模式下,分段机制是必须实现的,没有模式位用来关键分段;但是分页机制是可选的。

         这两种机制可以支持单任务系统、多任务系统或者支持共享内存的多处理器系统。如图6所示,分段制机制提供处理器可寻址内存空间(线性地址)到段地址空间的地址变换。段可用来存放数据、代码、堆栈以及系统数据结构TSS和LDT。假如一个处理器上有多个任务(程序)同时运行,那么每个任务都有自己段集。然后处理器可以加强这些段之前的界线,并且确保一个程序不会通过写入另一个程序的段而干扰程序的执行。段机制对段进行了分类,这样对特别类型的段的访问能够受限制。

         一个系统中的所有段都在处理器的线性地址空间中。为了定位段中的一个字节,必须提供逻辑地址(logical address,也叫远指针)。一个逻辑地址由段选择符和偏移值组成。段选择符唯一标志一个段,除此之外,段选择符还提供描述符表(比如GDT)中称为段描述符的数据结构的偏移地址。每一个段都有一个段描述符,它用来指定段的大小,访问权限,段的特权级,段类型和线性地址空间中的段基地址。逻辑地址中的偏移地址加上段基地址就可以定位段中的一个字节。所以基地址加上偏移地址就形成了处理器线性地址空间中的线性地址(linear address)。

         假如没有启用分页,那么处理器的线性地址就直接映射到物理地址空间。物理地址空间的大小范围由处理器的数据总线位数决定。

         因为多任务系统定义的线性地址空间通常比实际物理内存大,所以需要某种虚拟化线性地址空间的方法。虚拟化线性地址空间就是通过处理器的分页机制实现的。

         分页支持的虚拟内存环境,需要由小块的物理内存(RAN或ROM)和一些硬盘存储介质来模拟大容量的线性地址空间。当使用分页时,每个段被分成很多页(典型的页大小为4KB),页存储在物理内存或者硬盘中。操作系统通过维护一个页目录和一组页表集来跟踪页。当一个程序尝试访问线性地址空间中的地址时,处理器通过页目录和页表把线性地址空间转换到物理地址空间中,然后在物理内存位置完成相应的操作请求(读或写)。

         假如被访问的页不在当前物理内存中,那么处理器将中断当前程序执行(通过产生页错误异常),然后操作系统或执行指令从硬盘读取页到物理内存中并继续执行当前中断的程序。

         当操作系统正确的完成分页时,硬盘和物理内存的交换对于程序正确的执行是透明的。

段的使用

         IA-32架构支持的段机制可以使用在多种系统设计中。从最小的平坦模型仅仅使用分段保护程序到多段模型利用段创造壮健的操作环境从而使多任务程序可靠的执行。

         以下几节将给出一些例子用于说明系统是如何利用段来提高内存管理的性能和可靠性。

图6 分段和分页

基本的平坦模型

         系统最简单的内存模型称为“基本平坦模型”,这种模型下操作系统和应用程序都可以访问连续的、不分段的地址空间。对于系统设计者和应用程序开发者来说最大限度的隐藏了分段机制。

         为了实现内存基本平坦模型,至少需要两个段描述符,一个用来指向代码段,另一个指向数据段,如图7所示。这两个段都映射到整个线性地址空间:也就是说,两个段描述符都有同样的基地址为0和同样的段限长4GBytes。通过设置4GBytes的段限长,当访问超过出了段限长分段机制也不会产生异常,甚至所访问的地址并没有物理内存。ROM(EPROM)通常过被放在物理内存最高地址处,因为处理器一开始执行FFFFFFF0H处RAM(DRAM)被放在地址空间最低处,因为在系统复位后DS数据段基地址被初始化为0。

保护模式平坦模型

         保护模式平坦模型和基本平坦模型类似,只不过段限长的范围设置成实际物理内存大小。

当访问实际不存在的物理地址空间时会生成一个普通的保护异常,如图8所示。这种模型提供了最低级别的硬件保护来访问一些程序bug。

         这种保护模型平坦模型可以变得更复杂来提供更多保护。例如,为了分页机制中提供普通用户和超级用户的代码和数据,必须定义四个段:普通用户特权级为3的代码和数据段,超级用户特权级为0的代码和数据段。通常这些段相互重叠并且从线性地址0开始。这种平坦分段模型加上一个简单的分页结构就可以在应用程序和操作系统之间起保护作用,如果为每个任务增加一个单独的页结构,那么就可以给应用程序之前提供保护了。同样的设计被用于一些流行的多任务操作系统。

图7 基本平坦模型

图8 保护模式平坦模型

多段模型

         一个多段模型,如图9所示,充分发挥了段机制的对代码、数据结构和程序提供硬件保护的能力。每个程序都有自己的段描述符表和自己的段。段可以完全属于程序私有也可以和其它程序之前共享。

         访问权限的检查不仅仅用来保护地址越界,也可以保护某一特定段不允许操作。例如代码段是只读段,硬件可以阻击向代码段进行写操作。为段建立的访问权限信息也可以用来建议保护级别。保护级别可以用来防止未认证的应用层程序访问操作系统程序。

分页和分段

         分页可以用于以上描述的图7,图8,图9分段模型。处理器的分页机制把线性地址空间分为许多页(那些段映射的地方),如图6所示。这些线性地址空间中的页然后映射到物理内存地址空间。分页机制提供一些页级别保护功能,它可以和段保护功能一起使用或者直接代替段保护功能。例如,它可以让读写保护强制使用到基础page-by-page(?)。页机制也提供两级别保护(普通用户和超级用户),这也在基础page-by-page中指定。

 

图9 多段模型

 参考:《Intel SystemProgramming Guide》

          《Linux内核完全剖析》赵炯编著

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值