作为程序员,我们通常使用 malloc()
, free()
以及类似的函数来分配内存。它们由 glibc()
图书馆。实际工作由 mmap()
和 munmap()
这是一个Linux系统调用。
null
mmap()的作用是什么?
mmap()
函数或系统调用将在当前进程的虚拟内存中创建映射。地址空间由多个页组成,每个页可以映射到某些资源。我们可以为要使用的资源创建此映射。
图书馆
mmap()
和 munmap()
功能由提供 sys/mman.h
图书馆。因此,为了使用我们需要包括他们如下。
#include
语法
作为 mmap()
提供灵活的内存映射它有很多参数可供使用。
void *mmap(void *addr, size_t lengthint " prot ", int " flags , int fd, off_t offset)
-
void *addr
是我们要开始映射的地址 -
size_t lengthint
是要映射为整数的大小 -
PROT_READ|PROT_WRITE|PROT_EXEC
关于页面的选项 -
MAP_ANON|MAP_PRIVATE
关于页面的选项
内存映射类型
关于共享的内存映射,我们有两种选择。
-
MAP_SHARED
将映射给定的页面,这也将被其他进程看到。 -
MAP_PRIVATE
将映射给定的页面,其他进程将看不到该页面。
例子
下面是一个从 2^20
. 页面的默认大小为 4096
所以我们将用4096字节的内存映射一个页面。
#include#include #include #include int main(void) { size_t pagesize = getpagesize(); printf("System page size: %zu bytes", pagesize); char * region = mmap( (void*) (pagesize * (1 << 20)), // Map from the start of the 2^20th page pagesize, // for one page length PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, // to a private block of hardware memory 0, 0 ); if (region == MAP_FAILED) { perror("Could not mmap"); return 1; } strcpy(region, "Hello, poftut.com"); printf("Contents of region: %s", region); int unmap_result = munmap(region, 1 << 10); if (unmap_result != 0) { perror("Could not munmap"); return 1; } // getpagesize return 0;}
当我们使用以下命令编译时 a.out
将生成可执行文件。
$ gcc main.c

相关文章: CMake教程在Linux中构建和编译
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END