转自<http://www.docin.com/p-550589514.html>
对于 Intel x86 PC , 开启电源后, 机器就会开始执行 ROM BIOS 的一系列系统测
试动作,包括检查RAM,keyboard,显示器,软硬磁盘等等。执行完bios 的系统测试之后,
紧接着控制权会转移给ROM 中的启动程序(ROM bootstrap routine);这个程序会将磁盘上的
第 0 轨第 0 扇区 (叫boot sector 或 MBR <Master Boot Record >,系统的引导程序就放在
此处)读入内存中,并放到自 0x07C0:0x0000 开始的 512 个字节处;然后处理机将跳到此处
开始执行这一引导程序;也即装入MBR 中的引导程序后, CS:IP = 0x07C0:0x0000 。加电后
处理机运行在与 8086相兼容的实模式下。
如果要用 bootsect-loader进行系统引导,则必须把 bootsect.S 编译连接后对应的
二进制代码置于 MBR; 当ROM BIOS 把 bootsect.S 编译连接后对应的二进制代码装入内存
后,机器的控制权就完全转交给 bootsect; 也就是说,bootsect 将是第一个被读入内存中
并执行的程序。 Bootsect 接管机器控制权后,将依次进行以下一些动作:
1.首先,bootsect 将它"自己"(自位置 0x07C0:0x0000 开始的 512 个字节)从被 ROM
BIOS 载入的地址 0x07C0:0x0000处搬到 0x9000:0000 处; 这一任务由 bootsect.S 的前十条
指令完成;第十一条指令“jmpi go,INITSEG”则把机器跳转到“新”的 bootsect 的“jmpi
go,INITSEG”后的那条指令“go: mov di,#0x4000-12”;之后,继续执行bootsect 的剩
下的代码;在bootsect.S 中定义了几个常量:
BOOTSEG = 0x07C0 bios 载入 MBR 的约定位置的段址;
INITSEG = 0x9000 bootsect.S 的前十条指令将自己搬到此处(段址)
SETUPSEG =0x9020 装入 Setup.S 的段址
SYSSEG =0x1000 系统区段址
对于这些常量可参见/include/asm/boot.h 中的定义;这些常量在下面的分析中将会经常用
到;
2.以0x9000:0x4000-12为栈底,建立自己的栈区;其中0x9000:0x4000-12到
0x9000:0x4000 的一十二个字节预留作磁盘参数表区;
3.在0x9000:0x4000-12到0x9000:0x4000 的一十二个预留字节中建立新的磁盘
参数表,之所以叫“新”的磁盘参数表,是相对于bios 建立的磁盘参数表而言的。由于
设计者考虑到有些老的bios 不能准确地识别磁盘“每个磁道的扇区数”,从而导致bios
建立的磁盘参数表妨碍磁盘的最高性能发挥,所以,设计者就在bios 建立的磁盘参数表
的基础上通过枚举法测试,试图建立准确的“新”的磁盘参数表(这是在后继步骤中完成
的);并把参数表的位置由原来的0x0000:0x0078搬到 0x9000:0x4000-12;且修改老的磁
盘参数表区使之指向新的磁盘参数表;
4.接下来就到了load_setup子过程;它调用0x13 中断的第2 号服务;把第0
道第 2扇区开始的连续的 setup_sects (为常量4)个扇区读到紧邻bootsect 的内存区;,
即0x9000:0x0200 开始的2048个字节;而这四个扇区的内容即是
/arch/i386/boot/setup.S 编译连接后对应的二进制代码; 也就是说,如果
要用bootsect-loader进行系统引导,不仅必须把bootsect.S 编译连接后对应的二进制
代码置于MBR,而且还得把 setup.S编译连接后对应的二进制代码置于紧跟MBR 后的连续
的四个扇区中;当然,由于setup.S对应的可执行码是由bootsect 装载的,所以,在我
们的这个项目中可以通过修改bootsect 来根据需要随意地放置 setup.S对应的可执行
码;
5.load_setup子过程的唯一出口是probe_loop 子过程;该过程通过枚举法测试
磁盘“每个磁道的扇区数”;
6.接下来几个子过程比较清晰易懂:打印我们熟悉的“Loading”;读入系统到
0x1000:0x0000; 关掉软驱马达;根据的5步测出的“每个磁道的扇区数”确定磁盘类型;
最后跳转到 0x9000:0x0200,即setup.S对应的可执行码的入口,将机器控制权转交
setup.S;整个bootsect 代码运行完毕;
相关推荐
### Linux启动时间优化 在现代计算环境中,系统启动速度对于用户体验和系统性能至关重要。本文将深入探讨如何优化Linux系统的启动时间,并提供一系列实用的技术和工具,帮助用户缩短启动过程。 #### 一、什么是...
Linux 启动 bootargs 参数分析 在 Linux 启动过程中,bootargs 参数扮演着重要的角色,该参数用于传递启动选项和配置信息给内核。Linux 内核在启动时对 bootargs 参数的解析可以分为两大块:setup_arch 函数和 ...
startup.sh linux 启动jar包命令startup.sh linux 启动jar包命令startup.sh linux 启动jar包命令startup.sh linux 启动jar包命令startup.sh linux 启动jar包命令
### Linux启动过程综述 #### 一、引言 Linux是一种开源的操作系统,以其高度的稳定性和安全性在服务器领域有着广泛的应用。对于深入理解Linux系统的行为及其管理来说,掌握Linux的启动过程至关重要。本文旨在详细...
Linux启动过程详解 在计算机硬件启动时,操作系统是通过一系列复杂的步骤加载到内存并开始运行的。对于Linux系统,这个过程同样遵循特定的流程。本文将深入解析Linux的启动步骤,帮助你理解从按下电源键到看到登录...
嵌入式Linux启动过程是操作系统运行的起点,它涉及到硬件初始化、内核加载、设备驱动启动等一系列复杂步骤。本文将深入解析这一经典话题,帮助读者理解Linux系统如何从零开始,一步步走向运行状态。 首先,启动流程...
Linux启动过程是一个复杂而有序的序列,涉及到许多关键组件和服务的初始化。对于新手来说,理解这个过程并学会排错是成为Linux系统管理员的基础。本文将深入探讨Linux启动排错实例,帮助你掌握这一核心技能。 首先...
### Linux启动过程详解 在深入理解Linux操作系统的工作原理时,了解其启动流程是至关重要的一步。本文将详尽解析Linux的启动过程,包括从引导区加载到系统初始化的各个环节。 #### 引导区引导 Linux的启动始于...
### Linux启动及配置详解 #### 引言 Linux作为全球广泛使用的开源操作系统,其启动过程与配置机制一直是IT专业人士关注的焦点。理解Linux如何从一个静默的机器状态转变成一个功能完备的操作环境,不仅有助于深入...
### Linux启动流程分析 #### 一、Bootloader启动内核过程 Linux系统启动时的核心流程之一便是由Bootloader引导内核。在这个过程中,Bootloader负责完成一系列基础设置,并最终将控制权交给内核。以下是对...
知名linux启动盘制作工具,方便好用的工具,可制作linux启动盘u盘,简单干净
Linux启动器是Linux操作系统在Windows平台上的一种便捷安装方式,它允许用户无需分区或创建独立的系统,即可在Windows系统内安装Linux发行版。Wubi(Windows Ubuntu Installer)是这一功能的具体实现工具,使得非...
u-boot启动后会运行液晶初始化程序并显示启动LOGO,但进入linux系统之后,又重新初始化一次,而且uboot与linux定义的显存地址也不一致,...此补丁解决从uboot到linux启动完成一直保持LOGO不变,且中间不闪烁不闪屏。
创建一个Linux启动盘是安装或维护Linux系统的重要步骤,特别是在没有内置光驱或者需要快速部署的场景下。本篇文章将详细阐述如何从U盘启动并网络安装Linux,以及相关的知识点。 首先,我们需要了解Linux启动过程。...
Linux 启动 JBoss 服务器详解 Linux 作为一种流行的开源操作系统,在企业应用中广泛应用,其中 JBoss 服务器作为 Java EE 企业级应用服务器,在 Linux 平台上运行非常常见。因此,本篇文章将详细介绍如何在 Linux ...
linux 启动的命令,还比较实用。详细的信息请下载使用。谢谢
tomcat window、linux启动脚本
Linux启动过程是一个复杂而有序的序列,涉及到多个组件和阶段,从硬件初始化到操作系统核心的加载,再到用户空间服务的启动。以下是对Linux启动过程的详细解析,主要以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为例,...