第5章
内存管理
在学习内存管理的时候,需要注意区分虚拟内存、物理内存,以及连续内存管理方式、离散内存管理方式等几个概念的关系。本书假设读者已经学习过操作系统原理性课程,对虚拟内存的工作原理有初步了解。
本章中“物理页帧”通常用“页帧”指代,而虚存空间的页通常用“虚页”指代。
5.1虚存空间管理
首先来观察一个进程内部的进程空间是如何管理的。回顾图22和图23可知,进程空间是一个虚存空间,被分割成两大区域——内核空间(所有进程共享该空间)和进程的用户空间。多个进程各自的虚存空间并存于系统中,形成图28所示的内存子系统完整视图。其中用户空间则是由多个内存区间(VMA)构成,其他未分配的空间不能使用,否则出现非法错误。该进程PCB(struct task_struct)的mm成员(struct mm_struct)描述整个进程用户空间,而mm_struct结构体内部有管理着该进程内部全部的虚存空间(struct vm_area_struct),具体如图23所示。内核空间的管理未进行讨论。
5.1.1进程映像
如果运行HelloWorldgetchar程序,然后用ps获得其PID,就能通过/proc/PID/maps查看这些区间的地址范围和相关属性,如屏显51所示。
屏显51中cat /proc/25085/maps命令输出的是进程25085(即HelloWorldgetchar)内存布局信息。每一行是一个具有特定属性的连续内存区,每行的开头是该区间的地址范围。后面的rwxp分别代表: r=可读、w=可写、x=可执行、s=共享以及p=操作系统之编程观察第5章内存管理屏显51HelloWorldgetchar的内存布局
\[lqm@localhost ~\]$ps
PID TTYTIME CMD
4330 pts/000:00:00 bash
25085 pts/000:00:00 HelloWorld-getc
25090 pts/000:00:00 ps
\[lqm@localhost ~\]$cat /proc/25085/maps
00400000-00401000 r-xp 00000000 fd:00 12641267/home/lqm/HelloWorld-getchar
00600000-00601000 r--p 00000000 fd:00 12641267 /home/lqm/HelloWorld-getchar
00601000-00602000 rw-p 00001000 fd:00 12641267 /home/lqm/HelloWorld-getchar
7f0e039a7000-7f0e03b5d000 r-xp 00000000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03b5d000-7f0e03d5d000 ---p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d5d000-7f0e03d61000 r--p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d61000-7f0e03d63000 rw-p 001ba000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d63000-7f0e03d68000 rw-p 00000000 00:00 0
7f0e03d68000-7f0e03d88000 r-xp 00000000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f70000-7f0e03f73000 rw-p 00000000 00:00 0
7f0e03f84000-7f0e03f87000 rw-p 00000000 00:00 0
7f0e03f87000-7f0e03f88000 r--p 0001f000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f88000-7f0e03f89000 rw-p 00020000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f89000-7f0e03f8a000 rw-p 00000000 00:00 0
7ffe7dc5e000-7ffe7dc7f000 rw-p 00000000 00:00 0 \[stack\]
7ffe7dd0a000-7ffe7dd0c000 r-xp 00000000 00:00 0 \[vdso\]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 \[vsyscall\]
\[lqm@localhost ~\]$