段
段是一块连续的内存区域,它是基本的内存保护单位。描述一个段不但需要段的基址,还需要段长和各种保护信息。所以,采用段描述符来描述段。
段描述符是一个大小为8个字节的数据结构,期一般的格式如下图所示:
基地址:由地2、3、4、7四个字街组合而成,定义了该段在线性地址空间中的开始位置。基地址可以在0~4GB之间浮动,但最好是16字节对齐。
粒度标志G:G=0时,段以字节为单位;G=1时,段以页(4KB)为单位。
段界限:定义了段的大小,有描述符中的0、1字节和6字节的低4位组成,共20位,它和G一起确定段的大小。G=0时,段以字节为单位,最大段长为1MB;G=1时,段以页(4KB)为单位,最大段长为4GB。
存在标志P:P=0,表示段不在物理内存中;P=1,表示段在物理内存中。
因为要经常使用段描述符,因此需要一种标识它的简单方法,这就是段选择符。它是表示一个段的16 位标识符,它的结构如下图所示:
Index:通过该索引可以在描述符表中找到所选择的段描述符。
TI:TI=0,表示描述符表为全局描述符表;TI=1,标识描述符表为局部描述符表。
程序中的逻辑地址由两部分组成:段选择符和偏移量。从逻辑地址到线性地址的转换要经过描述符表:以段选择符为所以呢查找描述符表,得到一个段描述符;从描述符中获得段的基址,再加上偏移量即可得到一个线性地址。转换过程如下图所示:
页
段是一种基本的内存管理机制,他能把处理器的线性地址空间划分为小的地址段。段与段之间是相互独立的,对段的访问要受到严格的检查和保护。段可以再进一步划分成页,分页机制是可选的。分页机制提供了对虚拟内存的最基本的支持,是现代操作系统中内存管理的基础。与段不同,页的大小是固定的,也可以在内存中,也可以在外存上。
处理器的控制寄存器中有三个标志用于控制分页:
CR0中的PG:PG=1,表示启用分页;PG=0,表示不启用分页。这在操作系统初始化时设置。
CR4中的PSE:PSE=1,表示页的大小为4MB或2MB;PSE=0,表示页的大小为4KB。
PAE:PAE=1,表示采用了36位物理地址模式;PAE=0,则没有。
有逻辑地址转换到线性地址需要用到描述符表,而由线性地址转换到物理地址需要用到页目录和页表,一个线性地址被分为三部分:页目录、页表和偏移量。
这就解释了段和页之间的关系。
线性地址转换为物理地址的过程如下图所示:
在分页机制中,线性地址转换为物理地址,必须要知道使用的页目录的位置。所以,Intel提供了寄存器CR3,它用来存放当前使用的页目录的物理地址,因此CR3寄存器幼教页目录基址寄存器(PDBR)。
閱讀更多 有理想的代碼dog 的文章