手动玩转虚拟地址到物理地址转化
我们这次来根据dump动手来实际转化一个虚拟地址到物理地址,此次的地址不是线性地址映射。
Target_Address_|________________logical|_physical______________|| C:FFFFFF8008015000| A:C549F000
上面0xFFFFFF8008015000就是虚拟地址,而我们努力的方向就是物理地址:0xC549F000。 让我们朝这个方向一路高歌吧。
转化的原理:
- 根据TTBR(0/1)寄存器获取到页表的基地址
- 页表基地址+PGD_Index获取PGD表中的一项,此项就是PMD表的基地址
- 根据PDM基地址+PMD_Index获取PMD中的一项,此项就是PTE表的基地址
- 根据PTE基地址+PTE_Index获取直接页表的基地址
- 根据直接页表的地址+offset就可以获取真正的物理地址
转化之前先确认的是此地址是属于用户空间还是内核空间。
- 用户地址:页表的基地址是mm_struct→pgd
- 内核空间: 页表的基地址是init_mm→pgd
很明显我们需要转化的地址是属于内核空间的,则首先需要确认init_mm→pgd的值,它来了
init_mm = (mmap = 0x0,mm_rb = (rb_node = 0x0),vmacache_seqnum = 0x0,mm_rb_lock = (raw_lock = (cnts = (counter = 0x0), wlocked = 0x0, __lstate = (0x0, 0x0, 0x0), waiget_unmapped_area = 0x0,mmap_base = 0x0,mmap_legacy_base = 0x0,task_size = 0x0,highest_vm_end = 0x0,pgd_=_0xFFFFFF9B4FCA7000 -> ( //虚拟地址pgd = 0x000000017AC05003), //虚拟地址里面的值mm_users = (counter = 0x2),mm_count = (counter = 0x1),
前期条件:
- 虚拟地址:0xFFFFFF8008015000
- init_mm→pgd的值:0xFFFFFF9B4FCA7000
PGD_Index = 虚拟地址>>30位 = (0xFFFFFF8008015000 >>30)&(0x200-1) = 0
PGD_entry_virt = 0xFFFFFF9B4FCA7000 + 0*8 = 0xFFFFFF9B4FCA7000
PGD_entry_phy = rd(0xFFFFFF9B4FCA7000) = 0x000000017AC05003
PMD_Index = 虚拟地址 >> 21位 = (0xFFFFFF8008015000 >>21)&(0x1ff) = 0x40
PMD_entry_virt = 0x000000017AC05003 + 0x40 * 8 = 0x000000017AC05000 + 0x40 *8 = 0x17AC05200
PMD_entry_phy = rd(0x17AC05200) = 0x17AC06003
PTE_Index = 虚拟地址 >> 12位 = (0xFFFFFF8008015000>>12)&(0x200-1)=0x15
PTE_entry_virt = 0x17AC06003 + 0x15 * 8 = 0x17AC06000 + 0x15*8= 0x17AC060A8
PTE_entry_phy = rd(0x17AC060A8) = 0xE00000C549F793
pfn = 0xE00000C549F793 >> 12 = 0xC549F
物理地址 = 0xC549F000 + 0x000 = 0xC549F000
上面之所以需要清空低12位,还有index*8都是因为页表的低12位存储着一些flag,这些flag如下,比如T32
- present的意思是页是否是有效的,无效代表虚拟到物理地址之间的转化无效,当访问虚拟地址的时候就会page fault
- protection :权限之类的,是否读写执行权限之类的。如果你访问一段虚拟地址,页表中是无法执行的权限,但是你想执行这段代码就会出错
- reference: 引用之类的
- cache: cache是否有效。有效就从cache取,无效从memory
- dirty: 是否写过,写过就代表脏。在内存不够时需要写会处理的。
手动玩转虚拟地址到物理地址转化相关推荐
- ARM32页表-虚拟地址到物理地址的转换
ARM32的页表 页表就是用于将虚拟地址转换为物理地址的转换关系表.访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问. 我们在上一节介绍了内存管理模块概图, 怎么完成从pgd 到 page的转 ...
- linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址
我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...
- OS实战笔记(4)-- 虚拟地址和物理地址的转换
在大学的时候,<操作系统原理>这门课我没有好好听,里面讲到过虚拟地址的相关知识.虽然在大学的时候,接过一两个项目(代码写的很烂,哈哈),偶尔也会自己练习几个编程题.但对虚拟地址.物理地址的 ...
- 虚拟存储器--虚拟地址与物理地址
计算机在执行程序时.需将代码载入入内存中.CPU读取内存中的代码并执行. 早期的计算机在没有引入 虚拟存储器之前,需将整个待执行的程序载入到内存中,由于内存空间有限,当待载入的程序过大时就会出现故障( ...
- Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
...
- 64位进程隐藏不蓝屏_浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法...
前言 有好久没更新了,这段时间发生了挺多大喜事哈.但是也还是有挺久没更新了,不得不意识到自己是个小菜鸡,就算是小菜鸡也要做一只快乐小菜鸡.就算更新慢但是我依然会持续更新,因为更文使我快乐. 虚拟内存 ...
- 用户的虚拟地址 linux 0 4gb,Linux驱动虚拟地址和物理地址的映射
一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G. 用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间. ...
- Linux虚拟地址和物理地址的映射
➤背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核 ...
- 简单的键盘按键记录(无码)/虚拟地址转物理地址/生成随机字符串/计算字符串哈希
最近看到 一个 样本 ,里面有键盘 按键记录的功能 ,而且 实现也比较 简单,运行 记录 的效果还 不错 .主要思路如下 : //假代码 int i=0;for(i=0;i<0x100;i++) ...
- 虚拟地址 虚拟内存 物理地址
物理内存和虚拟内存 我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存. 2.虚拟内存:对内 ...
最新文章
- 视频动作识别--Towards Good Practices for Very Deep Two-Stream ConvNets
- SAP HANA:持续创新十周年
- shell 实现memcache缓存命中率监控脚本
- 新冠疫苗厂商科兴成立房地产公司?网友:准备打疫苗送房子了?
- 一周一论文(翻译)——[SIGMOD 2015] Congestion Control for Large-Scale RDMA
- html5 长链接,Vue通过WebSocket建立长连接,连接
- 如何离线安装chrome插件
- Silverlight 4 的打印支持
- DE12 Continuation: General Theory for Inhomogeneous ODEs
- 常见的网络流量识别技术
- 艾司博讯:拼多多怎么设置团长ID?团长权限?
- 20201228攻防世界WEB模块入门级别全详解通关记录
- Carsim-simulink联合仿真注意事项
- matlab 三围温度,matlab 两个二维温度场平面如何通过插值立体重建三维温度场
- 【2012级新生请猛击】NEW COMER FIRST BLOOD 完全题解及代码
- axios获取发起请求的地址 vue_axios安装,发送地址请求实例
- Google网上应用店的网址
- pytorch版本对应
- oracle+odac的作用,ODAC简介
- 淘宝API开发系列:item_fee-淘宝/天猫获得淘宝商品快递费用 API 返回值说明
热门文章
- phpcms v9二次开发之模型类的应用(2)
- java 修饰关键字_java——关键字以及修饰属性
- A Deep Learning Tutorial: From Perceptrons to Deep Networks
- docker搭建sonarqube做代码审计
- 快速学习nodejs系列:四、nodejs特性1--单线程
- 完全总结bash中的条件判断test [ [[ 使用
- 18.11 LVS DR模式搭建
- HTML5新标签-Video
- 使用runtime跳转界面
- JavaScript深入之从原型到原型链 1