最近做opengl模拟器的时候,需要从用户虚拟地址得到实际的物理地址,在网上找到一个不错的参考(http://www.eefocus.com/html/09-05/71993s.shtml),稍微修改了一下(用current替代了find_task_by_pid.

  1. #include <linux/sched.h>
  2. #include <linux/mm.h>
  3. #include <asm/pgtable.h>
  4. #include <asm/page.h>
  5. static int v2p(unsigned long va)
  6. {
  7. unsigned long pa = 0;
  8. struct task_struct *pcb_tmp;
  9. pgd_t *pgd_tmp = NULL;
  10. pud_t *pud_tmp = NULL;
  11. pmd_t *pmd_tmp = NULL;
  12. pte_t *pte_tmp = NULL;
  13. printk(KERN_INFO"PAGE_OFFSET = 0x%lx\n",PAGE_OFFSET);
  14. printk(KERN_INFO"PGDIR_SHIFT = %d\n",PGDIR_SHIFT);
  15. printk(KERN_INFO"PUD_SHIFT = %d\n",PUD_SHIFT);
  16. printk(KERN_INFO"PMD_SHIFT = %d\n",PMD_SHIFT);
  17. printk(KERN_INFO"PAGE_SHIFT = %d\n",PAGE_SHIFT);
  18. printk(KERN_INFO"PTRS_PER_PGD = %d\n",PTRS_PER_PGD);
  19. printk(KERN_INFO"PTRS_PER_PUD = %d\n",PTRS_PER_PUD);
  20. printk(KERN_INFO"PTRS_PER_PMD = %d\n",PTRS_PER_PMD);
  21. printk(KERN_INFO"PTRS_PER_PTE = %d\n",PTRS_PER_PTE);
  22. printk(KERN_INFO"PAGE_MASK = 0x%lx\n",PAGE_MASK);
  23. pcb_tmp = current;
  24. printk(KERN_INFO"pgd = 0x%p\n",pcb_tmp->mm->pgd);
  25. if(!find_vma(pcb_tmp->mm,va)){
  26. printk(KERN_INFO"virt_addr 0x%lx not available.\n",va);
  27. return 0;
  28. }
  29. pgd_tmp = pgd_offset(pcb_tmp->mm,va);
  30. printk(KERN_INFO"pgd_tmp = 0x%p\n",pgd_tmp);
  31. printk(KERN_INFO"pgd_val(*pgd_tmp) = 0x%lx\n",pgd_val(*pgd_tmp));
  32. if(pgd_none(*pgd_tmp)){
  33. printk(KERN_INFO"Not mapped in pgd.\n");
  34. return 0;
  35. }
  36. pud_tmp = pud_offset(pgd_tmp,va);
  37. printk(KERN_INFO"pud_tmp = 0x%p\n",pud_tmp);
  38. printk(KERN_INFO"pud_val(*pud_tmp) = 0x%lx\n",pud_val(*pud_tmp));
  39. if(pud_none(*pud_tmp)){
  40. printk(KERN_INFO"Not mapped in pud.\n");
  41. return 0;
  42. }
  43. pmd_tmp = pmd_offset(pud_tmp,va);
  44. printk(KERN_INFO"pmd_tmp = 0x%p\n",pmd_tmp);
  45. printk(KERN_INFO"pmd_val(*pmd_tmp) = 0x%lx\n",pmd_val(*pmd_tmp));
  46. if(pmd_none(*pmd_tmp)){
  47. printk(KERN_INFO"Not mapped in pmd.\n");
  48. return 0;
  49. }
  50. pte_tmp = pte_offset_kernel(pmd_tmp,va);
  51. printk(KERN_INFO"pte_tmp = 0x%p\n",pte_tmp);
  52. printk(KERN_INFO"pte_val(*pte_tmp) = 0x%lx\n",pte_val(*pte_tmp));
  53. if(pte_none(*pte_tmp)){
  54. printk(KERN_INFO"Not mapped in pte.\n");
  55. return 0;
  56. }
  57. if(!pte_present(*pte_tmp)){
  58. printk(KERN_INFO"pte not in RAM.\n");
  59. return 0;
  60. }
  61. pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
  62. printk(KERN_INFO"virt_addr 0x%lx in RAM is 0x%lx .\n",va,pa);
  63. printk(KERN_INFO"contect in 0x%lx is 0x%lx\n",pa,
  64. *(unsigned long *)((char *)pa + PAGE_OFFSET));
  65. return 0;
  66. }

转载于:https://blog.51cto.com/buaadallas/353161

用户虚拟地址转换成物理地址相关推荐

  1. Linux内核学习3——虚拟地址转换成物理地址

    这里,我们讲解一下Linux是如何将虚拟地址转换成物理地址的 一.地址转换 在进程中,我们不直接对物理地址进行操作,CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存. 地址转换的过 ...

  2. 虚拟地址转换成物理地址

    题目: 某虚拟存储器的用户空间共有32个页面,每页1K,主存16K,假定某时刻系统为用户的第0.1.2.3页分配的物理块号为5.10.4.7,而该用户作业的长度为6页, 将十六进制的虚拟地址0A5CH ...

  3. 【分页存储管理】将十六进制的虚拟地址0A5C、103C、4251转换成物理地址

    某虚拟存储器的用户空间为32个页面,每页1KB,主存16KB.假定某时刻为用户第0.1.2.3页分配的物理块号为5.10.4.7,该作业长度为5页,将十六进制的虚拟地址0A5C.103C.4251转换 ...

  4. 用户工号转换成姓名加工号

    /** * 用户工号转换成姓名加工号 <功能详细描述> *  * @param usersName * @return [参数说明] *  * @return String [返回类型说明 ...

  5. 线性地址转换成物理地址

    上篇文章介绍了如何查看内核使用的分页模式,笔者电脑上内核使用的分页模式是 4-level paging,这篇文章讲解 4-level paging分页模式如何将线性地址转换成物理地址. 先思考2个问题 ...

  6. 如何将逻辑地址转换成物理地址

    转自 https://zhidao.baidu.com/question/629761729592715004.html 逻辑地址如bai何转换成物理du地址 1.确定虚拟地址(物理地址)zhi的有效 ...

  7. 【Linux内核分析与应用-陈莉君老师】动手实践-把虚拟内存转换成物理地址

    目录 1.地址转换 2.Linux4级页表 3.64位线性地址 4.实际观察寻页的过程  1.地址转换 进程中不直接对物理地址直接操作,CPU在运行时指定的地址需要经过内存管理单元MMU 转换后才能访 ...

  8. 虚拟地址 线性地址 物理地址 傻傻分不清楚?

    Virtual address  Linear address  Physic address 先说说逻辑地址: 我们时常会看到一种地址的表述方式--segment:offset.比方0x0:0x7c ...

  9. linux c 将虚拟地址转化为物理地址_面试不懂 Linux 内存管理?我用 20 张图给你讲明白...

    微信搜索公众号「 后端技术学堂 」回复「1024」获取50本计算机电子书,回复「学习路线」获取超详细后端技术学习路线思维导图,文章每周持续更新,我们下期见! 大家好,我是柠檬哥. 分享编程学习,助力程 ...

最新文章

  1. iptables从入门到放弃
  2. Java学习之javassist
  3. 数据中心液体冷却方案正在兴起的五大原因
  4. 【PAT乙级】1053 住房空置率 (20 分)
  5. boost::function/bind
  6. No authorization to log on as a Trusted System
  7. 《ANSYS 14热力学/电磁学/耦合场分析自学手册》——2.8 工具条
  8. oracle varchar2() 占几个字母,Oracle number date varchar2字段类型占用空间大小
  9. python 数据类型和控制流程
  10. 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明
  11. Python 数据结构与算法——二叉搜索树的实现
  12. WCF问题:“HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理”解决方法...
  13. UITableView的tableHeaderView和viewForHeaderInSection區別
  14. 【ACL20】让笨重的BERT问答匹配模型变快!
  15. 年度重磅!2020年度中国计算机视觉人才调研报告正式发布
  16. 【图像加密】基于matlab GUI彩色图像加密解密(带面板)【含Matlab源码 1231期】
  17. java 29期淘淘商城_JavaEE大型分布式电商项目 淘淘商城 29期
  18. 第二章 Python数据类型和运算符
  19. w7设置双显示器_win7系统设置双显示器多屏幕模式的操作方法
  20. 医用试管标签二维码方案研究

热门文章

  1. redis事务乐观锁,watch
  2. c++如何实现对硬盘的操作_如何使用Python实现自动化点击鼠标和操作键盘?
  3. python __xxxitem__
  4. python metaclass应用
  5. 网络连接方式 NAT
  6. 4.2 前向和反向传播
  7. python语言在命名上是什么敏感的_一文轻松掌握python语言命名规范规则
  8. vhdl语言入门_初学Chisel语言,看这篇就够了:最方便简洁的入门资料整理
  9. 腾讯数据库专家多年运维经验凝聚成简,总结这份595页工作笔记
  10. VMware虚拟化上安装F5负载均衡系统(BIG-IP LTM)