- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个简单的 mmap 程序,它在两台 linux 机器上的行为不同:
cat a.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int
main(void)
{
int fd = -1;
char *A, *zero;
if ((fd = open("./a.out", O_RDONLY, 0)) == -1)
exit(1);
A = mmap(NULL, 65536, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, fd, 0);
if (A == MAP_FAILED)
printf("error %d, errno=%d\n", A, errno);
else
printf("OK %d\n", A);
return (EXIT_SUCCESS);
}
在一台机器上 mmap
成功返回,但另一台机器打印错误(errno 为 1)。
strace
结果的相关差异是:
好的:
(2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux)
open("./a.out", O_RDONLY) = 3
mmap(NULL, 65536, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0
失败的一个:
( 2.6.18-194.26.1.el5 #1 SMP Fri Oct 29 14:21:16 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux)
open("./a.out", O_RDONLY) = 3
mmap(NULL, 65536, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = -1 EPERM (Operation not permitted)
在失败的那个中,如果我去掉 MAP_FIXED 标志,mmap 就会成功。似乎失败的进程没有可用于映射的内存空间 [0, 65535]。
我不知道去哪里寻找这个问题?不同行为和失败的原因可能是什么?或者更具体地说,如果我猜测故障是由于 [0,65535] 不可用造成的,那么一台机器可用而另一台机器不可用的原因可能是什么?
最佳答案
您已指定地址为零的 MAP_FIXED
。默认情况下,在最新版本的 Linux 上,并且可以在一些早期版本上配置,禁止在低虚拟地址映射,以防止利用内核空指针取消引用错误。
关于linux - 启用了 MAP_FIXED 标志的 nmap EPERM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734909/
我一直在查看 mmap 函数的不同标志,即 MAP_FIXED、MAP_SHARED、MAP_PRIVATE。有人可以向我解释 MAP_FIXED 的用途吗?无法保证首先会使用地址空间。 最佳答案 M
我正在用堆栈运行一些实验,但以下让我卡住了。 可以看出Linux有初始[stack]映射132KiB大小。在 ulimit -s unlimited 的情况下,如果我们相应地调整 rsp,我们可以进一
由于一些与这个问题无关的模糊原因,我需要求助于使用 MAP_FIXED 以获得接近 libc 的文本部分在内存中的位置的页面。 在阅读 mmap(2)(我一开始就应该这样做)之前,如果我使用 MAP_
常量 MAP_FIXED 对 mmap 有什么作用? 我已经在手册中阅读了它,但仍然不明白它的用途以及它适用于哪些情况。 最佳答案 MAP_FIXED 指定 mmap 内存应该位于作为第一个参数传递给
我有一个简单的 mmap 程序,它在两台 linux 机器上的行为不同: cat a.c #include #include #include #include
:) 我正在尝试将一些遗留代码(大型程序)移植到 CentOS 7,但遇到了障碍。代码的核心是一个相当笨拙的结构,围绕使用 mmap 分配硬编码地址并将文件映射到它而构建。该文件就像一个数据库(由一个
在尝试测试时 Is it allowed to access memory that spans the zero boundary in x86?在 Linux 的用户空间中,我编写了一个 32 位
以下程序: #include #include #include #include #include #include void generate_test_file(int count)
我是一名优秀的程序员,十分优秀!