从零写 OS kernel-Part 16: VMA 与process退出 — 安全reclaim每一片内存
“Allocating memory is just the beginning — safe release is the true endpoint. Today, we implement Virtual Memory Area (VMA) management, ensuring every resource is reclaimed without leaks when a process exits!”
在前几篇中, 我们Implementation了 Buddy 系统, Slab allocate器, 用户态 malloc, 但process的virtual address空间仍是一团乱麻:
无法跟踪哪些Region已allocate
process退出时, 物理页, file descriptor, kernel对象可能泄漏
真正的操作系统, 必须能 精确manage每个process的virtual memory布局 , 并在process结束时 彻底reclaim所有资源 , 避免memory leak和资源耗尽.
今天, 我们就来Implementation: ✅ virtual memoryRegion (VMA) linked list ✅ process退出时的complete资源reclaim ✅ 僵尸process与 wait Mechanism完善
让你的 OS 拥有 健壮的生命周期manage !
🗺️ 1. Why do we need VMA (Virtual Memory Area) ?
process的virtual address空间不是一整块, 而是由多个 独立Region 组成:
| Region | 说明 |
|---|---|
| code segment | ELF 的 .text 段 (只读, 可execute) |
| data segment | .data + .bss (可读写) |
| heap (Heap) | brk expand的Region |
| memory mapping区 | mmap create的Region (文件/匿名) |
| stack (Stack) | 用户stack (Typically, 在高地址) |
没有 VMA 的Problem:
无法知道某virtual address属于哪个Region
(Page Fault handle困难)
无法正确release
mmap
Region
无法Implementation
munmap
system call
💡 VMA 是processvirtual address空间的”地图” !
📦 2. VMA Data Structure Design
每个 VMA 描述一个连续的virtual memoryRegion:
process PCB 增加 VMA linked list:
🔑 VMA linked list按 vm_start 升序排列 , 便于查找和合并.
⚙️ 3. VMA Core Operations
- 查找 VMA (find_vma)
-
插入 VMA (insert_vma)
-
合并相邻 VMA (可选优化)
📞 4. System Call Integration
-
mmap: create新 VMA
-
munmap: release VMA
☠️ 5. process退出: Complete Resource Reclamation
当process调用 exit() 或被杀死, kernel必须reclaim:
- virtual memory资源
-
file descriptor
-
kernel对象
-
processStateconvert
🧪 6. 测试: memory leak检测
用户程序:
kernel监控:
在
do_exit
中打印release的 VMA 数量, 物理页数
确保每次process退出, 资源计数归零
✅ 无泄漏: process退出后, 所有物理页, VMA, file descriptor均被reclaim!
⚠️ 7. 边界情况handle
- 多threadprocess
当前Design为单thread, 多thread需额外managethreadstack
-
共享内存
MAP_SHARED
map的Region, release时需check是否还有其他process引用
-
signalhandle中的退出
确保在 Page Fault, system call中也能安全退出
-
父process先退出
子process成为孤儿, 应被 init process收养
💡 完善的process退出Mechanism, 是系统长期稳定运行的critical!
💬 写在Finally,
VMA 和process退出看似是”收尾工作”, 但它们决定了操作系统的 健壮性与可靠性 . 一个会泄漏内存的 OS, 终将在长时间运行后崩溃.
今天你Implementation的 do_exit , 正是 Linux 中 do_exit 和 release_task 的简化版.
🌟 真正的工程之美, 在于优雅地handle每一个结束.
📬 动手挑战 : Implementation munmap system call, 并verifyrelease后该Regiontrigger Page Fault. 欢迎在评论区分享你的 VMA linked list调试技巧!
👇 下一篇你想看: Copy-on-Write (CoW) Implementation , 还是 process间通信 (IPC) ?
#操作系统 #kernel开发 #VMA #process退出 #memory management #资源reclaim #从零开始
Comments