ARM32的页表
页表就是用于将虚拟地址转换为物理地址的转换关系表。访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问。
我们在上一节介绍了内存管理模块概图,
怎么完成从pgd 到 page的转化呢?
linux 内核code是通过follow_page来完成的,原型如下:
static inline struct page *follow_page(struct vm_area_struct *vma,unsigned long address, unsigned int foll_flags)
主要分成2步:
1. 由虚拟地址vaddr通过查询页表找到pte;
2. 由pte找出页帧号pfn,然后在mem_map[]中找到相应的struct page结构。
这2步可以细化为如下几步:
a. vma得到其所属的mm;
b. mm->pgb(进程页表pgb的起始位置)
c. mm->pgb 和 address 得到 address对应的pgd
#define PGDIR_SHIFT 21
/* to find an entry in a page-table-directory */
#define pgd_index(addr) ((addr) >> PGDIR_SHIFT)#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
d. pgd得到pte
在ARM页表中,无pud和pmd,如下代码中的pmd就是步骤c中得到的pgd.
ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
#define pte_offset_map_lock(mm, pmd, address, ptlp)
({
spinlock_t *__ptl = pte_lockptr(mm, pmd);
pte_t *__pte = pte_offset_map(pmd, address);
*(ptlp) = __ptl;
spin_lock(__ptl);
__pte;
})
#define pte_offset_map(pmd,addr) (__pte_map(pmd) + pte_index(addr))
e. pte得到pfn
unsigned long pfn = pte_pfn(pte);
#define pte_pfn(pte) ((pte_val(pte) & PHYS_MASK) >> PAGE_SHIFT)
f. pfn得到page
page = vm_normal_page(vma, address, pte);
https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page函数进行注释,以帮助读者大致了解ARM A9的页表组织。 读者需要理解一些基本概念:虚拟地址、物理地址、MPU、MMU、ARM中的二级...
1 引用页写为 {pc:content action="lists" catid="10" order="updatetime DESC" thumb="0" num="1" page="$_GET['page']"}{loop $data $v}....{/loop}{$pages} {/pc}2 phpcms/libs/fu...
常用变量: * - $base_path: Drupal 的安装路径,默认一般为“/” * - $directory: template 所在的目录, 如: modules/system 、 themes/bartik. * - $is_front: 如果当前页面为首页则为真(TRUE)。 * - $logged_in: 如果...