加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

通过/ 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用户.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读