基于i386的Linux实现特点剖析——基础的基础基于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位。 访问权限字节具体如下: 有表格
保护方式操作期间段寄存器的内容: 有表格选择子从8192个全局或局部描述符表,为了访问和指定这些表的地址,微处理器中包含了一些程序不可见寄存器。在保护方式下,这些寄存器控制着微处理器。 在保护方式下,每个段寄存器都含有一个程序不可见区域,通常称为告诉缓冲器。每当段寄存器中的内容改变时,基地址、界限和访问权限就装入段寄存器中的不可见区域。这就允许微处理器重复访问一个段时,不必每次都去查询段描述符表。 有表格全局描述符表的基地址和界限包含爱GDTR(全局描述符表寄存器)中。全局描述符表的最大长度为64K,因此描述符表的界限为16位。要使微处理器工作与保护方式,全局描述表的基地址和界限要装入GDTR。 有表格而局部描述符表的位置是从全局描述符表中选择。为了寻址局部描述符表,必须建立一个全局描述符。为了访问局部描述符表,必须将选择子装入LDTR(局部描述符表寄存器),如同选择子装入段寄存器一样。这个选择子访问全局描述符表,并且将局部描述符表的基地址、界限和访问权限装入LDTR的告诉缓冲存储区。 有表格分页机制式存储管理机制的第二部分。分页机制在段机制之后进行操作,以完成虚拟地址到物理地址的转换。段机制把虚拟地址转换为线性地址,分页机制进一步把线性地址转换为物理地址。 分页机制由微处理器中控制寄存器的内容控制。分页机制由CRO中的PG位启用。若PG=1,启用分页机制。PG=0,紧用分页机制,直接把段机制生成的线性地址当作物理地址。
由软件生成的线性地址分为三部分,分别用于寻址页目录项、页表项和页偏移地址。 线性地址: 有表格页目录表存储在一个4k字节的页中。页目录表共有1024个表项,每个页目录表项为4字节长,并指向一个页表。线性地址的高10位用量产生对页目录表的索引,由索引得到的表项重,指定并选择了1024个4字节的表项,每个表项用以选择对应的物理页。 页目录和页表项: 有表格页目录和页表项高20位包含物理地址的高20位,而低12位包含页的属性。 有表格
更多相关文章
|
推荐文章
·线程与锁
精彩文章
|