通过/ dev / mem读写进程’内存,文本段工作但数据段不能,为什么
发布时间:2020-12-16 07:00:04 所属栏目:百科 来源:网络整理
导读:我想通过/ dev / mem从进程’内存中读取和写入. 首先,我通过自己编写的linux内核模块获取进程’内存映射,输出如下: start_code_segment 4000000000000000end_code_segment 4000000000019c38start_data_segment 6000000000009c38end_data_segment 6000000000
我想通过/ 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 %dn",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用户.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |