【问题标题】:Bus error: 10 when scanning address space in c总线错误:在 c 中扫描地址空间时出现 10
【发布时间】:2013-01-18 17:15:42
【问题描述】:

我正在尝试扫描地址空间以查找具有读/写权限的内存块。每个页面都检查一个地址是可以接受的,因为每个页面都具有相同的权限。我知道我应该得到 Segmentation Fault: 11 当我试图写入一块我不应该能够的内存时。当我试图访问更高的地址时会发生这种情况,但是当我在较低的部分时,比如 0x00000100,我得到总线错误:10。

注意:代码使用 -m32 标志编译,因此它模拟 32 位机器。

另请注意:在调用此函数之前,chunk_list 的内存已被分配。

我已经复制了下面的代码:

#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 错误,那么有没有办法处理总线错误:10 也使用信号?

【问题讨论】:

    标签: c memory bus-error


    【解决方案1】:

    读取或写入未映射的内存应该会导致总线故障。要发现内存是否存在,请为 SEGFAULT 安装一个处理程序以做出相应的反应。

    在 Linux SE(安全增强)进程中,程序部分在随机位置加载,以阻止病毒依赖稳定地址。

    在大多数虚拟内存系统中,非映射空间通常从地址 0 向上保留,因此尝试取消引用 NULL 指针或基于 NULL 指针的结构会导致异常。在 1980 年代,空白空间通常为 64K 到 256K。在现代架构上,16M 是检测基于 NULL 的访问的合理选择。

    在许多虚拟内存系统上,都有一个系统调用来获取每个进程映射的内存位置。在 Linux 上,检查 /proc/self/maps 的内容。

    【讨论】:

    • 所以你是说一旦我实现了 seg 故障处理程序(SIGSEGV),它也会处理总线错误?如果是这样,我会试一试。
    • @KUSH:好吧,处理程序必须处理故障。通常这是通过它的返回值来完成的,该值指示是重新运行有问题的指令还是做其他事情。
    • @wallyk 只是想知道:是否可以从用户空间安装这样的处理程序?还是该进程需要特殊权限?
    • @AlbertoMiranda:在 Linux 及其后代上,用户空间异常处理程序是正常且常见的。相同的机制可用于优雅地处理 control-C、退出、调制解调器挂断等。
    • @wallyk 我将使用 sigsetjump 等,因此我不会在总线错误后尝试重新写入该位置。在处理信号时,我将在结构中存储有关块的一些基本信息。我会试一试,看看会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多