Linux的存储管理
Linux利用计算机系统的虚拟存储技术实现了内存的虚拟存储管理。
本节以80386为例讨论Linux存储管理技术。
9.3.1 Linux的分段和分页机制
1.分段机制
80386的两种工作模式
80386的工作模式包括实地址模式和虚地址模式(保护模式)。Linux主要工作在保护模式下。
分段机制
在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB。
从逻辑地址到线性地址的转换由80386分段机制管理。段寄存器CS、DS、ES、SS、FS或GS标识一个段。这些段寄存器作为段选择器,用来选择该段的描述符。
分段逻辑地址到线性地址转换图
图9_7 分段逻辑地址到线性地址转换图
2. 分页机制
分页机制的作用
分页机制是在段机制之后进行的,它进一步将线性地址转换为物理地址。
80386使用4K字节大小的页,且每页的起始地址都被4K整除。因此,80386把4GB字节线性地址空间划分为1M个页面,采用了两级表结构。
两级页表
两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节,线性地址最高的10位(22-31)用来产生第一级表索引,由该索引得到的表项中的内容定位了二级表中的一个表的地址,即下级页表所在的内存块号。
第二级表称为页表,存储在一个4K字节页中,它包含了1K字节的表项,每个表项包含了一个页的物理地址。二级页表由线性地址的中间10位(12-21)位进行索引,定位页表表项,获得页的物理地址。页物理地址的高20位与线性地址的低12位形成最后的物理地址。
利用两级页表转换地址
图9_8 利用两级页表转换地址
3. 内核空间和用户空间
用户空间
在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,用户进程可以直接访问。
内核空间
从3GB到4GB的虚存地址为内核态空间,存放供内核访问的代码和数据,用户态进程不能访问。所有进程从3GB到4GB的虚拟空间都是一样的,linux以此方式让内核态进程共享代码段和数据段。
4. Linux存储映射
虚存段
Linux在管理进程虚存空间时定义了虚存段(vma)。虚存段是进程一段连续的虚存空间,在这段虚存里,所有单元拥有相同特征。
虚存段的属性描述
Linux用数据结构vm_area_struct描述了虚存段的属性,它主要包括:
(1) vma在虚存中的起始地址和终止地址;
(2) vma段内容来源,例如磁盘文件由其inode指示。
(3) 一系列对vma操作例程。
(4)同一进程的vma段的vm_area_struct结构通过vm_next指针连接组成链表。系统以虚拟内存地址的降序排列vm_area_struct结构。这样建立了文件的逻辑地址到虚拟线性地址的映射。
进程内存结构
Linux用结构mm_struct描述了一个进程的整个虚拟地址空间。mm_struct结构包含了当前可执行文件信息和进程页目录指针pgd,以及指向vm_area_struc结构链表的指针。进程的task_struct内嵌了mm_struct的指针mm。
图9_9 虚存数据结构的关系
Linux利用计算机系统的虚拟存储技术实现了内存的虚拟存储管理。
本节以80386为例讨论Linux存储管理技术。
9.3.1 Linux的分段和分页机制
1.分段机制
80386的两种工作模式
80386的工作模式包括实地址模式和虚地址模式(保护模式)。Linux主要工作在保护模式下。
分段机制
在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB。
从逻辑地址到线性地址的转换由80386分段机制管理。段寄存器CS、DS、ES、SS、FS或GS标识一个段。这些段寄存器作为段选择器,用来选择该段的描述符。
分段逻辑地址到线性地址转换图
图9_7 分段逻辑地址到线性地址转换图
2. 分页机制
分页机制的作用
分页机制是在段机制之后进行的,它进一步将线性地址转换为物理地址。
80386使用4K字节大小的页,且每页的起始地址都被4K整除。因此,80386把4GB字节线性地址空间划分为1M个页面,采用了两级表结构。
两级页表
两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节,线性地址最高的10位(22-31)用来产生第一级表索引,由该索引得到的表项中的内容定位了二级表中的一个表的地址,即下级页表所在的内存块号。
第二级表称为页表,存储在一个4K字节页中,它包含了1K字节的表项,每个表项包含了一个页的物理地址。二级页表由线性地址的中间10位(12-21)位进行索引,定位页表表项,获得页的物理地址。页物理地址的高20位与线性地址的低12位形成最后的物理地址。
利用两级页表转换地址
图9_8 利用两级页表转换地址
3. 内核空间和用户空间
用户空间
在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,用户进程可以直接访问。
内核空间
从3GB到4GB的虚存地址为内核态空间,存放供内核访问的代码和数据,用户态进程不能访问。所有进程从3GB到4GB的虚拟空间都是一样的,linux以此方式让内核态进程共享代码段和数据段。
4. Linux存储映射
虚存段
Linux在管理进程虚存空间时定义了虚存段(vma)。虚存段是进程一段连续的虚存空间,在这段虚存里,所有单元拥有相同特征。
虚存段的属性描述
Linux用数据结构vm_area_struct描述了虚存段的属性,它主要包括:
(1) vma在虚存中的起始地址和终止地址;
(2) vma段内容来源,例如磁盘文件由其inode指示。
(3) 一系列对vma操作例程。
(4)同一进程的vma段的vm_area_struct结构通过vm_next指针连接组成链表。系统以虚拟内存地址的降序排列vm_area_struct结构。这样建立了文件的逻辑地址到虚拟线性地址的映射。
进程内存结构
Linux用结构mm_struct描述了一个进程的整个虚拟地址空间。mm_struct结构包含了当前可执行文件信息和进程页目录指针pgd,以及指向vm_area_struc结构链表的指针。进程的task_struct内嵌了mm_struct的指针mm。
图9_9 虚存数据结构的关系