/*
*虛擬碼,示例
*32位地址,三級對映(沒有pud_t),頁面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虛擬地址,使用者空間所訪問的地址
unsigned long real_addr = 0x00;//要輸出的地址
struct task_struct *cur_task = get_current();//獲取當前程序控制塊
struct mm_struct *mm = cur_task -> mm;//程序虛擬空間
pgd_t *pgd;//描述頁全域性目錄項
pmd_t *pmd;//描述頁中間項
pte_t *pte;//頁表項
pgd = pgd_offset(mm, addr);//找出所在目錄
if (pgd_none(*pgd)){
goto out;
}
pmd = pmd_offset(pgd, addr);//找出所在中間項
if (pmd_none(*pmd)){
pte = pte_offset(pmd, addr);//找出所在頁面
if (pte_none(*pte)) {
//假設每頁4KB
real_addr = addr & 0x00003fff; //取出頁面偏移量
real_addr += pte;//核心空間訪問的地址
real_addr -= PAGE_OFFSET;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("沒有記憶體對映",real_addr);
/*
*虛擬碼,示例
*32位地址,三級對映(沒有pud_t),頁面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虛擬地址,使用者空間所訪問的地址
unsigned long real_addr = 0x00;//要輸出的地址
struct task_struct *cur_task = get_current();//獲取當前程序控制塊
struct mm_struct *mm = cur_task -> mm;//程序虛擬空間
pgd_t *pgd;//描述頁全域性目錄項
pmd_t *pmd;//描述頁中間項
pte_t *pte;//頁表項
pgd = pgd_offset(mm, addr);//找出所在目錄
if (pgd_none(*pgd)){
goto out;
}
pmd = pmd_offset(pgd, addr);//找出所在中間項
if (pmd_none(*pmd)){
goto out;
}
pte = pte_offset(pmd, addr);//找出所在頁面
if (pte_none(*pte)) {
goto out;
}
//假設每頁4KB
real_addr = addr & 0x00003fff; //取出頁面偏移量
real_addr += pte;//核心空間訪問的地址
real_addr -= PAGE_OFFSET;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("沒有記憶體對映",real_addr);