回覆列表
  • 1 # 使用者8461021162376

    /*

    *虛擬碼,示例

    *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);

  • 中秋節和大豐收的關聯?
  • 只穿潛水服需要配重嗎?