gpt4 book ai didi

linux - 启用了 MAP_FIXED 标志的 nmap EPERM 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:11 26 4
gpt4 key购买 nike

我有一个简单的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com