我正在尝试扫描地址空间以查找具有读/写权限的内存块。每页检查一个地址是可以接受的,因为每个页面具有相同的权限。我知道我应该得到Segmentation Fault:11当试图写入一段我不应该的内存时。当我尝试访问更高的地址时会发生这种情况,但当我在较低的部分时,比如0x00000100,我收到总线错误:10。
注意:代码使用-m32标志编译,因此它模拟32位机器。
另请注意:在调用此函数之前,chunk_list的内存已经被malloc.ed
我复制了以下代码:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include "memchunk.h"
int get_mem_layout (struct memchunk *chunk_list, int size)
{
//grab the page size
long page = sysconf(_SC_PAGESIZE);
printf("The page size for this system is %ld bytes\n", page);
//page size is 4069 bytes
//test printing the number of words on a page
long words = page / 4;
printf("Which works out to %ld words per page\n", words);
//works out to 1024 words a page
//1024 = 0x400
//create the addy pointer
//start will be used after bus error: 10 is solved
void *start;
char * currAddy;
currAddy = (char*)0x01000000;
//someplace to store the addy to write to
//char * testWrite;
//looping through the first size pages
int i;
for(i = 0; i < size; i++){
//chunk start - wrong addy being written just testing
chunk_list[i].start = currAddy;
printf("addy is %p\n",currAddy);
sleep(1);
//try and write to the current addy
//testWrite = currAddy;
//*testWrite = 'a';
*currAddy = '1';
//+= 0x400 to get to next page
currAddy += 0x400;
}
//while loop here for all the addys - not there yet because still dealing with bus error: 10
return 0;
}
非常感谢任何帮助。我还在代码中留下了一些其他的尝试,仍然都会产生一个总线错误:内存空间的下半部分为10。
编辑:我将使用信号处理seg故障。我知道如何处理seg故障,有没有办法处理总线错误:10还使用信号?
答案 0 :(得分:1)
从或读取未映射的内存时,应该会导致总线故障。要发现是否存在内存,请为SEGFAULTs安装一个处理程序以做出相应的反应。
在Linux SE(安全增强版)进程中,程序部分会在随机位置加载,以阻止病毒依赖稳定的地址。
在大多数虚拟内存系统中,非映射空间通常从地址零开始,因此尝试取消引用NULL指针或基于NULL指针的结构会导致异常。在20世纪80年代,空白空间通常为64K到256K。在现代架构中,16M是检测基于NULL的访问的合理选择。
在许多虚拟内存系统上,有一个系统调用来获取每个进程映射的内存位置。在Linux上,检查/proc/self/maps
。