.
task_stuct mm_struct
... mmm
...
*mmap *pgd
map_count
vm_area_struct vm_area_struct
...
*vm_next
*vm_next
Vm_start
Vm_start
Vm_end
Vm_end
...
...
...
一段虚
拟空间
...
一段虚
拟空间
.
由上图知,在进程的进程控制块task_struct 里 , 有 一 个 字 段 mm , 由 它 指 出 进 程 的 mm_struct 在 哪 里 。 这 样 , 从 进 程 控 制 块 task_struct, 就 可 以 找 到 mm_struct; 从 mm_struct,就可以找到各个VMA和页表索引及 页表。由此可知,找到进程控制块即可获得 一个进程的所有信息。
.
2 管理虚拟存储空间的数据结构
Linux进程的各个分区可以是不连续的,因此 形成了若干个离散的虚拟区间。为了对它们 加 以 管 理 , 定 义 了 vm_area_struct 型 及 mm_struct型数据结构。 vm_area_stuct: 用 于 管 理 进 程 的 每 一 个 虚 拟 空间。 mm_struct用于管理进程的整个虚拟空间、页 表索引和页表。
.
用户虚拟
地址空间
1个 页面
1个 页面
...
1个 页面
1M个页面
1个 页面
页表
页表索引
1M个表项 (1024个
页面)
...
1024个 表项
.
在知道一个虚拟地址后,就可以根据地址的 前10位,先去查页表索引,以便得到该索引 所对应的内存块的起始地址,最后,与位移 量d相加后,就得到最终所需要的物理地址。 整个地址转换的过程,如下图所示