LINUX系统第三章--启动系统.pdf
### Linux系统启动过程详解 #### 一、引言 在深入了解Linux系统启动的过程之前,我们需要对几个关键概念有所了解:首先是8086汇编语言的基础知识,这对于我们理解bootsect.s、setup.s以及head.s这三个核心启动文件至关重要。此外,我们还需要了解80x86架构的工作原理及其如何进入保护模式进行编程。 #### 二、Linux启动流程概述 当PC开机时,x86 CPU会自动进入实模式,并从内存地址0xffff0处开始执行代码。这个地址通常位于ROM-BIOS中。在此阶段,PC的BIOS会检测机器的状态并初始化中断向量表(位于物理地址0处)。随后,BIOS将从可引导设备读取第一个扇区加载到内存绝对地址0x7c00处,并跳转至此地址继续执行。 一般情况下,可引导设备为软盘驱动器或硬盘驱动器。而Linux的核心部分(boot/bootsect.s)是用8086汇编语言编写的,并存储在可引导设备的第一个扇区中。这段代码被加载至内存地址0x7c00(即31Kb处),并在执行过程中将自身移动到物理地址0x90000(即576Kb处)。接着,它会读取紧跟其后的2Kb代码(boot/setup.s)到地址0x902000处,同时将内核的其他部分(即系统模块)加载至地址0x10000(即64Kb处)。由于旧版本的Linux内核大小不超过0x80000(即512Kb),因此不会覆盖bootsect和setup模块,它们从0x90000开始。 接下来,setup程序会将系统模块移动到内存的起始位置。这样,代码地址便得以重新组织,确保了后续进程的顺利执行。 #### 三、关键启动文件解析 ##### 1. bootsect.s 文件 - **作用**:此文件负责处理初始硬件检测、加载内核的其他部分(如setup.s)以及将内核移到内存中的合适位置。 - **语法**:使用086汇编语言编写,类似于Intel汇编语言格式。编译与链接使用的是as86和ld86工具。 - **特点**:作为启动过程的第一步,它对于整个系统的启动至关重要。 - **示例代码**: ```assembly org 0x7C00 jmp start ... start: ; 初始化寄存器 ; 加载其他内核模块 ; 跳转到setup模块 ``` ##### 2. setup.s 文件 - **作用**:负责将内核的其余部分加载到内存中,并完成一些必要的初始化工作,如设置内存管理结构等。 - **语法**:使用GNU格式的汇编器,其语法类似于AT&T汇编语言。 - **特点**:在bootsect.s之后执行,负责内核的大部分初始化任务。 - **示例代码**: ```assembly .section .text .global start_kernel start_kernel: ; 设置内存管理结构 ; 进入保护模式 ; 调用内核的初始化函数 ``` ##### 3. head.s 文件 虽然题目中没有提及head.s文件的具体内容,但根据常见的Linux内核启动流程,我们可以推测: - **作用**:通常包含一些基本的初始化代码,比如设置栈指针、关闭中断等。 - **语法**:同样使用GNU格式的汇编器,类似于AT&T汇编语言。 - **特点**:为内核的初始化阶段提供必要的支持。 #### 四、结论 通过对Linux启动过程的深入分析,我们可以看出,bootsect.s、setup.s和head.s这三个文件在系统启动过程中扮演着极其重要的角色。从硬件检测到内核初始化,每一个步骤都经过精心设计,确保了Linux系统的稳定性和高效性。理解这些基础知识不仅有助于我们更好地掌握Linux系统的内部运作机制,还能为解决实际问题提供有力的支持。
剩余32页未读,继续阅读
- 粉丝: 1
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助