IA-32架构的内存管理分为两个部分:分段和分页。分段提供了一种隔离每个进程
或者任务代码、数据和栈模块的机制,保证多个进程或者任务能够在同一个处理器上运
行而不会互相干扰。分页机制实现了传统请求调页的虚拟内存系统,在这种系统中,
程序的执行环境块
按需要
被映射到物理内存中。分页机制同样可以用来隔离多个任务。
在保护模式下,分段机制是必须的,分页机制则是可选的。
注意:没有一个标志位可
用来关闭分段功能。
1、分段结构
分段将处理器可寻址空间(即线性地址空间)分为较小的受保护的地址空间:段。段可以被用来装载一个程序的代码、数据或者堆栈,亦或装载系统的数据结构(如 TSS、LDT 等)。当处理器上运行多个进程时,可以为每个进程分配属于它自己的段集合。处理器会强制规定这些段的边界,以确保不会因为一个进程对属于另一个程序的段进行误写而互相干扰执行。分段机制也可以对段进行分类,确保操作限于某种类型的段。
系统中所有的段都包含在处理器的线性地址空间内。
只有逻辑地址(也称为远指针)才能确定一个字节在一个特定段中的位置。逻辑地址由段选择子和偏移组成。段选择子是一个段的唯一标识。除此以外,它还是描述符表(比如全局描述符表 GDT)中的偏移,供访问一个叫做段描述符的数据结构之用。每个段有一个段描述符,段描述符描述段的大小、访问权限、段的优先权、段的类型以及段的第一个字节在线性地址空间的位置(也称为段基地址)等。通过将逻辑地址中的偏移部分加上段基地址就可以确定这个地址在段中的字节位置。
段基地址加偏移就构成了处理器线性地址空间的线性地址。
如果系统没有采用分页机制,线性地址空间就直接映射到物理地址空间。在多任务计算系统中,通常会定义一个比实际物理内存空间大的多的线性地址空间,因此需要使用一些方法来“虚拟化”线性地址空间。
线性地址空间的虚拟化由处理器的分页机制来完成。
分页机制支持虚拟内存环境,通过较小的物理内存(RAM 和 ROM)以及一些磁盘存
储空间来模拟一个很大的线性地址空间。使用分页机制时,每个段被分成很多页(通常一个页的大小为 4KB),这些页或者在物理内存中,或者在磁盘上。 操作系统会维护一张页目录表和一组页表来记住这些页。当一个进程/任务试图访问线性地址空间的一个地址时,处理器通过页目录表和页表将线性地址转换成物理地址,然后对相应的物理地址执行要求的操作(读或写)。 如果被访问的页不在当前的物理内存中,处理器会中断这个进程的执行(产生一个缺页异常)。之后,操作系统或者管理程序会从磁盘上读取这个页到内存中,接着执行这个程序。
储空间来模拟一个很大的线性地址空间。使用分页机制时,每个段被分成很多页(通常一个页的大小为 4KB),这些页或者在物理内存中,或者在磁盘上。 操作系统会维护一张页目录表和一组页表来记住这些页。当一个进程/任务试图访问线性地址空间的一个地址时,处理器通过页目录表和页表将线性地址转换成物理地址,然后对相应的物理地址执行要求的操作(读或写)。 如果被访问的页不在当前的物理内存中,处理器会中断这个进程的执行(产生一个缺页异常)。之后,操作系统或者管理程序会从磁盘上读取这个页到内存中,接着执行这个程序。
1.1多段模型
多段模型充分利用分段机制,提供对代码、数据结构、任务或者程序的硬件强制保护。在这里,每个进程(或者任务)都分配有自己的段描述符和相应的段。段可以完全归它们所分配的程序独占,也可以供其它进程共享。对所有段的访问和对运行在系统中的每个程序执行环境的访问都受硬件控制。
访问检查机制不仅可以禁止对超过段界限的地址进行寻址,也可以禁止对特定段执行非法操作。比如,因为代码段被指定为只读的,所以用硬件来防止对代码段写入数据。段的访问权限信息也可以被用来建立保护级别。
保护级别可以用来防止操作系统的例程被未授权的应用进程访问。
1.2、逻辑地址和线性地址
在保护模式的系统架构中,处理器分两步进行地址转换以得到物理地址:逻辑地址转换和线性地址空间分页。
即使最小程度的使用段机制,处理器地址空间内的每一个字节都是通过逻辑地址访问的。
一个逻辑地址由一个 16 位的段选择子和一个 32 位的偏移组成。段选择子确定字节位于哪个段,偏移确定字节在段中相对于段基地址的位置。
处理器将逻辑地址转换为线性地址。线性地址是处理器线性地址空间内的 32 位的地址。与物理地址一样,线性地址是平坦的(不分段的),空间大小为
字节,从地址 0 到FFFFFFFFH。
线性地址空间包含了所有的段和为系统定义的各种系统表。
处理器通过如下几个步骤将逻辑地址转换为线性地址:
1. 使用段选择子中的偏移,找到 GDT 或者 LDT 中相应的段描述符,得到段信息并把它读到处理器中。(仅当一个新的段选择子被读入段寄存器时才执行这一步。)
2.检查段描述符中的访问权限和段的地址范围,确保段是可访问的且偏移在段界限范围内。
3.将段描述符中的段基址与偏移相加构成线性地址。
1. 使用段选择子中的偏移,找到 GDT 或者 LDT 中相应的段描述符,得到段信息并把它读到处理器中。(仅当一个新的段选择子被读入段寄存器时才执行这一步。)
2.检查段描述符中的访问权限和段的地址范围,确保段是可访问的且偏移在段界限范围内。
3.将段描述符中的段基址与偏移相加构成线性地址。

最低0.47元/天 解锁文章
1059

被折叠的 条评论
为什么被折叠?



