热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

Linux在X86上的虚拟内存管理

来源: 作者: 时间:2007-06-26 Tag: 点击:

  前言

  Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等。对于不能够通用的一些功能,Linux必须依据硬件平台的特点来具体实现。本文的目的是简要探讨Linux在X86保护模式上如何实现虚拟内存管理功能。为简化和方便叙述,本文做如下限定:X86处理器为80486和其后的处理器,X86工作在保护模式,不采用物理内存扩展(使用32bits物理地址),不使用扩展页(页大小为4K)。凡是与限定模式无关的内容,本文都尽量略过。Linux的虚拟内存管理中与硬件平台无关的内容在本文中也被略过。本文所援引的Linux内核源代码版本为Linux 2.2.5。

  X86的分段和分页机制

  I. X86的分段机制和相应系统结构

  X86的分段机制就是将X86的线性地址空间分成许多小空间--段(segment),利用这些段来存储(记录)代码和数据,通过对段的保护来提供一种对数据或代码的保护。根据每个段的作用和存储内容的不同,X86将段分为三类进程段(代码段、数据段和堆栈段)和两类系统段:任务状态段(TSS,Task-State Segment)和LDT段(由于GDT不是通过段描述符和段选择符来访问,所以X86没有认为存在一个GDT段;同理,也不存在IDT段)。

  在分段机制,X86使用了如下几种主要数据结构:

  • 全局描述符表(GDT,Global Describtor Table):存放系统用的段描述符和各项任务共用的段描述符,可以是上述的任何一类段的段描述符,最大表长64KB;

  • 局部描述符表(LDT,Local Describtor Table):存放某个任务专用的各段的段描述符,只能是三类进程段的段描述符和调用门描述符,最大表长4GB;

  • 段描述符(Segment Describtor):64bits,用来描述一个段的基地址(该地址是线性地址),该段的类型,对该段操作的限制;

  • 门描述符(Gate Describtor):64bits,一种特殊的描述符,为处于不同特权级的系统调用或程序的调用或访问提供保护;分为四类:调用门描述符(Call Gate Describtor)、中断门描述符(Interrupt Gate Describtor)、陷阱门描述符(Trap Gate Describtor)、任务门描述符(Task Gate Describtor);

  • 段选择符(Segment Selector):16bits,用于在GDT或LDT中索引相应的段描述符;

  • 中断描述表(IDT,Interrupt Describer Table):存放门描述符,只能是中断门描述符,陷阱门描述符和任务门描述符,最大表长64KB;

  同时,X86提供了如下几个用于支持分段机制的寄存器:

  • 全局描述符表寄存器(GDTR,GDT Register):48bits,32bits为GDT的基地址(线性地址),16bits为GDT的表长;GDTR的初始值为:基地址0,表长0xFFFF;

  • 局部描述符表寄存器(LDTR,LDT Register):80bits,16bits为LDT段选择符,64bits为该LDT段的段描述符;

  • 中断描述符表寄存器(IDTR,IDT Register):48bits,32bits为IDT的基地址(线性地址),16bits为IDT的表长;IDTR的初始值为:基地址0,表长0xFFFF;

  • 任务寄存器(TR,Task Register):80bits,16bits为任务状态段选择符,64bits为该任务状态段的段描述符;

  • 六个段寄存器(Segment Register):分为可见部分和隐藏部分,可见部分为段选择符,隐藏部分为段描述符;六个段寄存器分别为CS、SS、DS、ES、FS、GS;关于这些段寄存器的作用参见[1]中3.4.2 'Segment Register';

  86工作在保护模式时,进程使用的48bits逻辑地址(Logical address)。逻辑地址的高16bits为段选择符,低32bits是段内的偏移量。通过段选择符在GDT或LDT中索引相应的段描述符(得到该段的基地址),再加上偏移量得到逻辑地址对应的线性地址(Linear Address)。如果没有采用分叶管理,线性地址是直接映射物理地址(Physical Address),于是可以直接用线性地址访问内存;否则,还要通过X86的分页转换,将线性地址转换为物理地址。

  以上是对X86分段相关内容的简要描述,对于各数据结构、寄存器的细节和逻辑地址转换为线性地址的细节,请查阅 [1]。



相关文章:
apache jsp tomcat 虚拟主机 在加上pure-ftp
squid 优化(解释篇)
调整centos文件打开数
REDHAT AS安装10g错误
用SystemImager克隆系统(一)
openssh 5.1版使用chroot sftp帐号技术
HPUX从入门到提高之三
postfix+vm-pop3+openmail 构造邮件服务器
SecureCRT设置
双机备份方案(resin集群+冷备)
开启rsh服务
Solaris9允许root用户登录ssh
Solairs如何上网?
实战PXE启动安装Redhat AS 5 Linux
RHCT Lab1: Network Installation
RHCE Lab1: Kickstart
RHCE Lab1.1: Auto Installation
apache版本号显示的问题
修改tomcat端口号
RS/6000小型机故障的基本定位方法
Linux下的权限管理-ACL
CactiEZv9监控CentOS5.0
Red Hat Enterprise Linux 5.2 简明安装手册
StorNext 简单安装说明
FreeBSD7 Apache2.2 PHP5 PostgreSQL8.3 Ports安
关于nagios监控系统添加主机和服务脚本
C和C++语言学习总结
apache优化
CentOS+Nginx+PHP+Mysql(1)
Apache服务器限制并发连接和下载速度