用户虚拟地址转换成物理地址
最近做opengl模拟器的时候,需要从用户虚拟地址得到实际的物理地址,在网上找到一个不错的参考(http://www.eefocus.com/html/09-05/71993s.shtml),稍微修改了一下(用current替代了find_task_by_pid.
- #include <linux/sched.h>
- #include <linux/mm.h>
- #include <asm/pgtable.h>
- #include <asm/page.h>
- static int v2p(unsigned long va)
- {
- unsigned long pa = 0;
- struct task_struct *pcb_tmp;
- pgd_t *pgd_tmp = NULL;
- pud_t *pud_tmp = NULL;
- pmd_t *pmd_tmp = NULL;
- pte_t *pte_tmp = NULL;
- printk(KERN_INFO"PAGE_OFFSET = 0x%lx\n",PAGE_OFFSET);
- printk(KERN_INFO"PGDIR_SHIFT = %d\n",PGDIR_SHIFT);
- printk(KERN_INFO"PUD_SHIFT = %d\n",PUD_SHIFT);
- printk(KERN_INFO"PMD_SHIFT = %d\n",PMD_SHIFT);
- printk(KERN_INFO"PAGE_SHIFT = %d\n",PAGE_SHIFT);
- printk(KERN_INFO"PTRS_PER_PGD = %d\n",PTRS_PER_PGD);
- printk(KERN_INFO"PTRS_PER_PUD = %d\n",PTRS_PER_PUD);
- printk(KERN_INFO"PTRS_PER_PMD = %d\n",PTRS_PER_PMD);
- printk(KERN_INFO"PTRS_PER_PTE = %d\n",PTRS_PER_PTE);
- printk(KERN_INFO"PAGE_MASK = 0x%lx\n",PAGE_MASK);
- pcb_tmp = current;
- printk(KERN_INFO"pgd = 0x%p\n",pcb_tmp->mm->pgd);
- if(!find_vma(pcb_tmp->mm,va)){
- printk(KERN_INFO"virt_addr 0x%lx not available.\n",va);
- return 0;
- }
- pgd_tmp = pgd_offset(pcb_tmp->mm,va);
- printk(KERN_INFO"pgd_tmp = 0x%p\n",pgd_tmp);
- printk(KERN_INFO"pgd_val(*pgd_tmp) = 0x%lx\n",pgd_val(*pgd_tmp));
- if(pgd_none(*pgd_tmp)){
- printk(KERN_INFO"Not mapped in pgd.\n");
- return 0;
- }
- pud_tmp = pud_offset(pgd_tmp,va);
- printk(KERN_INFO"pud_tmp = 0x%p\n",pud_tmp);
- printk(KERN_INFO"pud_val(*pud_tmp) = 0x%lx\n",pud_val(*pud_tmp));
- if(pud_none(*pud_tmp)){
- printk(KERN_INFO"Not mapped in pud.\n");
- return 0;
- }
- pmd_tmp = pmd_offset(pud_tmp,va);
- printk(KERN_INFO"pmd_tmp = 0x%p\n",pmd_tmp);
- printk(KERN_INFO"pmd_val(*pmd_tmp) = 0x%lx\n",pmd_val(*pmd_tmp));
- if(pmd_none(*pmd_tmp)){
- printk(KERN_INFO"Not mapped in pmd.\n");
- return 0;
- }
- pte_tmp = pte_offset_kernel(pmd_tmp,va);
- printk(KERN_INFO"pte_tmp = 0x%p\n",pte_tmp);
- printk(KERN_INFO"pte_val(*pte_tmp) = 0x%lx\n",pte_val(*pte_tmp));
- if(pte_none(*pte_tmp)){
- printk(KERN_INFO"Not mapped in pte.\n");
- return 0;
- }
- if(!pte_present(*pte_tmp)){
- printk(KERN_INFO"pte not in RAM.\n");
- return 0;
- }
- pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
- printk(KERN_INFO"virt_addr 0x%lx in RAM is 0x%lx .\n",va,pa);
- printk(KERN_INFO"contect in 0x%lx is 0x%lx\n",pa,
- *(unsigned long *)((char *)pa + PAGE_OFFSET));
- return 0;
- }
转载于:https://blog.51cto.com/buaadallas/353161
用户虚拟地址转换成物理地址相关推荐
- Linux内核学习3——虚拟地址转换成物理地址
这里,我们讲解一下Linux是如何将虚拟地址转换成物理地址的 一.地址转换 在进程中,我们不直接对物理地址进行操作,CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存. 地址转换的过 ...
- 虚拟地址转换成物理地址
题目: 某虚拟存储器的用户空间共有32个页面,每页1K,主存16K,假定某时刻系统为用户的第0.1.2.3页分配的物理块号为5.10.4.7,而该用户作业的长度为6页, 将十六进制的虚拟地址0A5CH ...
- 【分页存储管理】将十六进制的虚拟地址0A5C、103C、4251转换成物理地址
某虚拟存储器的用户空间为32个页面,每页1KB,主存16KB.假定某时刻为用户第0.1.2.3页分配的物理块号为5.10.4.7,该作业长度为5页,将十六进制的虚拟地址0A5C.103C.4251转换 ...
- 用户工号转换成姓名加工号
/** * 用户工号转换成姓名加工号 <功能详细描述> * * @param usersName * @return [参数说明] * * @return String [返回类型说明 ...
- 线性地址转换成物理地址
上篇文章介绍了如何查看内核使用的分页模式,笔者电脑上内核使用的分页模式是 4-level paging,这篇文章讲解 4-level paging分页模式如何将线性地址转换成物理地址. 先思考2个问题 ...
- 如何将逻辑地址转换成物理地址
转自 https://zhidao.baidu.com/question/629761729592715004.html 逻辑地址如bai何转换成物理du地址 1.确定虚拟地址(物理地址)zhi的有效 ...
- 【Linux内核分析与应用-陈莉君老师】动手实践-把虚拟内存转换成物理地址
目录 1.地址转换 2.Linux4级页表 3.64位线性地址 4.实际观察寻页的过程 1.地址转换 进程中不直接对物理地址直接操作,CPU在运行时指定的地址需要经过内存管理单元MMU 转换后才能访 ...
- 虚拟地址 线性地址 物理地址 傻傻分不清楚?
Virtual address Linear address Physic address 先说说逻辑地址: 我们时常会看到一种地址的表述方式--segment:offset.比方0x0:0x7c ...
- linux c 将虚拟地址转化为物理地址_面试不懂 Linux 内存管理?我用 20 张图给你讲明白...
微信搜索公众号「 后端技术学堂 」回复「1024」获取50本计算机电子书,回复「学习路线」获取超详细后端技术学习路线思维导图,文章每周持续更新,我们下期见! 大家好,我是柠檬哥. 分享编程学习,助力程 ...
最新文章
- iptables从入门到放弃
- Java学习之javassist
- 数据中心液体冷却方案正在兴起的五大原因
- 【PAT乙级】1053 住房空置率 (20 分)
- boost::function/bind
- No authorization to log on as a Trusted System
- 《ANSYS 14热力学/电磁学/耦合场分析自学手册》——2.8 工具条
- oracle varchar2() 占几个字母,Oracle number date varchar2字段类型占用空间大小
- python 数据类型和控制流程
- 关于java方法的重载(Overloading),覆写(Override)以及final 方法的几点说明
- Python 数据结构与算法——二叉搜索树的实现
- WCF问题:“HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理”解决方法...
- UITableView的tableHeaderView和viewForHeaderInSection區別
- 【ACL20】让笨重的BERT问答匹配模型变快!
- 年度重磅!2020年度中国计算机视觉人才调研报告正式发布
- 【图像加密】基于matlab GUI彩色图像加密解密(带面板)【含Matlab源码 1231期】
- java 29期淘淘商城_JavaEE大型分布式电商项目 淘淘商城 29期
- 第二章 Python数据类型和运算符
- w7设置双显示器_win7系统设置双显示器多屏幕模式的操作方法
- 医用试管标签二维码方案研究
热门文章
- redis事务乐观锁,watch
- c++如何实现对硬盘的操作_如何使用Python实现自动化点击鼠标和操作键盘?
- python __xxxitem__
- python metaclass应用
- 网络连接方式 NAT
- 4.2 前向和反向传播
- python语言在命名上是什么敏感的_一文轻松掌握python语言命名规范规则
- vhdl语言入门_初学Chisel语言,看这篇就够了:最方便简洁的入门资料整理
- 腾讯数据库专家多年运维经验凝聚成简,总结这份595页工作笔记
- VMware虚拟化上安装F5负载均衡系统(BIG-IP LTM)