用C语言和C++语言编写的MMAP教程

作为程序员,我们通常使用 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
mmap() Example
mmap()示例

相关文章: CMake教程在Linux中构建和编译

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享