- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想通过/dev/mem
读写进程的内存。
首先,我通过自己编写的一个linux内核模块获取进程的内存映射,输出是这样的:
start_code_segment 4000000000000000
end_code_segment 4000000000019c38
start_data_segment 6000000000009c38
end_data_segment 600000000000b21d
start_brk 6000000000010000
brk 6000000000034000
start_stack 60000fffffde7b00
其次,我可以通过linux内核模块将虚拟地址(VA)转换为PA,例如,我可以将VA:0x4000000000000008
转换为PA: 0x100100c49f8008
第三,函数read_phy_mem
可以获取PA:0x100100c49f8008
中的内存数据,代码在最后。
问题:我的问题是当我读取text segment
PA内存时,一切正常,但是如果我读取data segment
PA内存, *((long *)mapAddr)
第 243 行将导致系统崩溃。另外,我试过了
memcpy( &data, (void *)mapAddr, sizeof(long) )
但它仍然使系统崩溃。
其他信息:我的电脑是IA64,操作系统是Linux 2.6.18,当系统宕机时,我可以这样从控制台获取输出信息,然后系统会重启。
Entered OS MCA handler. PSP=20010000fff21320 cpu=0 monarch=1
cpu 0, MCA occurred in user space, original stack not modified
All OS MCA slaves have reached rendezvous
MCA: global MCA
mlogbuf_finish: printing switched to urgent mode, MCA/INIT might be dodgy or fail.
Delaying for 5 seconds...
函数代码read_phy_mem
/*
* pa: physical address
* data: memory data in pa
*
* return int: success or failed
*/
188 int read_phy_mem(unsigned long pa,long *data)
189 {
190 int memfd;
191 int pageSize;
192 int shift;
193 int do_mlock;
194 void volatile *mapStart;
195 void volatile *mapAddr;
196 unsigned long pa_base;
197 unsigned long pa_offset;
198
199 memfd = open("/dev/mem", O_RDWR | O_SYNC);
200 if(memfd == -1)
201 {
202 perror("Failed to open /dev/mem");
203 return FAIL;
204 }
205
206 shift = 0;
207 pageSize = PAGE_SIZE; //#define PAGE_SIZE 16384
208 while(pageSize > 0)
209 {
210 pageSize = pageSize >> 1;
211 shift ++;
212 }
213 shift --;
214 pa_base = (pa >> shift) << shift;
215 pa_offset = pa - pa_base;
224 mapStart = (void volatile *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_LOCKED, memfd, pa_base);
226 if(mapStart == MAP_FAILED)
227 {
228 perror("Failed to mmap /dev/mem");
229 close(memfd);
230 return FAIL;
231 }
232 if(mlock((void *)mapStart, PAGE_SIZE) == -1)
233 {
234 perror("Failed to mlock mmaped space");
235 do_mlock = 0;
236 }
237 do_mlock = 1;
238
239 mapAddr = (void volatile *)((unsigned long)mapStart + pa_offset);
243 printf("mapAddr %p %d\n", mapAddr, *((long *)mapAddr));
256 if(munmap((void *)mapStart, PAGE_SIZE) != 0)
257 {
258 perror("Failed to munmap /dev/mem");
259 }
260 close(memfd);
269 return OK;
270 }
谁能理解为什么文本段工作正常但数据段不行?
最佳答案
我猜,它的发生是因为代码部分在进程执行时保留在内存中(如果不是 DLL 代码),而数据部分不断地进出。
尝试使用堆栈段。并检查它是否正常工作?
编写您自己的测试程序并以 KB 为单位动态分配内存,并在循环中使用该内存。比用您的代码尝试读取测试程序的内存段。我认为它会起作用。
我在 Windows 中做了类似的工作来替换来自 IVT 的 BIOS 地址。
应该是root用户。
关于c - 通过/dev/mem读写进程内存,text段可以,data段不行,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10733816/
我是使用 undertow 的新手,我正在开发一个独立的应用程序,它将用作嵌入式服务器。我希望我可以在我的嵌入式 undertow 中部署 web sockets、servlets 和 restful
有谁知道为什么这不起作用,今天有 2 个答案的组合。我只是想让传递的参数显示在警报中,其他一切都有效,所以忽略 url 操作等 $('#changetopicss').click(function (
我需要在用户在 input 中输入数据后更新 div,但我不能。 div 出现,但随后消失。 我的代码: 函数.js window.onload = function(){ var mydata =
我有一个包含一堆 java 项目的工作区。如果我转到文件->刷新,它不会真正刷新任何内容(可能是当前选择的项目)。如何让 Eclipse 刷新所有项目? 最佳答案 它确实只会刷新当前项目(或者更具体地
我在 makefile 中使用了 += 并尝试添加更多编译文件: 使左边的文件能正常工作:编译4个.cpp文件。 但是make the right file是不行的,只能编译main.o和xmluti
下面的代码应该打印 3 个人,但实际上打印了 4 个人,为什么?Person("a", 1) 和 Person("a", 4) 应该被视为相同,但它们不是。 import java.util.Tree
$ testem ci not ok 1 PhantomJS - Browser "phantomjs /home/ubuntu/.nvm/v0.10.12/lib/node_modules/test
我有一个 JavaScript 函数,它没有给出我想要的结果。 这是代码(它是 JavaScript 函数的一部分): alert("yes"); // This
我在一些ajax内容之后将一些数字放入输入字段中,当我尝试让该字段将其作为脚本数据粘贴到uploadify中时,它会粘贴空字符串,但是如果我在输入字段中输入相同的值并尝试将 uploadify 中的字
我有这个表 文章 文章ID 文章名称 文章数量 文章_价格 文章数量 订单 orders_id 文章_id 发票 ID 客户 ID 客户 customers_id 客户名称 客户位置 客户办公室 客户
我正在尝试一种 SQL 注入(inject): http://localhost/test/mysql.php?uid=1;%20DROP%20TABLE%20test 此 URL 应等于语句: SE
假设你有这样一个类 public class Foo { public int Bar { get; set; } = 42; } 如果您尝试将属性作为 ref 参数传递,编译器会发出错误 CS
我已经实现了 block UI,因为当 ajax 请求开始时,此请求可能需要一点时间,一切都会按预期工作。 但是当 ajax 请求完成并显示消息框时,UI 不会解除阻止! 有什么想法吗? 我使用的是
首先,对这个非描述性的标题感到抱歉,我太匆忙了,所以无法想出更好的标题。 第二: 我的数据库的一部分如下图所示: 我的系统上有贡献者,每个贡献者都写入多个源,并且一个源可以有许多正在工作的贡献者。用户
这个问题在这里已经有了答案: Why can't you use the keyword 'this' in a static method in .Net? (7 个答案) 关闭 9 年前。 这来
var allRows = this.getTbodyEl().rows; for (var i = allRows.length - 1; i >= 0; i--){ var thisRowID
我正在尝试连接到 MAMP Pro 上托管的 MYSQL 服务器。我正在尝试使用 java 和 VBA 从同一台客户端计算机进行连接。 VBA 连接正常,但 java 在几秒钟后给出错误 com.my
我有一个将 SVG 下载为 PNG 的功能。它在 Chrome 中运行良好,但在 Firefox 中不会触发下载。需要改变什么? function downloadGraph(contextDivId
我刚刚开始使用 Gulp,但我似乎无法让它工作。当我运行常规 sass 命令时,一切都编译得很好。 这是我的 Gulp 文件: //Gulp Dependencies var gulp = requi
Ajax GET 请求工作正常。但我必须使用 POST,因为我希望发送大量数据,对于 GET 来说太多了。 环境:Apache 2、Debian 9(从头开始)、jQuery 3.2.1,没什么特别的
我是一名优秀的程序员,十分优秀!