searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

mmap()系统调用简要分析

2023-11-28 03:07:18
8
0
实现文件为\arch\x86\kernel\sys_x86_64.c,该函数的映射必须要按照以页为单位。mmap相对于传统的read和write会少一次从内核缓冲区到用户态buffer的拷贝,性能较好,C语言代码如下:
 
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
 
  • addr:表示我们要映射的这段虚拟内存区域在进程虚拟内存空间中的起始地址(虚拟内存地址),如果这个虚拟地址已经被使用或者是一个无效的地址,那么内核则会自动选取一个合适的地址来划分虚拟内存区域。我们一般会将 addr 设置为 NULL,意思就是完全交由内核来帮我们决定虚拟映射区的起始地址;
  • length: 需要内存的大小,需要按照4K对齐;
  • prot:权限标志位,标记可读(VM_READ)可写可执行,PROT_NONE不可访问,可用于内存保护。
  • flags:当前mmap的标志位
    • MAP_SHARED: 多进程共享映射,一个进程修改了共享映射的内存区域,其他进程是可以看到的,用于多进程之间的通信。
    • MAP_PRIVATE: 表示私有映射,其他进程是看不到的。如果是私有文件映射,那么多进程针对同一映射文件的修改将不会回写到磁盘文件上
    • MAP_ANONYMOUS:匿名映射
  • fd:当映射的是文件页的时候,该参数才会有效,指向要映射文件的fd;
  • offset:和fd一样,只有当映射的是文件的时候该参数才会有效。
mmap的实现逻辑基本上brk的实现机制类似,mmap多了对映射问文件的处理,实现原理主要有do_mmap函数完成。
针对mmap不同参数的设置,可分私有匿名页和文件页,共享文件页和共享匿名页。
0条评论
0 / 1000
一颗苹果
4文章数
1粉丝数
一颗苹果
4 文章 | 1 粉丝
一颗苹果
4文章数
1粉丝数
一颗苹果
4 文章 | 1 粉丝
原创

mmap()系统调用简要分析

2023-11-28 03:07:18
8
0
实现文件为\arch\x86\kernel\sys_x86_64.c,该函数的映射必须要按照以页为单位。mmap相对于传统的read和write会少一次从内核缓冲区到用户态buffer的拷贝,性能较好,C语言代码如下:
 
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
 
  • addr:表示我们要映射的这段虚拟内存区域在进程虚拟内存空间中的起始地址(虚拟内存地址),如果这个虚拟地址已经被使用或者是一个无效的地址,那么内核则会自动选取一个合适的地址来划分虚拟内存区域。我们一般会将 addr 设置为 NULL,意思就是完全交由内核来帮我们决定虚拟映射区的起始地址;
  • length: 需要内存的大小,需要按照4K对齐;
  • prot:权限标志位,标记可读(VM_READ)可写可执行,PROT_NONE不可访问,可用于内存保护。
  • flags:当前mmap的标志位
    • MAP_SHARED: 多进程共享映射,一个进程修改了共享映射的内存区域,其他进程是可以看到的,用于多进程之间的通信。
    • MAP_PRIVATE: 表示私有映射,其他进程是看不到的。如果是私有文件映射,那么多进程针对同一映射文件的修改将不会回写到磁盘文件上
    • MAP_ANONYMOUS:匿名映射
  • fd:当映射的是文件页的时候,该参数才会有效,指向要映射文件的fd;
  • offset:和fd一样,只有当映射的是文件的时候该参数才会有效。
mmap的实现逻辑基本上brk的实现机制类似,mmap多了对映射问文件的处理,实现原理主要有do_mmap函数完成。
针对mmap不同参数的设置,可分私有匿名页和文件页,共享文件页和共享匿名页。
文章来自个人专栏
CTyunos
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0