学堂 学堂 学堂公众号手机端

虚拟地址挂靠,linux中虚拟地址和物理地址怎样映射

kuaicai 1个月前 (12-18) 阅读数 7 #北京工商注册
文章标签 地址映射物理

/*
*伪代码,示例
*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(物理地址是 %xn,real_addr);
return;

out:
printk(没有内存映射,real_addr);

版权声明

本文仅代表作者观点,不代表xx立场。
本文系作者授权xx发表,未经许可,不得转载。

热门