linux系统内存寻址的详细分页机制
本文主要介绍linux系统中内存寻址的分页机制,CPU只根据分页实现读取线性地址,您需要的朋友可以参考。分页机制进行了分段机制来完成线性mdash后;物理地址的转换过程。分段机制将逻辑地址转换成线性地址,和分页机制进一步将线性地址转换成物理地址。
分页硬件
分页机制是通过CR0的PG位启用。例如,PG = 1,启用分页机制,用机制本节所述将线性地址转换成物理地址。例如,PG = 0,禁用分页机制,并利用段产生一个物理地址线性地址,分页机制的对象是一个固定大小的存储块称为一页(页),分页机制的线性地址空间和物理地址空间的页,在线性地址空间中的任何页面都可以映射到物理地址空间的任何页面(我们把页面的物理空间被称为一个页面或页面(页面))。
80386使用4K字节大小的页,每一页都有一个长度为4K字节对齐在4K字节,即边界,每一页的起始地址可以分为4K。因此,80386 4G字节的线性地址空间被划分为1G的页面和4K字节的大小通过每页。分页机制在该页的线性地址空间,搬迁到物理地址空间的管理,因为每个页面的4K字节为单位的映射,每个页面对齐4K字节的边界,因此,低12位的线性地址通过分页机制直接作为低12使用物理地址。
为什么要使用两级页表
假设每个进程占用4G的线性地址空间,页表包含100万个表项,每个表项占用4字节。然后每个进程的页表占用的内存空间4m。为了节省通过页表占用的空间,我们使用两级页表,每个进程被分配一个页目录,但只有实际的页表将被分配到内存。第一级页表需要分配所有页表空间时,与二级页表的页表空间可以分配,在需要的时候。
二级页面结构
对两级表结构的第一级称为页目录,这是存储在一个4K字节的页中,页目录共有1K的条目,这是每4个字节,分二级表。最高10位的线性地址(31位32位~)是用来产生一级指标,并在1K两级表表和表中指定的选项通过指数。
二级表结构的第二级称为页表。它也存储在一个4K字节的页,其中包含1K字节的列表项。每个表项包含一个页面的物理基地址。二级页表由10个中间线性地址(12加入21 ~指数),得到该页的物理地址包含一个页表项,对高20和低12位的线性地址形成物理地址的物理地址,这是物理地址转换过程的页面输出。
页目录项
31~12位是一个20位页地址。因为页面地址的12位总是0,所以可以用高20位指出32位页地址。因此,一个页面目录包含最多1024页的表地址。
零位的存在点,如果P = 1,页表地址指向的内存页,如果P = 0,没有记忆。
第一个是读写位,第二个是用户/管理员位,这两个位为页面目录项提供硬件保护。当一个权限级别为3的进程想要访问一个页面时,它需要通过页面保护来检查,一个特权级别为0的进程可以绕过页面保护。
第三个是PWT(页写过),这意味着无论写或写。写的方法是写ram和写缓存。这个位是1。它意味着使用写入模式。
第四位是PCD(页缓存禁用)位,指示是否启用了缓存,并且位为1,以便启用缓存。
第五位是访问位,当访问页面目录条目时,位是= 1。
第七位是页大小的国旗,这是只适用于页目录项。如果它被设置为1,页目录项指的是4MB的页。请看后面的扩展分页。
9~11位专用于操作系统,Linux没有用于特殊用途。
页项目
80386,每个页面目录条目指向一个页面表。页面表包含1024个页面项,每个项目4个字节,包括页面的初始地址和页面的信息。页面的起始地址也是4K的整数倍,所以页面的下12位也用于它。
31~12位是20个物理页地址。除了第六位,5位和9 ~零到11位作为页目录项。第六是页面项目唯一。在写页面时,d位放在1位。
4gb内存中只有一个页目录,至多有1024页和1024页目录项,每个页目录项。因此,记忆可以分为1024times页和1024 = 1m页。由于每一页是4K字节,内存的大小就达4GB的多。
线性地址到物理地址的转换
32位线性地址到物理地址的转换
1.cr3包含页目录的起始地址。它采用最高10位A31 ~ A22 32位线性地址的页目录页目录项的索引,乘以4,加上CR3页目录的起始地址形成对应的页表地址。
2。32位的页目录项是从指定的地址,它的低12位是0,和32的页表的起始地址,使用A21 ~ A12位在32位的线性地址的页表的页的索引,乘以4,加对页表的起始地址,并形成一个32位的页面地址。
三.把所有~ A0为偏移相对于网页地址加32位页地址,形成一个32位的物理地址。
扩展分页
从奔腾处理器,英特尔微处理器引入扩展分页,它允许一个页面的大小为4mb。
在扩展分页的情况下,分页机制将32位线性地址分成两个域:最大的10位目录域和剩余的22位偏移量。
页面缓存
在分页的情况下,每一个内存访问已经访问了两级页表,大大减少了访问的速度。因此,为了提高速度,成立于386是一个最近访问的页面缓存的硬件机制,它会自动保持32处理器的页地址最近,所以它可以覆盖128K字节的内存地址访问存储器时,检查是否该页被访问的缓存中。如果不需要经过两个级别的访问,如果不存在,那么就进行两级访问,平均而言,页面缓存的命中率大约为98%,这意味着每个访问内存中只有2%访问两个分页机制,这大大加快了速度。
linux中的分页机制
Linux使用一种适合32位和64位系统的分页机制。
页全局目录
页面顶部的目录
页中间目录
页表
页面全局目录包含高级目录地址的几个页面。页目录包含几个中间目录地址和页面中间目录包含多个页表地址。每个页表项指向一个页框,因此线性地址分为五个部分。在这个图上有没有数字数,因为各部分的尺寸是特定的计算机体系结构相关。
两级页表是足够的32位系统,没有物理地址扩展。在本质上,Linux完全取消了页面上的目录和页面中的网页目录领域,上级目录,点目录页面中,点,和所有的0。然而,这页上级目录的位置和指针序列中间目录保存,相同的代码可以在32位系统和64位系统,页目录和页中间目录保留一个位置的内核,使他们通过页目录的数量设置为1,和两页全局目录目录映射一个适当的目录项和实施。
32位系统已经启用物理地址扩展采用三级页表。Linux的页全局目录对应80times;86页目录指针表(PdPt),取消了页面上的目录,这页中间目录对应80times,86页目录,Linux的页表对应80times,和86页表。
最后,在三位系统上使用64位或四位分页取决于硬件分区到线性地址的位置。
总结
这里我们不讨论代码实现,我们只关注原理,从上面的讨论可以看出,分页机制主要依赖于硬件的实现,Linux使用的四级页表只是为了最大限度地实现不同硬件实现的兼容性。在IA32的CPU,有很多分页的实现,常规的分页机制,PAE机制等。
虽然我们是在谈论Linux的分页机制,我们利用网页的很大一部分讨论英特尔CPU的分页机制的实现。由于Linux的分页机制是基于硬件的,不同的平台有不同的实现。在虚拟地址的软件结构水平的Linux,并最终通过MMU转换成物理地址,也就是说,无论是Linux的分页机制是如何实现的CPU,只能按照其寻呼解释线性地址,所以Linux线性地址CPU绑定实现全足硬件。例如,Linux是在32位CPU和其四级页表结构将两级页STR兼容的硬件结构。可以看出,Linux已经在软件层面做了一个抽象的概念,在不同的硬件实现32位和64个四级页表位CPU内存寻址兼容。