linux系统的初始化

上传人:豆浆 文档编号:11122253 上传时间:2017-09-02 格式:PDF 页数:50 大小:547.50KB
返回 下载 相关 举报
linux系统的初始化_第1页
第1页 / 共50页
linux系统的初始化_第2页
第2页 / 共50页
linux系统的初始化_第3页
第3页 / 共50页
linux系统的初始化_第4页
第4页 / 共50页
linux系统的初始化_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《linux系统的初始化》由会员分享,可在线阅读,更多相关《linux系统的初始化(50页珍藏版)》请在金锄头文库上搜索。

1、 Linux 系统的初始化 Jinsheng shi 第 1 页 (共 50 页 ) Linux 系统的初始化 本文的内容是讲述从 Linux 系统启动部分。即当你按下 power 键到你看到 login:的整个过程牵扯的东西很多很多。所以专门写一个专题来将将这个东西。 本文不局限于 Linux 的启动过程的分析,同时兼顾对系统结构方面的介绍。本文的另外一个目的是为了自己找工作,复习一下相关的知识。 与这个部分相关的代码主要是: 1、 Bootsect.s, setup.S 和 head.S 2、 Init 目录下面的 main.c /arch/i386 下面的其他代码也是很重要的。 1、

2、基础知识 1.1 386 的体系结构 80386 的芯片内部被分为独立的六个处理部件:总线接口部件,执行部件和分段部件,分页部件, 指令预取和指令译码部件。 其中分段部件和分页部件统称为 MMU 内存管理部件。这六个部件是并行工作的,构成了一个 6 级流水体系结构,从而大大提高了处理效率。对于程序设计人员来讲要了解 386 的寄存器结构要比知道物理上的实现更加重要。 80386 的内部有 30 多个寄存器。其中可以分为如下五类:通用寄存器,段寄存器,系统地址寄存器,控制寄存器,以及调试和测试寄存器。 1.1.1 通用寄存器 : 在应用程序用来对程序的数据进行存取和计算。 80386 有 8 个

3、 32 位的通用寄存器,如下图 1.2 所示。他们是在 16 位寄存器的扩展。故命名为 EAX,EBX,ECX,EDX,EBP,ESI,EDI和 ESP。数据可以是 1 位, 8 位, 16 位, 32 位和 64 位 (MMX)。访问寄存器的尺寸可以为 8位, 16 位,和 32 位,并给不同的尺寸赋予不同的名字。比如 EAX 是 32 位, AX 是 16 位,AL 和 AH 是 8 位。 两个附加寄存器保留了当前指令流的状态信息。 EIP 寄存器包含的是当前指令的下一条指令的偏移地址。 EFLAGS 中包含了与各个指令相关的信息位。 EIP 或 IP 与 CS 段寄存器共同指出了下一条被

4、执行指令的存储器地址。 EFLAGS 的寄存器包含如下字段: 图 1.1 EFLAGS 寄存器 (图来源于 IA32 手册 ) CF 进位标志 PF 奇偶标志 当某个算术运算操作生成有偶数个 1 时,该位被置位 AF 辅助进位标志 当 AL 的寄存器低半个字节发生进位时被置位。由 BCD 码控制。 Linux 系统的初始化 Jinsheng shi 第 2 页 (共 50 页 ) ZF 0 标志,如果运算结果为 0,该为被置 1 SF 符号标志 当 SF 1 时,表明结果是负数。 TF trace 标志。如果 TF 1,那么下一条指令执行完后立即触发 INT 1 IF 中断允许标注 如果 I

5、F 1 是响应中断的。 DF 是方向标志当 DF=1 时字符串操作从高地址向地址操作。 STD, CLD OF 指令是溢出标志 IOPL 是个双位字段 可以取 0 3 IOPL 是限定了 CPU 的安全级别。 NT 任务嵌套标志当调用、中断、 trace 或者异常引起任务切换时,设置该位为 1 RF 是重新启动的标志 VM 是虚拟 86 模式的标注 AC 此位仅用于 80486 中 图 1.2 通用寄存器 1.1.2 段寄存器 段寄存器中比较重要的是 CS 寄存器, CS 寄存器只能通过 CALL, RET 和 JMP 指令进行修改。别的指令修改都是违规的。另外段寄存器都配置了一个描述符高速缓

6、存,它保存了段寄存器的起始地址和段界限和访问权限。 这个高速缓存是不能访问的, 又称为影子寄存器。 堆栈的实现是通过段寄存器的 SS 和通用寄存器 ESP, EBP 组成的。栈是倒挂的栈,在调用一个子程序段的时候一般先要开辟一段空间作为栈空间,然后按照 CSDEL 或者pascal_DEL 的顺序进行将参数压栈, C 的是从右到左, 这些参数通过堆栈进行传递其中 EBP一般指向这些参数。 1.1.3 系统地址寄存器 系统地址寄存器是一般用来管理保护模式下使用的系统表。 系统描述表有全局描述符表(GDT)和中断描述符表 (IDT)、 局部描述符表 ( LDT) 和用来存储任务内容的任务状态段 (

7、TSS)。因此就对应了 4 个系统地址寄存器。 GDTR 是 48 位寄存器。存放的是 GDT 的 32 位线性地址和 16 位的 GDT 的界限值。 IDTR 是 48 位寄存器。存放的是 IDT 的 32 位线性地址和 16 位的 IDT 的界限值。 TR 是 16 位的寄存器,放的是任务状态段的 TSS 的 16 位选择字。在 GDT 中去查表。 LDTR 是 16 位的寄存器。放的是局部描述符表的 LDT 的 16 位选择字。 Linux 系统的初始化 Jinsheng shi 第 3 页 (共 50 页 ) GDTR 和 IDTR 必须在进入保护模式前设置好,这两个寄存器在实模式下

8、可以访问。LDTR 和 TR 仅能在保护模式下使用。 图 1.3 系统地址寄存器 1.1.4 控制寄存器 80386 内部有 3 个 32 位的控制寄存器 CR0,CR2,CR3,用来控制分页和数学协处理器的操作,保存机器的各个全局状态。其中的 CR0 最重要。 PE 是 保护模式允许位。通过此位切换到保护模式 MP 表示协处理器是不是存在 TS 是任务切换标志 EM 模拟协处理器位,当此位被清除时,协处理器指令才会在协处理器上执行 PG 分页允许控制位。 PG=0 禁止分页部件工作。 PG PE 工作模式 0 0 实模式 0 1 不分页保护模式 1 0 无定义 1 1 分页保护模式 CR1

9、没有定义 CR2 是页面故障线性地址寄存器 CR3 是页目录基地址寄存器 CR3 中放着页目录表的基地址。 调试寄存器很少用到就不说了。 1.2 IA32 CPU 的工作模式 Intel CPU 的早期的 CPU 只存在一种操作模式,即现在所说的实模式 (Real Mode,以下简称 RM)。在 Intel 推出 80286 之后,为了增强 CPU 的处理能力,同时也为了适应当时的软件开发需求, Intel 提出了保护模式 (Protected Mode,以下简称 PM),但在 80286 下的 PM 由于 CPU 本身设计的问题,并没有使其发挥出很大的功效。在 80386 推出之后, Int

10、el 完善了CPU 的设计形成了最终的 IA-32 架构,并提出了另一种虚拟 X86 模式。 Linux 系统的初始化 Jinsheng shi 第 4 页 (共 50 页 ) 实模式 RM:此模式是主机在加电或复位后自动进入的模式,在此模式下其可以执行16 位指令 保护模式: 在此模式下, CPU 能够支持其自身的 32 位特性,使自身处于最高性能表现。 这些特性主要包括: 1 最大可访问 4GB 内存空间。 2 虚拟存储。处于 PM 下的 CPU 其内存管理单元( MMU)支持这项特性。前面我已经说到,在 PM 下 CPU 最大寻址空 间为 4GB,而在实际中,我们并没有如此大的物理内存

11、空间。因此通过 MMU,可以将外存设备(如:硬盘)的一部分 空间模拟成物理内存进行使用。 3 地址映射。即 MMU 可以在地址使用前对其进行转换,即所谓的映射。 4 改进的分段机制。 5 内存保护与任务保护。即在 PM 状态下,引入了权限机制。通过权限控制可以达到保护相关代码和数据的目的。 6 改进的寻址模式。在 RM 下,只有常数, BX 或 BP,SI 或 DI 可以用来形成地址,而在RM 下可以通过任意寄存器进行寻 址,并且可以包含一个为 2, 4 或 8 的比例因子。 7 多任务支持。在 PM 下, CPU 提供了特殊的机制能够进行快速的上下文切换。 虚拟 86 模式:就是为了向下兼容

12、原来 8086 下的程序。 图 1.4 三种模式之间的切换 1.2.1 保护模式 由于 CPU在 32位保护模式下才能发挥真正的实力, 所以我们详细讲述保护模式的原理。在介绍保护模式之间,先简单区分几个专业词汇: 逻辑地址、虚拟地址、线性地址和物理地址 逻辑地址是当一个程序访问存储器而并不需要考虑操作方式和具体物理硬件细节时, 它所使用的地址就是逻辑地址。也就是说逻辑上的地址。 虚拟地址,当然要对应虚拟内存。虚拟地址是由两个逻辑地址构成的。一个段地址,一个段内偏移。 而对于同一个虚拟地址由于分页机制的存在可能在不同的时间对应的是不同的物理存储地址。 线性地址: 由两个部分的实模式下的分段地址和

13、保护模式下的虚拟地址最终被转换成一个线性地址。在早期的 8086 80286 下线性地址就是物理地址。在 80386 后,需要通过分页机制转换才变成物理地址。 Linux 系统的初始化 Jinsheng shi 第 5 页 (共 50 页 ) 物理地址:硬件地址。 在讨论保护模式的时候我们将按照分段和分页模式分别讨论。 分段管理 在保护模式下运行程序的虚拟地址就像在实地址模式下运行程序的分段地址一样。 虚拟地址有两个部分构成,一个 16 位的段选择器和一个 32 位的地址偏移量。段选择器通过在描述符表中选取一个描述符,而描述符描述了段的基地址和控制信息。通过段基址和 offset 得到线性地

14、址。如果分页部件是关闭的那么就得到了物理地址。这种机制和实模式下的区别在于段选择器和多出来的描述符表。 那描述符表究竟是什么东西呢? 描述符表是一个存放在存储器的系统数据结构。 他决定了如何将虚拟地址转化为线性地址。既然所有的段选择器 (CS,DS,ES,SS 等 )都是通过描述符表来实现的。那么他们之间必然需要一些机制来区分。因此描述符表中除了实际的段基址外还有一些控制信息。根据这些控制信息,可以将描述符分为如下类别: 一般描述符 Linux 系统的初始化 Jinsheng shi 第 6 页 (共 50 页 ) P 位 ,这个位确定了段是否存在。当该位被清除时 ,如果存在任务要访问这个段

15、 .那么 CPU会产生一个错误 ,并会从外存 (如 :硬盘 )中调入该段并再次尝试 .当该位被清除时 ,描述符中的 0到 39位和 48到 63位能够包含任意值 .你也可以用这些空间来存储该段在磁盘空间中的地址。 A位 ,CPU会在对其所在段写入数据后 ,将该位置 1,这样在做段的磁盘交换时 ,可以决定是否将该段写入磁盘。 G 位。在描述符中段界限仅仅为 20 位 .那么其如何能够设置成 1MB 到 4GB 之间的范围呢 .这里 G 位其了重要的作用 .当 G 位被清零时 ,界限域就是段的最大合法偏移 .而如果 G 位被置成 1,那么会把描述符中的段界限左移 12 位形成 32 位界限 ,再将低 12 位全部填 1.这样 ,实际上就能够指定 1MB 以下的任意长度 ,和以 4K 到 4GB 为单位的长度 . 假定要在进入 PM 后 ,使代码段和数据段能够访问全部线性空间 ,于是可将 GDT 设置为 : gdt dd 00000000h, 00000000h ;空 /这个很重要 gdt.Code32 dd 0000ffffh, 00cf9a00h ;代码段 读 /执行 4

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号