Linux内核分析之内存管理-11
第11章:内存映射
基于 Linux 6.12.38 源码
11.1 内存映射概述
11.1.1 mmap 系统调用
mmap (memory map) 是 Linux 提供的一种内存映射机制,可以将文件或设备映射到进程的虚拟地址空间。
映射类型:
- 文件映射: 将文件映射到内存
- 匿名映射: 不映射文件,用于内存分配
- 共享映射: 多个进程共享映射
- 私有映射: 写时复制 (COW)
11.1.2 映射示例
1 | /* 匿名映射 (malloc 实现) */ |
11.2 mmap 系统调用
11.2.1 sys_mmap_pgoff
位置: mm/mmap.c
1 | SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, |
11.2.2 mmap 标志
1 | /* mmap 标志定义 */ |
11.2.3 保护标志
1 | /* mmap 保护标志 (与 VMA 标志对应) */ |
11.3 do_mmap 实现
11.3.1 核心映射函数
位置: mm/mmap.c
1 | static unsigned long do_mmap(struct file *file, unsigned long addr, |
11.3.2 mmap 流程
1 | mmap(addr, len, prot, flags, fd, offset) |
11.4 mprotect 系统调用
11.4.1 sys_mprotect
位置: mm/mprotect.c
1 | SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, |
11.4.2 使用示例
1 | /* 分配内存 */ |
11.5 munmap 系统调用
11.5.1 sys_munmap
位置: mm/mmap.c
1 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) |
11.5.2 解除映射流程
1 | munmap(addr, len) |
11.6 mremap 系统调用
11.6.1 sys_mremap
位置: mm/mmap.c
1 | SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, |
11.6.2 do_mremap 实现
1 | static unsigned long do_mremap(unsigned long addr, |
11.7 msync 系统调用
11.7.1 sys_msync
位置: mm/msync.c
1 | SYSCALL_DEFINE3(msync, unsigned long, addr, size_t, length, int, flags) |
11.7.2 msync 标志
1 |
11.8 madvise 系统调用
11.8.1 sys_madvise
位置: mm/madvise.c
1 | SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) |
11.8.2 madvise 建议
1 |
11.9 本章小结
本章介绍了 Linux 6.12 的内存映射:
- mmap 概述: 文件映射、匿名映射、共享/私有映射
- mmap 系统调用: sys_mmap_pgoff,创建内存映射
- mmap 标志: MAP_SHARED、MAP_PRIVATE、MAP_ANONYMOUS 等
- do_mmap: 核心映射实现,创建 VMA
- mprotect: 修改内存保护权限
- munmap: 解除内存映射
- mremap: 重新映射内存
- msync: 同步内存到文件
- madvise: 给出内存使用建议
下一章将介绍匿名内存与页缓存。
- Title: Linux内核分析之内存管理-11
- Author: 韩乔落
- Created at : 2026-01-20 21:39:37
- Updated at : 2026-02-24 14:05:12
- Link: https://jelasin.github.io/2026/01/20/Linux内核分析之内存管理-11/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments