Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138854
  • 博文数量: 40
  • 博客积分: 673
  • 博客等级: 上士
  • 技术积分: 426
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-21 14:08
文章分类

全部博文(40)

文章存档

2013年(4)

2012年(36)

我的朋友

分类: LINUX

2012-05-28 19:28:26

/*
*伪代码,示例
*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);
阅读(1491) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~