日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);

總結

以上是生活随笔為你收集整理的ARM32页表-虚拟地址到物理地址的转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。