我们这次来根据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: 是否写过,写过就代表脏。在内存不够时需要写会处理的。

手动玩转虚拟地址到物理地址转化相关推荐

  1. ARM32页表-虚拟地址到物理地址的转换

    ARM32的页表 页表就是用于将虚拟地址转换为物理地址的转换关系表.访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问. 我们在上一节介绍了内存管理模块概图, 怎么完成从pgd 到 page的转 ...

  2. linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址

    我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...

  3. OS实战笔记(4)-- 虚拟地址和物理地址的转换

    在大学的时候,<操作系统原理>这门课我没有好好听,里面讲到过虚拟地址的相关知识.虽然在大学的时候,接过一两个项目(代码写的很烂,哈哈),偶尔也会自己练习几个编程题.但对虚拟地址.物理地址的 ...

  4. 虚拟存储器--虚拟地址与物理地址

    计算机在执行程序时.需将代码载入入内存中.CPU读取内存中的代码并执行. 早期的计算机在没有引入 虚拟存储器之前,需将整个待执行的程序载入到内存中,由于内存空间有限,当待载入的程序过大时就会出现故障( ...

  5. Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)

                                                                                                        ...

  6. 64位进程隐藏不蓝屏_浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法...

    前言 有好久没更新了,这段时间发生了挺多大喜事哈.但是也还是有挺久没更新了,不得不意识到自己是个小菜鸡,就算是小菜鸡也要做一只快乐小菜鸡.就算更新慢但是我依然会持续更新,因为更文使我快乐. 虚拟内存 ...

  7. 用户的虚拟地址 linux 0 4gb,Linux驱动虚拟地址和物理地址的映射

    一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G. 用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间. ...

  8. Linux虚拟地址和物理地址的映射

    ➤背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核 ...

  9. 简单的键盘按键记录(无码)/虚拟地址转物理地址/生成随机字符串/计算字符串哈希

    最近看到 一个 样本 ,里面有键盘 按键记录的功能 ,而且 实现也比较 简单,运行 记录 的效果还 不错 .主要思路如下 : //假代码 int i=0;for(i=0;i<0x100;i++) ...

  10. 虚拟地址 虚拟内存 物理地址

    物理内存和虚拟内存 我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存. 2.虚拟内存:对内 ...

最新文章

  1. 视频动作识别--Towards Good Practices for Very Deep Two-Stream ConvNets
  2. SAP HANA:持续创新十周年
  3. shell 实现memcache缓存命中率监控脚本
  4. 新冠疫苗厂商科兴成立房地产公司?网友:准备打疫苗送房子了?
  5. 一周一论文(翻译)——[SIGMOD 2015] Congestion Control for Large-Scale RDMA
  6. html5 长链接,Vue通过WebSocket建立长连接,连接
  7. 如何离线安装chrome插件
  8. Silverlight 4 的打印支持
  9. DE12 Continuation: General Theory for Inhomogeneous ODEs
  10. 常见的网络流量识别技术
  11. 艾司博讯:拼多多怎么设置团长ID?团长权限?
  12. 20201228攻防世界WEB模块入门级别全详解通关记录
  13. Carsim-simulink联合仿真注意事项
  14. matlab 三围温度,matlab 两个二维温度场平面如何通过插值立体重建三维温度场
  15. 【2012级新生请猛击】NEW COMER FIRST BLOOD 完全题解及代码
  16. axios获取发起请求的地址 vue_axios安装,发送地址请求实例
  17. Google网上应用店的网址
  18. pytorch版本对应
  19. oracle+odac的作用,ODAC简介
  20. 淘宝API开发系列:item_fee-淘宝/天猫获得淘宝商品快递费用 API 返回值说明

热门文章

  1. phpcms v9二次开发之模型类的应用(2)
  2. java 修饰关键字_java——关键字以及修饰属性
  3. A Deep Learning Tutorial: From Perceptrons to Deep Networks
  4. docker搭建sonarqube做代码审计
  5. 快速学习nodejs系列:四、nodejs特性1--单线程
  6. 完全总结bash中的条件判断test [ [[ 使用
  7. 18.11 LVS DR模式搭建
  8. HTML5新标签-Video
  9. 使用runtime跳转界面
  10. JavaScript深入之从原型到原型链 1