通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3131字,纯文字阅读大概需要5分钟。
内容图文
![通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么?](/upload/InfoBanner/zyjiaocheng/963/4c2365b682b84b87b2c018447441692d.jpg)
我想通过/ 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,最后的代码.
问题:我的问题是当我读取文本段PA内存时,一切正常,但如果我读取数据段PA内存,行(243)中的*((long *)mapAddr)将导致系统关闭.另外,我试过了
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代码),而数据部分则留在&持续不断.
尝试使用stack-Segment.并检查它是否有效?
编写您自己的测试程序并以KB为动态分配内存,并在循环中保持该内存的使用.比试用你的代码来读取测试程序的内存段.我认为它会起作用.
我在Windows中做了类似的工作,从IVT取代BIOS地址.
应该是root用户.
内容总结
以上是互联网集市为您收集整理的通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么?全部内容,希望文章能够帮你解决通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。