ARM32页表-虚拟地址到物理地址的转换

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);
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值