自制 x86-64 内核(46):mmap 文件映射
上一章实现了 TCP 服务端,这章来实现一个经典的内存管理功能:mmap 文件映射。 什么是 mmap 文件映射 mmap 把文件的一段内容映射到进程的虚拟地址空间。映射后可以像读内存一样读文件——不需要 read() 系统调用,直接解引用指针。 int fd = open("/bin/busybox", O_RDONLY); char *p = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0); // p[0..3] 就是文件的前 4 字节(ELF magic: 7f 45 4c 46) 关键设计:VMA 和 Lazy 分配 mmap 不会立刻分配物理内存,而是登记一个 VMA(虚拟内存区域),等到进程真正访问这段地址时,才通过缺页异常按需读取文件内容并建立页表映射。 mmap(fd) → 注册 VMA(vaddr, len, inum, offset) → 返回虚拟地址 ↓ 进程访问该地址 #PF not-present → 找到 VMA → 分配物理页 → ext2_read(inum, offset, page) → 建立页表 → 重试指令 这就是操作系统课上说的"按需分页"(demand paging)。 实现步骤 1. 定义 VMA 结构 在 process_t 中加入 VMA 数组: ...