第三章x86的虚拟存储系统Linux操作系统当前主要在Intel80386、80486和Petium系列机器上运行,它们统称为x86机器。x86具有两种存储器管理模式:实地址模式和受保护的虚地址模式,后者简称保护模式。在实地址模式下,CPU只能寻址1MB的内存空间。在保护模式下,x86提供了实现虚拟存储的硬件机制,它是操作系统实现多进程(多进程)存储管理以及提供存储保护的硬件基础。§3.180386的虚拟地址空间x86的系统结构中专门设置了用于实现虚拟存储技术的硬件机制,即分页和分段机制。各个进程的存储区域彼此隔离,每个进程都可以独立使用自己的虚拟地址空间,从而保证了进程的信息安全。一.x86的地址转换机制程序代码和数据都是存放在内存储器中,内存储器又称物理存储器,物理存储器是CPU可以直接访问的存储空间。80386机器的地址总线为32位,由它确定的物理地址空间的范围可达232字节,即4G字节。指令中访问存储空间的地址称为逻辑地址,由逻辑地址确定的存储空间称为逻辑地址空间。x86的逻辑地址为48位,由它确定的逻辑地址空间可达64T字节。逻辑地址必须转换成物理地址后才能访问物理存储器。在x86中逻辑地址由分段机制把逻辑地址转换成线性地址。再由分页机制把线性地址转换成物理地址。二.80386的虚拟地址空间x86把虚拟地址空间分成性质不同的两部分:全局地址空间和局部地址空间。全局地址空间是系统中所有的进程共享的地址空间,通常存放操作系统资源和数据。局部地址空间由各个进程使用,用于存储进程各自的代码和数据等。x86分段机制对虚拟地址空间实行分段管理,把虚拟地址空间分成大小不同的存储段。一个段的空间最大可达232字节,即4GB。64TB的虚拟地址空间最多可以分为16K个段。其中全局地址空间和局部地址空间最多可以各有8K个段,称为全局段和局部段。§3.2段描述符表一.段描述符表在分段存储管理中,使用段描述符表记录各个进程使用的段空间位置、大小和有关属性。段描述符表的表项称为段描述符。每个段描述符的长度为8字节。对应全局段和局部段,系统提供全局描述符表GDT和局部描述符表LDT。GDT以由所有的进程共享,系统中只有一个GDT。LDT用于描述进程的各个局部段。每个进程都有1属于它的LDT,即系统中有多少个进程就有多少个LDT。系统的GDT和各个进程的LDT都存放在线性地址空间的特定区域内。二.全局描述符表GDTGDT在线性地址空间中的位置是由全局描述符表寄存器GDTR的值确定的。GDTR寄存器的长度为48位:4716150GDTR表基址表限GDT中一般包括三种不同种类的描述符。●系统内核代码段和数据段的描述符●进程状态段(TSS)的描述符●LDT描述符,每个进程的LDT描述符在GDT中的位置,记录在该进程TSS段的一个16位的位域中,该位域的值称为LDT选择符。三.局部描述符表LDT在多进程操作系统中,对于一个进程的代码段和数据段的描述和定义是由局部描述符表LDT完成的。每个进程都有自己的LDT,它存放在该进程独立的虚拟地址空间中。一个进程的LDT中至少包括3个描述符。NULL用户代码段描述符用户数据段描述符当进程LDT的定位是局部描述符表寄存器LDTR和相应的LDTR高速缓存实现的:LDTR寄存器LDTR高速缓存1504716150选择符(16位)LDT表基址(32位)表限(16位)(程序不可见)LDTR是指出当前进程的LDT描述符在全局描述符表GDT中的位置。在进程切换时,系统从当前进程的TSS中取出LDT选择符的值,装入LDTR寄存器内。LDT的表限为16位,由它确定的最大地址空间为216,即64K2字节。每个描述符的长度为8字节,一个LDT最多可以拥有8K个描述符。每个描述符对应一个局部段,所以系统中一个进程最多可以有8K个局部段。§3.3逻辑地址向线性地址的转换一.线性地址空间每个进程必须有自己独立的存储空间,这个由进程使用的存储空间就是线性地址空间,线性地址空间仍是虚拟存储空间。通过分段机制把每个进程在逻辑地址空间的代码段和数据段映射到进程的线性地址空间。除此之外,操作系统本身也必须映射到进程的线性地址空间中。进程的线性地址空间被分成系统区和用户区。系统区用于存放操作系统的代码、数据和各种全局数据结构。用户区用于存放进程的代码、数据、堆栈以及进程的各种数据结构二.逻...