访问macOS上的受保护内存时出现异常总线错误?

时间:2018-04-16 14:39:53

标签: macos mmap sigsegv bus-error mprotect

上下文

我已经编写了一个小程序,目的是使用它生成一个k信号,我将用一个处理程序捕获然后打印出来。

问题

我编写的程序在Linux上工作得很好(或者看起来似乎如此)。但是,在macOS 10.11.6上编译和执行时,它无法生成SIGSEGV,而是生成SIGSEGV

试图解决方案

在研究其他人是否遇到此错误时,我遇到了以下SO帖子:

https://stackoverflow.com/a/18829327/1883304

可悲的是,当我确实从使用Bus error: 10切换到posix_memalign时,我仍然遇到了总线错误。除了这个之外,我无法找到可以提供帮助的相关问题。

程序

mmap

总而言之,有人可以告诉我有关保留记忆的最新正确方法,以便我可以在macOS上提出#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <unistd.h> #include <sys/mman.h> /* ******************************************************************************* * Global Variables * ******************************************************************************* */ // Page size. int pagesize; // Pointer to allocated memory page. void *page; /* ******************************************************************************* * Signal Handlers * ******************************************************************************* */ // Handler: Invalid memory reference. void handler_sigseg (int sig, siginfo_t *si, void *ignore) { // Mask SIGSEGV. if (sig != SIGSEGV) { return; } // Output siginfo fields. printf("si_signo = %d\n", si->si_signo); printf("si_code = %d\n", si->si_code); printf("si_value.sival_int = %d\n", si->si_value.sival_int); printf("si_errno = %d\n", si->si_errno); printf("si_pid = %d\n", si->si_pid); printf("si_uid = %d\n", si->si_uid); printf("si_statis = %d\n", si->si_status); // Grant writing protection. if (mprotect(page, pagesize, PROT_WRITE) == -1) { fprintf(stderr, "Error: Attempt to set memory access perms failed!\n"); exit(EXIT_FAILURE); } return; } /* ******************************************************************************* * Main Routine * ******************************************************************************* */ int main (void) { /* *************************************************************************** * Memory Setup * *************************************************************************** */ // Set page size. pagesize = sysconf(_SC_PAGE_SIZE); printf("pagesize = %d\n", pagesize); // Allocate memory page, created at nearby page boundary. if ((page = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) == MAP_FAILED) { fprintf(stderr, "Error: mmap allocation failed!\n"); exit(EXIT_FAILURE); } // Zero out memory block. memset(page, 0, pagesize); // Set protections. if (mprotect(page, pagesize, PROT_READ) == -1) { fprintf(stderr, "Error: Attempt to set memory access perms failed!\n"); exit(EXIT_FAILURE); } /* *************************************************************************** * Signal Setup * *************************************************************************** */ // Setup signal handler. struct sigaction segHandler; // Configure args. segHandler.sa_flags = SA_SIGINFO; // Reset signal-mask. sigemptyset(&segHandler.sa_mask); // Setup handler routine. segHandler.sa_sigaction = handler_sigseg; // Setup signals to be intercepted. sigaction(SIGSEGV, &segHandler, NULL); // Test the signal handler. printf("Poking protected memory...\n"); char *p = (char *)page; *p = 0; return 0; } 吗?

0 个答案:

没有答案