受保护的内存区域上的write()不会触发sigsegv,但标准访问会触发
发布时间:2020-12-16 10:04:34 所属栏目:百科 来源:网络整理
导读:我试图理解为什么在受内存保护的区域上调用写操作不会触发sigsegv.考虑这个例子: void *map_addr;unsigned long addr;map_addr = (void *)mmap(NULL,0x4000,PROT_READ_WRITE,MAP_PRIVATE,fd,0);mprotect(map_addr,PROT_NONE);addr = (unsigned long)map_add
我试图理解为什么在受内存保护的区域上调用写操作不会触发sigsegv.考虑这个例子:
void *map_addr; unsigned long addr; map_addr = (void *)mmap(NULL,0x4000,PROT_READ_WRITE,MAP_PRIVATE,fd,0); mprotect(map_addr,PROT_NONE); addr = (unsigned long)map_addr; // case 1: *(volatile int*)(addr); // sigsegv sent // case 2: write(STDOUT_FILENO,map_addr,size); // sigsegv NOT sent 而不是发送sigsegv,在此实例中写入返回-1并设置errno = EFAULT.为什么写有这种行为?我想象写会尝试从地址读取,这会产生sigsegv错误,但显然不是这种情况. 解决方法
write是系统调用,因此内存访问发生在内核中,而不是在您的进程中.内核首先检查传递的地址是否对调用进程有效,如果不是,则只返回EFAULT.
(不过我不知道为什么它会以这种方式工作.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |