linux 读取内存颗粒,Linux虚拟内存地址转化成物理内存地址

201707258765_5255.jpg

背景

现代手机这种SOC(system on chip),因为功耗、Modem等功能soc上集成了很多core,他们还可以是独立的系统在运转。

比如ADSP简介ADSP(Application Digital Signal Processing)就是高通的Hexagon DSP ,就是独立运转的一个core+system。这样做不仅可以使用soc上的专用核处理专业的事情,比如上面说的ADSP就可以处理音频解码,当然它的DSP特性还可以处理sensor融合算法,比起通用处理器(cortex a72 a53 a17 a9 a8这些核)处理效率更高,更省电。

当然出于成本因素我们不会为它单独焊上一个内存颗粒,它共享了主存的一部分,比如从地址0xc0000000 - 0xc0100000 1MB的空间,此时内核(Linux运行在通用处理器上)将不再触碰这块内存。

但是多核共享同一个地址空间也有个弊端,就是如果程序有问题(野指针,数组越界)可能会写别的core管理的内存空间,这样给我们带来的问题就是程序的值莫名其妙的被改变了。我们为了排查这种问题,才考虑把应用程序的虚拟地址转化为物理地址,进行print debug以便于统一分析。

实现

kernel 在2.6.25的时候加入了这样一个功能/proc/self/pagemap 也就是在每个进程的/proc里面都有一个pagemap通过读取里面的内容就可以算出当前虚拟地址对应的物理页,然后加入page_offset就可以知道当前虚拟地址对应的物理地址。

pagemap需要你的应用有root权限才能使用。 #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   // 参考  // https://www.kernel.org/doc/Documentation/vm/pagemap.txt  #define    page_map_file     "/proc/self/pagemap"  #define    PFN_MASK          ((((uint64_t)1)<<55)-1)  #define    PFN_PRESENT_FLAG  (((uint64_t)1)<<63)  int mem_addr_vir2phy(unsigned long vir, unsigned long *phy)  {  int fd;  int page_size=getpagesize();  unsigned long vir_page_idx = vir/page_size;  unsigned long pfn_item_offset = vir_page_idx*sizeof(uint64_t);  uint64_t pfn_item;  fd = open(page_map_file, O_RDONLY);  if (fd<0)  {  fprintf(stderr, "open %s failed", page_map_file);  return -1;  }  if ((off_t)-1 == lseek(fd, pfn_item_offset, SEEK_SET))  {  fprintf(stderr, "lseek %s failed", page_map_file);  return -1;  }  if (sizeof(uint64_t) != read(fd, &pfn_item, sizeof(uint64_t)))  {  fprintf(stderr, "read %s failed", page_map_file);  return -1;  }  if (0==(pfn_item & PFN_PRESENT_FLAG))  {  fprintf(stderr, "page is not present");  return -1;  }  *phy = (pfn_item & PFN_MASK)*page_size + vir % page_size;  return 0;  }  int main(int argc, char* argv[]) {  unsigned long a = 0xffbbccaa;  unsigned long vir = reinterpret_cast(&a);  unsigned long phy = 0;  fprintf(stderr, "sizeof(unsigned long):%lu, sizeof(unsigned long*):%lu

", sizeof(unsigned long), sizeof(unsigned long*));  mem_addr_vir2phy(vir, &phy);  fprintf(stderr, "1 vir:0x%lx, phy: 0x%lx getchar to continue

", vir, phy);  getchar();  a = 0x11111111;  fprintf(stderr, "2 vir:0x%lx, phy: 0x%lx getchar to continue

", vir, phy);  getchar();  fprintf(stderr, "3 vir:0x%lx, phy: 0x%lx a:0x%lx

", vir, phy, a);  }

如何验证

你需要开启kernel如下模块

CONFIG_DEVMEM=y

关闭如下模块

CONFIG_STRICT_DEVMEM=n

一般的Android 都有/system/bin/r(源码在system/core/toolbox/r.c)这个命令,这个命令类似devmem之类的嵌入式工具,通过/dev/mem(物理内存)mmap来读取物理内存的值,当然你也可以修改该地址的值

上面的例子他们通过getchar() 阻止程序的运行,以便你有足够的时间来敲/system/bin/r命令和参数

命令用法,上面的例子我们取了一个栈上变量的虚拟地址,转换成物理地址。然后你就可以通过/system/bin/r来读取和修改这个地址的值了。

读取0x9a6f0b20地址的值 adb shell /system/bin/r 0x9a6f0b20

修改0x9a6f0b20地址的值为0xffbbccaa adb shell /system/bin/r 0x9a6f0b20 0xffbbccaa

源码可以直接git clone git@github.com:green130181/kernel-study.git

工程里的 pagemap直接拷贝到aosp的任意目录

然后aosp的根目录执行 source build/envsetup.sh  lunch "your select"  cd pagemap dir  mm

之后adb push 到你的机器,即可开始验证。

当然还有很多先进的比如ramdump Trace32来实现内存地址查看,不过上面的对于一个应用来讲足够轻量级,够用就好!

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

primefaces_PrimeFaces扩展中的全新JSF组件

primefacesPrimeFaces扩展团队很高兴宣布即将推出的3.0.0主要版本的几个新组件。 我们的新提交者Francesco Strazzullo为该项目提供了“ Turbo Boost”&#xff0c;并带来了至少6个已成功集成的 JSF组件&#xff01; 当前的开发状态是OpenShift上的deployet – 请查看展示柜。以…

linux数字设定法设定权限,Linux chmod命令详解和使用实例(改变文件或目录的访问权限)...

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为只读&#xff0c;只写和可执行三种。以文件为例&#xff0c;只读权限表示只允许读其内容&#xff0c;而禁止对其做任何的更改操作。…

Java 8 Stream中间操作(方法)示例

Java 8 Streams中间操作的完整指南。 所有内置Stream API中间操作&#xff08;方法&#xff09;的列表以及示例。 1.概述 在本教程中&#xff0c;我们将学习什么是 Java 8 Stream 中的中间操作 。 所有这些操作都在java.util.stream.Stream包中 。 在上一教程中&#xff0c;我…

linux服务 运维案例,linux运维实战练习案例-2015年12月20日-12月31日

1、创建一个10G的文件系统&#xff0c;类型为ext4&#xff0c;要求开机可自动挂载至单独数据/data目录&#xff1b;[[email protected] /]# cat /proc/partitionsmajor minor #blocks name8 0 52428800 sda8 1 204800 sda18 2 4096000 sda28 …

使用Quarkus调试容器中的系统测试(视频)

如果您能够借助容器在本地进行端到端测试应用程序&#xff0c;则可以提高开发效率。 在下面的视频中&#xff0c;我将展示如何使用Quarkus在Docker容器中调试本地系统测试。 这是我关于有效测试的视频课程的Quarkus扩展。 要了解全部情况&#xff0c;还可以查看以下资源&…

linux中memcpy实现分析,ARM64 的 memcpy 优化与实现

如何优化 memcpy 函数Linux 内核用到了许多方式来加强性能以及稳定性&#xff0c;本文探讨的 memcpy 的汇编实现方式就是其中的一种&#xff0c;memcpy 的性能是否强大&#xff0c;拷贝延迟是否足够低都直接影响着整个系统性能。通过对拷贝函数的理解可以加深对整个系统设计的一…

ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)

ejb生命周期这是两部分系列的第二篇。 第一部分介绍了有状态和无状态EJB的生命周期以及并发行为。 我将在本文中介绍Singleton EJB 。 Singleton模式可以说是最常用&#xff08;有时被滥用&#xff01;&#xff09;的模式。 单吨又爱它&#xff01; Java EE使我们无需编写显…

linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...

操作系统 RHEL5如果你在linux上执行了如下操作chmod -R 777 / 或者 chmod -R 700 /那么恭喜你&#xff0c;你的系统即将崩溃&#xff0c;重启之后&#xff0c;你进不了图形界面&#xff0c;而且很多服务都起不来为什么呢&#xff1f;因为linux中&#xff0c;系统的有些文件和目…

JDK 14 / JEP 305模式匹配“ Smart Casts”实例

我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”&#xff0c;这意味着在某些情况下使用instanceof不一定是错误的&#xff0c;但是使用它有时表示可以以一种更干净的方式解决设计问题&#xff0c;如所述本文末尾引用的一些资源中的内容&#xff08;包括有关Java以…

linux美化原理,x-window字体原理及美化

x-window字体原理及美化发布时间:2006-10-07 01:25:15来源:红联作者:caldo1. 简介在我必须处理的一堆讨厌事中&#xff0c;有一项就是没完没了的 X 缺省字体和字体设定 (我专指 XFree86&#xff0c;其它的 X 也许比较好)。有些程序缺省使用固定宽度字体 (fixed width fonts)&am…

易流即时配送_即时大数据流处理=即时风暴

易流即时配送在Ubuntu背后的公司Canonical&#xff0c;每6个月进行一次技术工作&#xff0c;以第一手测试我们的工具并向其他人展示新想法。 这次&#xff0c;我创建了一个即时大数据解决方案&#xff0c;更具体地讲是“即时风暴”。 Storm现在是Apache基金会的一部分&#xf…

c语言有参有类最小公倍数,【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数...

程序分析&#xff1a;在数学中&#xff0c;两个数的最小公倍数两个数的乘积/两数的最大公约数。求两个数的最大公约数&#xff0c;运用辗转相除法&#xff1a;已知两个整数M和N&#xff0c;假定M>N&#xff0c;则求M%N。如果余数为0&#xff0c;则N即为所求&#xff1b;如果…

csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现

试题编号&#xff1a;201509-3试题名称&#xff1a;日期计算 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述&#xff1a;成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&…

osgi架构与linux_OSGi:进入微服务架构的门户

osgi架构与linux在构建可扩展&#xff0c;可靠的分布式系统的背景下&#xff0c;“模块化”和“微服务体系结构”这两个术语如今经常出现。 众所周知&#xff0c;Java平台本身在模块化方面很弱&#xff08; Java 9将通过交付Jigsaw项目来解决此问题&#xff09;&#xff0c;这为…

引入我们全新的YouTube频道进行视频课程编程

嘿&#xff0c;极客们&#xff0c; 收到社区的反馈并紧贴行业发展趋势&#xff0c;我们非常高兴宣布推出全新的Youtube频道 &#xff01; 在我们的频道上&#xff0c;我们将主持与Java编程有关的视频课程&#xff0c;但通常也会进行软件开发。 我们将介绍代码演练以及完整的…

田忌赛马c语言程序设计,还是杭电1052田忌赛马

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;2还是杭电1052田忌赛马//昨天那个算法漏洞挺大&#xff0c;但我重新构思了&#xff0c;但运行到312ms还是wa了。我测试了许多数据&#xff0c;结果是对的&#xff0c;郁闷了&#xff0c;谁能救救我啊&#xff1f;#include&…

ArrayList clone()– ArrayList深拷贝和浅拷贝

示例程序以ArrayList克隆方法为例。 学生对象上的ArrayList深层复制和浅层复制示例。 1.简介 ArrayList clone&#xff08;&#xff09;– ArrayList深复制和浅复制 。 ArrayList clone&#xff08;&#xff09;方法用于创建list的浅表副本 。 在新列表中&#xff0c;仅复制对…

南京邮电大学c语言实验报告4,南京邮电大学算法设计实验报告——动态规划法...

《南京邮电大学算法设计实验报告——动态规划法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《南京邮电大学算法设计实验报告——动态规划法(12页珍藏版)》请在人人文库网上搜索。1、实 验 报 告(2009/2010学年 第一学期)课程名称算法分析与设计A实验名称动 态 规 …

启动jboss_3种启动JBoss BPM流程的基本方法

启动jboss这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法。 规划项目可能包括流程项目&#xff0c;但是您是否考虑过可以启动流程的各种方式&#xff1f; 也许您的JBoss BPM Suite在您的体系结构中本地运行&#xff0c;也许您在云中运行&#xff0c;但是无论它…

单片机控制灯光亮度c语言程序,基于51单片机控制LED灯光亮度并报警

利用pwm控制led灯光亮度大小。可以显示许多亮度等级 到最低或者最高亮度等级会发出报警。设计思路&#xff1a;LED一般是恒流操作的&#xff0c;如何改变LED的亮度呢&#xff1f;答案就是PWM控制。在一定的频率的方波中&#xff0c;调整高电平和低电平的占空比&#xff0c;即可…