保护模式内存管理
IA-32的内存管理分为两部分:分段和分页
分段提供的将代码、数据和栈分割的机制使多程序(或多任务)可以运行在同一个CPU中而不会相互干扰。 分页提供的的虚拟内存系统和按需分配机制使内存得到高效利用。同时也实现了多任务的分割。
分段
分段将CPU的线性地址空间划分为更小的、被保护的地址空间,即段。段可以被用来保存代码、数据、堆栈和系统数据结构(如TSS和LDT)。每个程序都会分配到它自己的段中,并防止其他程序干扰或写入到该程序的代码段和数据段中。 为了定位一个段,必须要提供逻辑地址(又叫做远指针),逻辑地址由段选择子和偏移地址组成。段选择子提供了一个用于定位段描述符的索引。每个段都有自己的段描述符,它描述了段的大小、访问权限、特权级、段的类型和段在线性地址空间内的起点(又叫做段的基地址) 偏移地址加上段的基地址便可以用来定位段内的任一位置。
也就是说,段选择子用来定位GDT中的段描述符,而短描述符中的基地址加上被提供的偏移地址所形成的线性地址用来定位段内的任一位置。
如果分页机制未打开,线性地址将会直接映射到物理地址,
分页
由于在多任务系统中,内存的分配和释放不一定连续的,导致内存无法被充分利用。所以提出了“虚拟内存”的概念。 分页机制用于支持虚拟内存环境。分页机制使用少量的内存或磁盘空间用来模拟大量的线性地址空间。当开启分页机制时,每个段都被划分成若干页(通常为4K),CPU使用页目录和页表将线性地址转换为物理地址,然后在内存中上执行指令(读或写)。 如果一个页在访问时不在物理内存上,CPU将会中断程序的执行,在将所需的页从磁盘读入内存后继续执行程序。 在虚拟8086模式下,所有用于16位和32位处理器的程序都可以被分页。
使用分段
1.基本平坦模式
对于操作系统来说,平坦模式是最简单的内存模式。为了使用平坦模式,你至少要创建两个段描述符,一个是代码段描述符,另外一个是数据段描述符。 代码段和数据段的基地址均为0,而段限制也都为4GB(可以大于实际内存)。ROM(EPROM)一般在物理内存的顶部,因为CPU从FFFF_FFF0H开始运行。而RAM则定位在物理地址的底部,因为DS数据段在初始化后被设置为。
2.保护平坦模式
相比于基本平坦模式,保护平坦模式的段范围不能大于实际内存空间。 保护平坦模式将会阻止访问不存在的内存空间。这个模式提供了针对某些程序错误的一个最低等级的硬件保护。 为了配合分页机制将用户和管理员隔离的机制,至少要定义4个段:位于第三特权级的代码段和数据段用于用户,位于零特权级的代码段和数据段用于管理员。通常这些段都在线性空间的0地址段为始,
3.多段模式(Multi-Segment Model)
多段模式充分利用了段所提供的用于代码、数据结构、程序和任务硬件防护的能力。在此,每个程序(或任务)都被给予它独自的段和独自的段描述符,并且段可以成为私有的或在程序间共享。
IA_32e分段模式
在64位模式下,CPU将CS、DS、ES、SS的段基址初始化为0,FS、GS则不会。在用于计算线性地址时,这些储存着段基址的段寄存器可以被用于提供附加地址。
64位模式下,CPU将不会再运行期间检查段界限。
寻址
为了将逻辑地址转换为线性地址,CPU将进行一下步骤:
1.使用段选择子中的索引定位段描述符。
2.检查段描述符中的使用权和段界限。
3.将段描述符中的基地址加上偏移地址形成线性地址。
(64位并非如此)
段选择子
CPU共有六个段选择子:CS、SS、DS、ES、FS、GS