我怎样才能保护在Linux的堆内存?

我想以只读方式创build一个堆内存块。 为此,我已经用mprotect()尝试了memalign() 。但是从memalign中我可以得到什么,memalign从进程堆中分配内存。

我想让堆的一部分只读。 有什么帮助吗?

malloc()->mmap()->mprotect()一个假设的想法,但不知道是否可以帮助…上面实现的任何示例代码?

我需要保护堆内的内存地址。 与malloc()我得到的地址在0x10012008左右,而与mmap()它是0xf7ec9000.My的意图是使堆只能读取的一部分,只抓住任何可能试图通过该堆运行trampler。

是的,mmap和mprotect是正确的功能。 我不明白你现在正在接受的问题是什么,也就是说,你用“mprotect()”来试试memalign(),但是从memalign中我可以得到什么,memalign把内存从进程堆中分配出来“。

以下是如何创建写保护内存区域的示例:

 #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <string.h> #include <sys/mman.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> static int alloc_size; static char* memory; void segv_handler (int signal_number) { printf ("memory accessed!\n"); mprotect (memory, alloc_size, PROT_READ | PROT_WRITE); } int main () { int fd; struct sigaction sa; /* Install segv_handler as the handler for SIGSEGV. */ memset (&sa, 0, sizeof (sa)); sa.sa_handler = &segv_handler; sigaction (SIGSEGV, &sa, NULL); /* Allocate one page of memory by mapping /dev/zero. Map the memory as write-only, initially. */ alloc_size = getpagesize (); fd = open ("/dev/zero", O_RDONLY); memory = mmap (NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0); close (fd); /* Write to the page to obtain a private copy. */ memory[0] = 0; /* Make the memory unwritable. */ mprotect (memory, alloc_size, PROT_NONE); /* Write to the allocated memory region. */ memory[0] = 1; /* All done; unmap the memory. */ printf ("all done\n"); munmap (memory, alloc_size); return 0; } 

您应该直接使用mmap()并完全放弃malloc() 。 而且,根据您的需要,您可能根本不需要mprotect()

 ptr = mmap(NULL, length, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 

在最近的内核和libc实现中,这将使用指定的保护模式分配所需的内存量 – 在这种情况下,分配的内存区域只能被读取,而不能被写入。 如果你只需要一堆零页,那就行了。 否则,产生的区域将被正确对齐,您可以使用mprotect()以受控的方式短时间解除它的保护。