我正在运行下面的C程序,在RHEL5.11和RHEL6.8上执行它时得到了不同的结果。On 5.11,输出为:
页码为4096
内存分配时间为0x12791000
保护成功
而在6.8上,输出是:
页码为4096
内存在0xea 6000处由memalign()分配
保护失败:权限被拒绝
有人知道为什么会发生这种事吗?是否有需要设置的内核参数?
下面是C程序:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/mman.h>
static void domp( void *, long );
static void domp( void *pmem, long psz ) {
if (mprotect( pmem, psz, PROT_READ | PROT_WRITE | PROT_EXEC ) == -1) {
perror( "mprotect failed" );
} else {
printf( "mprotect success\n" );
}
}
int main( int argc, char *argv[] ) {
long lpsz;
void *lmem;
lpsz = sysconf(_SC_PAGESIZE);
printf( "Page size is %ld\n", lpsz );
if ((lmem = memalign( lpsz, lpsz )) == NULL) {
perror( "memalign failed" );
exit (-1);
}
printf( "Memory allocated by memalign() at %p\n", lmem );
domp( lmem, lpsz );
return 0;
}发布于 2016-12-15 22:51:53
很有可能是塞利诺。
然而,真正的问题是,为什么要在没有显式mmap的东西上调用mprotect。实际上,如果您确实需要不同的权限,为什么不直接使用mmap呢?额外的问题是,为什么你认为你需要PROT_EXEC。
https://stackoverflow.com/questions/41174549
复制相似问题