从零写 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

  1. 查找 VMA (find_vma)

  2. 插入 VMA (insert_vma)

  3. 合并相邻 VMA (可选优化)


📞 4. System Call Integration

  1. mmap: create新 VMA

  2. munmap: release VMA


☠️ 5. process退出: Complete Resource Reclamation

当process调用 exit() 或被杀死, kernel必须reclaim:

  1. virtual memory资源

  2. file descriptor

  3. kernel对象

  4. processStateconvert


🧪 6. 测试: memory leak检测

用户程序:

kernel监控:


do_exit
中打印release的 VMA 数量, 物理页数
确保每次process退出, 资源计数归零

✅ 无泄漏: process退出后, 所有物理页, VMA, file descriptor均被reclaim!


⚠️ 7. 边界情况handle

  1. 多threadprocess

    当前Design为单thread, 多thread需额外managethreadstack

  2. 共享内存

    MAP_SHARED

    map的Region, release时需check是否还有其他process引用

  3. signalhandle中的退出

    确保在 Page Fault, system call中也能安全退出

  4. 父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 #从零开始

Last modified: 2024年5月15日

Author

Comments

Write a Reply or Comment

Your email address will not be published.