当前位置:Linux教程 - Linux综合 - 基于i386的Linux实现特点剖析——基础的基础

基于i386的Linux实现特点剖析——基础的基础

  摘要    本文讨论的是Linux在i386体系的cpu上实现特点。通过介绍i386cpu的保护方式下的中断机制、存储器的段页式管理以及任务切换而提供的硬件机制,比较Linux的具体实现的特点与i386的设计意图之间的差异。描述了Linux中断向量表的设置过程,中断请求队列的初始化以及如何将特定的中断服务程序挂入指定的中断请求队列中。跟踪Linux中从逻辑地址到线性地址再到物理地址的变换过程,着重于线性地址到物理地址的页式变换,并结合i386cpu分析地址变换的效率。  基于i386体系结构的Linux实现特点剖析  一 前言    本文讨论的是linux在i386体系的cpu上实现特点。通过介绍i386cpu的保护方式下的中断机制、存储器的段页式管理以及任务切换而提供的硬件机制,比较Linux的具体实现的特点与i386的设计意图之间的差异。描述了Linux中断向量表的设置过程,中断请求队列的初始化以及如何将特定的中断服务程序挂入指定的中断请求队列中。跟踪Linux中从逻辑地址到线性地址再到物理地址的变换过程,着重于线性地址到物理地址的页式变换,并结合i386cpu分析地址变换的效率。  二 80386 保护方式    80386有两种工作方式:实方式和保护方式。尽管实方式下80386的功能较Intel先前的微处理器有很大的提高,但只有在保护方式下,80386才能真正发挥作用。在保护方式下,全部32根地址有效,可寻址达4G字节的物理空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能快速的进行任务切换和任务保护环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码及数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086代码。    1、80386 保护方式的寻址    在保护方式下,当寻址扩展内存中的数据和程序时,仍然使用偏移地址访问位于存储器内的信息,但保护方式下的段地址不再像实方式那样有段寄存器提供,而是在原来放段地址的段寄存器里含有一个选择子,用于选择描述符表内的一个描述符。描述符描述存储器的位置、长度和访问权限。    保护方式下有两个描述符表:全局描述符表和局部描述符表。全局描述符表包含适用于所有程序的段定义,而局部描述符表通常用于唯一的应用程序。每个描述符表包含8129个描述符,所以任何时刻应用程序最多可用16384个描述符。    每个描述符长8字节,全局和局部描述符表每个最长为64kb。    80386描述符格式:  这里有表格     描述符的基地址指示存储段的起始位置,32位的基地址允许段其始于4GB存储器的任何地方。    段界限包含该段中最后的偏移地址,20位的段界限使得段的长度为1KB至1MB之间或者4KB至4GB之间。描述符中特征位:G位(粒度位),若G=0,说明段的界限为0000H到FFFFFH(从0到1MB),若G=1,段的界限值要乘4K段的长度为4KB到4GB。    若D=0,则指令是16位的,意味着使用16位偏移地址和默认的16位寄存器;若D=1,则指令就位32位。    访问权限字节具体如下:  有表格    P=0 描述符没有定义 P=1 段包含有效基地址和界限值   DPL 描述符的优先级    S=0 系统描述符 S=1 代码或数据段描述符   E=0 描述符描述数据段    ED=0 段向上扩展(数据段) ED=1 段向下扩展(堆栈段)    W=0 数据不能被写入 W=1 数据可以被写入   E=1 描述符描述代码段    C=0 忽视描述符的优先级 C=1 遵循描述符的优先级   R=0 代码段不能被读 R=1 代码段可以被读   A=0 段未被访问 A=1 段已经被访问    保护方式操作期间段寄存器的内容:  有表格     选择子从8192个全局或局部描述符表,为了访问和指定这些表的地址,微处理器中包含了一些程序不可见寄存器。在保护方式下,这些寄存器控制着微处理器。    在保护方式下,每个段寄存器都含有一个程序不可见区域,通常称为告诉缓冲器。每当段寄存器中的内容改变时,基地址、界限和访问权限就装入段寄存器中的不可见区域。这就允许微处理器重复访问一个段时,不必每次都去查询段描述符表。    有表格     全局描述符表的基地址和界限包含爱GDTR(全局描述符表寄存器)中。全局描述符表的最大长度为64K,因此描述符表的界限为16位。要使微处理器工作与保护方式,全局描述表的基地址和界限要装入GDTR。    有表格     而局部描述符表的位置是从全局描述符表中选择。为了寻址局部描述符表,必须建立一个全局描述符。为了访问局部描述符表,必须将选择子装入LDTR(局部描述符表寄存器),如同选择子装入段寄存器一样。这个选择子访问全局描述符表,并且将局部描述符表的基地址、界限和访问权限装入LDTR的告诉缓冲存储区。    有表格     分页机制式存储管理机制的第二部分。分页机制在段机制之后进行操作,以完成虚拟地址到物理地址的转换。段机制把虚拟地址转换为线性地址,分页机制进一步把线性地址转换为物理地址。       分页机制由微处理器中控制寄存器的内容控制。分页机制由CRO中的PG位启用。若PG=1,启用分页机制。PG=0,紧用分页机制,直接把段机制生成的线性地址当作物理地址。       CR1 保留未用   CR2 中存放出现页故障时的线性地址   CR3 中的PCD和PWT位控制微处理器PCD和PWT引脚的操作。  如果PCD置位,则PCD引脚在非分页总线周期变为逻辑1,这  就允许外部硬件控制二级高速缓冲存储器。PWT位也在非分  页周期出现在PWT引脚上,用于控制写直达系统中的高速缓  冲存储器。CR3还包含页目录基地址(CR3的高10位),用于  定位页转换部件的页目录。这个基地址将页目录定位于任何  以4KB为边界的存储器中。    由软件生成的线性地址分为三部分,分别用于寻址页目录项、页表项和页偏移地址。  线性地址: 有表格     页目录表存储在一个4k字节的页中。页目录表共有1024个表项,每个页目录表项为4字节长,并指向一个页表。线性地址的高10位用量产生对页目录表的索引,由索引得到的表项重,指定并选择了1024个4字节的表项,每个表项用以选择对应的物理页。    页目录和页表项:  有表格     页目录和页表项高20位包含物理地址的高20位,而低12位包含页的属性。  有表格     P 存在位,该位表示表项对地址转换有效(P=1)或无效(P=0)。在页转换期间,遇到无效表项,都会产生异常。若P=0,表项中的其余各位80386不对其做解释,可供软件使用。事实上,Linux在页面交换时就采用这种方法。当一个页面在内存中时,页面表中的表项的P位为,表示页面在内存中,而其余各位表示页面的各种属性。当一个页面被交换到了磁盘上,则相应的表项不再指向一个物理页面,而变成了一个磁盘页面,指示这个页面的去向。由于此时最低位为0,表示页面不再内存中,所以微处理器中的MMU单元对其各位都忽略不顾,而Linux内核中,就用它来唯一的确定一个页面在磁盘上的位置,包括在哪个文件或设备,以及页面在此文件汇中的位置。     R/M 该/写位。若该位为1,对页表指定的页可进行读、写或执行;若该位为0,该页可读或执行,但不能对该页进行写操作。然而读写位并不总起作用。但微处理器在超级特权级之一(0、1或2级)执行时,R/M位被忽略。在目录表项中的R/M位,应用于该目录表项所映射的所有页。     U/S 用户/系统位。若该委为1,页表指定的页可由在任何特权级下执行的程序访问;若该位为0,则该页只能在超级特权级执行阿程序访问。在目录表项中的U/S位,应用于该目录表项映射的所有各页。     PMT 写直达位。控制用写直达或写回策略应用于页表或页面缓存管理。若该位为1,页表或页面采用写直达的缓存策略;若该位为0,采用写回策略。     PCD 禁用高速缓冲位。若该位为1,页表和页面不用高速缓存;若该位为0,则可用高速缓存。当CRO中的CD位(Cache Disable)被置位,微处理器将忽略PCD位。     A 访问位。若该位为1,表明指向的页表和页面已经被访问过(读或写);反之,指向的页表和页面未被访问。     D 表明该页是否被写过。内存管理机制把某页调入物理内存时,将该位复位;当微处理器对其有写操作时,该位将会被置位。     AVL 供软件使用。     线性地址最低的12位和从页表项中的物理地址(高20位)形成了最后的物理地址。    2 保护方式下的中断    保护方式使用一组存储在中断描述符表(IDT,interrupt descriptor table)中的256个中断描述符取代实方式下的中断向量。中断描述符表为256*8(2K)字节长,每个描述符长8字节。中断描述符表由中断描述符表地址寄存器(IDTR)定位于系统中任一存储单元。IDTR长48位,其中32位的基地址规定IDT的基地址,16位的界限规定IDT的段界限。由于80386只支持最多256个中断/异常,所以IDT表最大长度是2K,以字节单位的段界限为7FFH。    描述符项又称为“门”,意思是当中断发生时必须通过这些门,才能进入相应的服务程序。但是,这样的门并不是光为中断而设的,只要想切换CPU的运行状态,即其优先级别,例如从用户的3级进入系统的0级,就都要通过一道门。而从用户态进入系统态的途径也不只限于中断(或异常,或陷阱),还可以通过子程序调用指令CALL和转移指令JMP来达到目的。    按不同的用途和目的,CPU一共有四种门,即任务门(task gate)、中断门(interrupt gate)、陷阱门(trap gate)和调用门(call gate)。除任务门外,其他三种门的结构基本相同,不过调用门
[1] [2] 下一页 

(出处:http://www.sheup.com)


上一页 [1] [2]