首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于80x86的Linux的分段和分页机制(6)

基于80x86的Linux的分段和分页机制(6)

如果 PAE 被激活,内核使用三级页表。当内核创建一个新的页全局目录时,同时也分配四个相应的页中间目录;只有当父页全局目录被释放时,这四个页中间目录才得以释放。当使用两级或三级分页时,页上级目录项总是被映射为页全局目录中的一个单独项。与以往一样,下表中列出的函数描述是针对 80x86 构架的。
函数名称
说明
pgd_alloc( mm )
分配一个新的页全局目录。如果 PAE 被激活,它还分配三个对应用户态线性地址的子页中间目录。参数 mm( 内存描述符的地址 ) 80x86 构架上被忽略。
pgd_free( pgd)
释放页全局目录中地址为 pgd 的项。如果 PAE 被激活,它还将释放用户态线性地址对应的三个页中间目录。
pud_alloc(mm, pgd, addr)
在两级或三级分页系统下,这个函数什么也不做:它仅仅返回页全局目录项 pgd 的线性地址。
pud_free(x)
在两级或三级分页系统下,这个宏什么也不做。
pmd_alloc(mm, pud, addr)

定义这个函数以使普通三级分页系统可以为线性地址 addr 分配一个新的页中间目录。如果 PAE 未被激活,这个函数只是返回输入参数 pud 的值,也就是说,返回页全局目录中目录项的地址。如果 PAE 被激活,该函数返回线性地址 addr 对应的页中间目录项的线性地址。参数 mm 被忽略。
pmd_free(x)
该函数什么也不做,因为页中间目录的分配和释放是随同它们的父全局目录一同进行的。
pte_alloc_map(mm, pmd, addr)
接收页中间目录项的地址 pmd 和线性地址 addr 作为参数,并返回与 addr 对应的页表项的地址。如果页中间目录项为空,该函数通过调用函数 pte_alloc_one() 分配一个新页表。如果分配了一个新页表, addr 对应的项就被创建,同时 User/Supervisor标志被设置为 1 。如果页表被保存在高端内存,则内核建立一个临时内核映射,并用 pte_unmap 对它进行释放。
pte_alloc_kernel(mm, pmd, addr)
如果与地址 addr 相关的页中间目录项 pmd 为空,该函数分配一个新页表。然后返回与 addr 相关的页表项的线性地址。该函数仅被主内核页表使用。
pte_free(pte)
释放与页描述符指针 pte 相关的页表。
pte_free_kernel(pte)
等价于 pte_free() ,但由主内核页表使用。
clear_page_range(mmu, start,end)
从线性地址 start end 通过反复释放页表和清除页中间目录项来清除进程页表的内容。

3 扩展分页
  从奔腾处理器开始,Intel微处理器引进了扩展分页,它允许页的大小为4MB,如图所示:


  在扩展分页的情况下,分页机制把32位线性地址分成两个域:最高10位的目录域和其余22位的偏移量。

4 页面高速缓存
由于在分页情况下,每次存储器访问都要存取两级页表,这就大大降低了访问速度。所以,为了提高速度,在386中设置一个最近存取页面的高速缓存硬件机制,它自动保持32项处理器最近使用的页面地址,因此,可以覆盖128K字节的存储器地址。当进行存储器访问时,先检查要访问的页面是否在高速缓存中,如果在,就不必经过两级访问了,如果不在,再进行两级访问。平均来说,页面高速缓存大约有98%的命中率,也就是说每次访问存储器时,只有2%的情况必须访问两级分页机构。这就大大加快了速度,页面高速缓存的作用如图所示。有些书上也把页面高速缓存叫做“联想存储器”或“转换旁视缓冲器(TLB)”。

继承事业,薪火相传
返回列表