1、基于 ARM7 的 uClinux 移植 1 引言 随着计算机技术的发展,嵌入式系统已不仅仅属于计算机领域的一个研究热点,在电子、工业控制、航空航天等领域都有广泛的应用。嵌入式设备应用广泛,几乎包括了我们周围的所有电器设备: PDA、手机、机顶盒、汽车、微波炉、自动取款机等。和通用计算不同的是嵌入式系统针对的是具体的专用系统 ,一般也都具有成本和空间的敏感性,它的硬件和软件都必须高效率的设计。在航空航天、医疗等特殊应用领域还要求做到很高的安全可靠性。嵌入式系统还可以根据任务灵活的增减软硬件。 uClinux 在官方 网站 (www.uClinux.org)中有源代码提供,同时也有文档说明所支持
2、的体系结构。结合实际的应用,在众多的体系结构中选择一种。下面介绍一下在移植 uClinux 中会遇到的一些关键问题。 ( 1)交叉编译环境的建立 移植 uClinux 必须有一台 PC 机,安装了 Linux 操作系统。同时还要有一块测试板,测试板的体系结构 uClinux 必须支持。对于不同体系结构, GNU都提供了相应的开发软件包。这可以到网上查找,有些是源代码包,下载后要经过 GCC 的编译才能应用 ;有些是应用程序包,安装后即可使用。安装完了工具 包后, Linux 中就有了基于该体系结构的编译器,链接器,调试器以及一些实用小工具,例如反汇编,反编译等,以后编译 uClinux 内核,
3、制作文件系统都要依赖交叉编译系统。 ( 2) uCli nux的内核加载方式的问题 uClinux 的内核有两种可选的运行方式 :可以在 Flash 上直接运行,也可以加载到内存中运行。前者可以减少内存需要。 Flash 运行方式 :把内核的可执行映像文件烧到 Flash 上,系统启动时从 Flash 的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的方法。 内核加载方式 :把内核的压 缩文件存放在 Flash 上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快 (RAM 的存取速率要比Flash 高 )。同时这也是标准 Linux 系统
4、采用的启动方式。这里需要编写一个 Bootloader 软件。Bootloader 软件实现的功能包括开机寄存器的配置,内核与文件系统的加载,传递硬件与启动参数给内核。网上有许多 Bootloader 可以下载,但是都需要根据自己测试板硬件的信息进行改写。与 PC 机上的加载过程做对比, Bootloader 的功能类似 BIOS+ Linux LILO。 ( 3) uC I i nux内核的编译 网上有许多 uClinux 源代码,最著名的就是 uClinux 官方网站。从网上下载一个 uClinux的源代码,根据自己的需要对内核进行裁减,用交叉编译器对内核进行编译。 ( 4) uClinu
5、x的根 (root)文件系统制作及其加载 uClinux 系统采用 :omfs 文件系统,这种文件系统相对于一般的 ext2 文件系统要求更少的空间。空间的节约来自于两个方面 :首先内核支持 romfs 文件系统比支持 ext2 文件系统需要更少的代码 ;其次 romfs 文件系统相对简单 ,在建立文件系统超级块 ( Superblock )需要更少的存储空间。 romfs 文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟 ram 盘的方法进行处理 ( ram 盘将采用 ext2 文件系统 )。同时 uClinux 内核也支持各种文件系统,例如,网络文件系统,在需要时可以进行 m
6、ount 。 在编译内核的同时也可以选择编译文件系统中的应用程序。在源代码包中有许多应用程序源代码,可以根据自己的需要进行选择。由于基于 Linux 的应用程序较多且源代码开发,因此基于 uClinux 的产品可以进行快速开发,只要能够找到 相应的源代码,在制作文件系统时编译进去就可以了。 2 uClinux 概述 Linux 是跨平台的操作系统,可支持 X86, MIPS, ARM 等各种内核,但无 论哪一种内核, Linux 运行都必须有内存管理单元。为了解决没有内存管理单元芯片如何运行 Linux, GNU组织开发了 uClinux,一种类 Linux的操作系统。 uClinux是专为无
7、存储器管理单元 (MMU)的微控制器打造的嵌入式 Linux 操作系统。 uClinux 首先被移植到摩托罗拉的 MC68328 DragonBall 集成微处理器上。从那以后, uClinux 越来越受到业界的青睐,被移植到更多的无 MMU 芯片上。 uClinux 是嵌入式 linux 的一个分支,具有开源的代码, 便于扩充实时性的要求,很高的适应性和可靠性 ,成熟的开发工具和可灵活配置的内核。 一个嵌入式 uClinux 系统由下面三个基本部分组成 : 引导程序、 uClinux 内核 (由内存管理、进程管理和中断处理等构成 )和文件系统。 uClinux 可以通过定制使内核小型化,还可
8、以加上 GUI(图形用户界面 )和定制应用程序,并将其放在 ROM, RAM, FLASH 或 Disk On Chip 中启动。由于嵌入式 uClinux 操作系统的内核定制 具有 高度灵活性,开发者可以很容易地对其进行按需配置,来满足实际应用的要求。 下面的内容主要介绍 uClinux 内核、启动、文件系统的原理。 2.1 uClinux 内核的基本原理 uClinux 内核的结构如下 图 所示 : 图( 1) uClinux内核结构框图 该内核的结构图代表了内核的功能结构,与 Linux 基本相同,不同的只是 对 内存管理和进程管理进行了改写,以满足无 MMU 处理器的要求。 2.1.1
9、内核源文件组织的介绍 将 uClinux 内核源文件解压以后就形成了源 文件的根目录,以 手头上的平台 为例,产生uClinux-Samsung 根目录。 uClinux-Samsung 根目录下有以下几个子目录和文件,下面分别介绍 : /bin 存放用户最常用的基本程序 /config 存放 uClinux 配置文件 /Documentation 存放 uClinux 的 HOWTO 文档和 FAQ 文档 /freeswan 用于 Ipsec 方面的应用程序 /images 用于存放编译后生成的文件 /lib 存放各类库 /linux-2.0.x 存放 linux-2.0 版本的内核源文件
10、/linux-2.4.x 存放 linux-2.4 版本的内核源文件 /tools 存放工具说明文档和其他杂项 /uClibc 存放 uClinux 的库文件 /user 存放用户的各种应用程序 /vendors 存放有关各种处理器的文件 下面详细介绍内核源文件的结构,我们以内核 2.4.x 为例介绍如下 : 该版本的 uCLinux 核心源程序安装在 /uClinux - Samsung/linux - 2.4.x 目录下。 Linux 内核版本编号有约定 : 任何偶数的核心 (例如 2.0.30 都 是一个稳定 的 核心,而任何奇数的核心 (例如 2.1.42)都是一个开发中的核心 。 内
11、核源程序的文件按树形结构进行组织,在内核源程序树的最上层你会看到这样一些目录 : 1) Arch:: arch 子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如 ARM 就是关于 ARM CPU 体系结构的内核,ARMNOMMU 就是关于 ARM7TDMI 的内核。 2) Include:: include 子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/Linux 子目录下,与 ARM7TDMI CPU 相关的头文件在 include / asm-armnommu 子目录下。 3) Init: 这个目录包含核心的初始化代码
12、 (注 : 不是嵌入式系统的引导代码,而是内核的启动代码 ),包含两个文件 main. c 和 Version.c,这是研究初始化和内核如何工作的一个非常好的起点 。 4) Mm: 这个目录包括所有独立于 CPU体系结构的内存管理代码,如页式 存储管理内存的分配和释放等,而和体系 结构相关的内存管理代码则 于 arch/*/mm/。 5) Mmnimmu: 这个目录和 mm 目录相同,不同的就是该目录 是 为无 MMU 的处理器设计的。 6) Kernel: 主要的核心代码,此目录下的文件实现了大多数 uClinux 系统的内核函数,其中最重要的文件当属 sched. c,同样,和体系结构相关
13、的代码在 arch/*/kernel 中 。 7) Drivers: 放置系统所有的设备驱动程序,每种驱动程序又各占用一个子目录,如 /block下为块设备驱动程序,比如 ide(ide. c)。如果你希望查看所有 可能包含文件系统的设备是如何初始化的,你可以看 drivers/block/genhd. c 中的 device-setup()。它不仅初始化硬 盘 , 也初始化网络 .因为安装此文件系统的时候需要网络 。 8)其他 : 如 Lib 放置核心的库代码, Net 是核心与网络相关的代码, Ipc 这 目录包含核心的进程问通信的代码, Fs 为所有的文件系统代码和各种类型的文件操作代码
14、,它的每一个子目录支持一个文件系统,例如 fat 和 ext2, Scripts 目录包含用于配置核心的脚本文件等。一般在每个目录下都有一个 Makefile 文件,这两个文件都是编译时使用的辅助文件 .仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助,而且在有的目录下还有 Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核原码的理解。 2.1.2 uClinux内核源代码分析 uClinux 是 Linux 操作系统的一种,是由 Linux2.0 内核发展来的,是专为没有 MMU 的微处理器 (如 :ARM7TDMI,Coldfire 等 )设计的嵌入式 L
15、inux 操作系统。因此,在 uClinux 上实现多任务功能则是一个非常棘手的问题。然而, uClinux 上运行的大多数用户应用程序不要求多任务功能。另外,大多数内核的二进制代码和源代码都被重写,这进一步缩减了 uClinux内核的代码。 uClinux 的内核要比原 Linux 2.0 内核小的多,但保留了 Linux 操作系统的主要优点 : 稳定性,优异的网络能力以及优秀的文件系统支持。 uClinux 的主要特色 : 通用的 Linux API uClinux kernel512 KB uClinux kernel+工具 900 KB 完整的 TCP/IP 协议堆栈 支持大量 其它的
16、网络协议 支持各种文件系统,包括 NFS , Ext2 , Romfs , JFFS , MS-DOS 以及 FAT 16/32 ( 1) uCli nux的内存管理 uClinux 同标准 Linux 的最大区别就在于内存管理。标准 Linux 是针对有 MMU的处理器设计的。在这种处理器上,虚拟地址被送到 MMU , MMU 把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟 物理地址转换映射, 支持不同任务之间的保护。对于uCLinux 来说,其设计针对没有 MMU 的处理 器。 不能使用处理器的虚拟内存管理技术。 这一点影响了系统工作的很多方面。 也由于 uClinux 的内存管理引
17、发了一些标准 Linux 所不会出现的问题。下面将对 uClinux内存管理和 Linux 的内存管理部分进行比较。 Linux 使用的虚拟存储器技术 Linux 使用虚拟存储器技术,这种技术用于提供比计算机系统中实际使用的物理内存大得多的内存空间。使用者将感觉到好像程序可以使用非常大的内存空间,从而使得编程人员在写程序时不用考虑计算机中的物理内存的实际容 量。 为了支持虚拟存储管理器的管理, Linux 系统采用分页 (page)的方式来载入进程。所谓分页既是把实际的存储器分割为相同大小的内存片,例如每个内存片 1024 个字节,这样 1024个字节大小的内存片便称为一个页面 (page)。
18、 虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。它的实现基于局部性原理,当一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面或段装入内存运行 (Copy-On-Write ),其余暂时留在硬盘上程序运行时如果它所要访问的页已存在,则程序继续运行,如果发现不存在的页 (段 ),操 作系统将产生一个页错误(Page Fault),这个错误导致操作系统把需要运行的部分加载到内存中。必要时操作系统还可以把不需要的内存页 (段 )交换到磁盘上。利用这样的方式管理存储器,便可把一个进程所需要用到的存储器以化整为零的方式,视需求分批载入,而核心程序则凭借属于每个页面
19、的页码来完成寻址各个存储器区段的工作。 Linux 是针对有内存管理单元的处理器设计的。在这种处理器上,虚拟地址被送到内存管理单元 (MMU ),把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟一物理地址转换映射,支持不同任务之间的保护。 地址转换函数在每一个任务中定义,在一个任务中的虚拟地址空间映射到物理内存的一个部分,而另一个任务的虚拟地址空间映射到物理存储器中的另外区域。计算机的存储管理单元 (MMU)一般有一组寄存器来标识当前运行的进程的转换表。在当前进程切换到另一个进程时 (一次任务切换 ),内核通过指向新进程地址转换表的指针加载这些寄存器。 MMU寄存器是有特权的,只能在内核态
20、才能访问。这就保证了一个进程只能访问自己用户空间内的地址,而不会访问和修改其它进程的空间。当可执行文件被加载时,加载器根据缺省的 1d 文件,把程序加载到虚拟内存的一个 空间,因为这个原因实际上很多程序的虚拟地址空间是相同的,但是由于转换函数不同,所以实际所处的内存区域也不同。而对于多进程管理当处理器进行进程切换并执行一个新任务时,一个重要部分就是为新任务切换任务转换表。我们可以看到 Linux 系统的内存管理至少实现了以下功 能 : 运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序 可以运行只加载了部分的程序,缩短了程序启动的时间 。 可以使多个程序同时驻留在内存中提高 CPU的
21、利用率 。 可以运行重定位程序。即程序可以方于内存中的任何一处,而且可以在执行过程中移动 。 写机器无关的代码。程序不必事先约定机器的配置情况。 减轻程序员分配和管理内存资源的负担。 可以进行共享一例如,如果两个进程运行同一个程序,它们应该可以共享程序代码的同一个副本。 提供内存保护,进程不能以非授权方式访问或修改页面,内核保护单个进程的数据和代码以防止其它进程修改它们。否则,用户程序可能会偶然 (或恶意 )的破坏内核或其它用户程序。 虚存系统并不是没有代价的。内存管理需要地址转换表和其他一些数据结构,留给程序的内存减少了。地址转换增加了每一条指令的执行时间,而对于有 额外内存操作的指令会更严
22、重。当进程访问不在内存的页面时,系统发生失效。系统处理该失效,并将页面加载到内存中,这需要极耗时间的磁盘 I/O 操作。总之内存管理活动占用了一部分 CPU时间 (在较忙的系统中大约占 10%)。 uClinux 针对 NOMMU的特殊处理 对于 uClinux 来说,其设计针对没有 MMU的处理器,即 uClinux 不能使用处理器的虚拟内存管理技术 (应该说这种不带有 MMU 的处理器在嵌入式设备中相当普遍 )。 uClinux 仍然采用存储器的分页管理,系统在启动 时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有 MMU 管理,所以实际上 uClinux 采用实存储器管
23、理策略 (real memory management)。这一点影响了系统工作的很多方面。 uClinux 系统对于内存的访问是直接的, (它对地址的访问不需要经过 MMU,而是直接送到地址线上输出 ),所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护 (这实际上是很多嵌入式系统的特点 ),各个进程实际上共享一个运行空间 (没有独立的地址转换表 )。 一个进程在执行前,系统必须 为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。与之相对应的是标准 Linux 系统在分配内存时没有必要保证实际物理存储空间是连续的,而只要保证虚存地址空间连续就可以了。另外一个方面程
24、序加载地址与预期 (1d文件中指出的 )通常都不相同,这样 Relocation 过程就是必须的。此外磁盘交换空间也是无法使用的,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。 uClinux 在对内存 管理减少 的 同时 也 给开发人员提出了更高的要求。如果从易用性这一点来说, uClinux 的内存管理是一 种倒退 ,退回了到了 UNIX 早期或是 Dos 系统时代。开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少的内存 (假如你欺骗了系统,那将在后面运行程序时受到惩罚 ),从而系统将在启动的初始化阶段对内存进行分页,并且标 记己使用的和未
25、使用的内存。系统将在运行应用时使用这些分页内存。 由于应用程序加载时必须分配连续的地址空间,而针对不同硬件平台的可一次成块 (连续地址 )分配内存大小限制是不同 (目前针对 EZ328 处理器的 uClinux 是 128k,而针对 Coldfire处理器的系统内存则无此限制 ),所以开 发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常。 从内存的访问角度来看,开发人员的权利增大了 (开发
26、人员在编程时可以访问任意的地址空间 ),但与此同时系统的安全性也大为下降。此外,系统对多进程的管理将有很大的变化,这一点将在 uClinux 的多进程管理中说明。虽然 uClinux 的内存管理与 Linux 系统相比功能相差很多,但应该说这是嵌入式设备的选择。在嵌入式设备中,由于成本等敏感因素的影响,普偏的采用不带有 MMU 的处理器,这决定了系统没有足够的硬件支持实现虚拟存储管理技术。从嵌入式设备实现的功能来看,嵌入式设备通常在某一特定的环境下运行,只要实现特定的功能,其功能相对简单,内存管理的要求完全可以由开发人员考虑。 ( 2) uCL i nux的进程与线程分析 Linux 系统对进
27、程、线程的管理 进程 :进程是一个运行程序并为其提供执行环境的实体,它包括一个地址空间和至少一个控制点,进程在 这个地址空间上执行单一指令序列。进程地址空间包括可以访问或引用的内存单元的集合,进程控制点通过一个一般称为程序计数器 (Program Counter,PC)的硬件寄存器控制和跟踪进程指令序列。 Fork: 由于进程为执行程序的环境,因此在执行程序前必须先建立这个能“跑”程序的环境。 Linux 系统提供系统调用拷贝现行进程的内容,以产生新的进程,调用 fork 的进程称为父进程 ;而所产生的新进程则称为子进程。子进程会承袭父进程的一切特性,但是它有自己的数据段,也就是说,尽管子进程
28、改变了所属的变量,却不会影响到父进程的 变量值。父进程和子进程共享一个程序段,但是各自拥有自己的堆栈、数据段、用户空间以及进程控制块。换言之,两个进程执行的程序代码是一样的,但是各有各的程序计数器与自己的私人数据。 当内核收到 fork 请求时,它会先查核三件事 :首先检查存储器是不是足够 ;其次是进程表是否仍有空缺 ;最后则是看看用户是否建立了太多的子进程。如果上述说三个条件满足,那么操作系统会给子进程一个进程识别码,并且设定 CPU 时间,接着设定与父进程共享的段,同时将父进程的 mode拷贝一份给子进程运用,最终子进程会返回数值 0 以表示它是子进程,至于父进 程,它可能等待子进程的执行
29、结束,或与子进程各做个的。 ExeC 系统调用 : 该系统调用提供一个进程去执行另一个进程的能力, exec 系统调用是采用覆盖旧有进程存储器内容的方式,所以原来程序的堆栈、数据段与程序段都会被修改,只有用户区维持不变。 Vfork 系统调用 : 由于在使用 fork 时,内核会将父进程拷贝一份给子进程,但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用 fork 后就立即调用 exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。因此 Linux 系统提供一个系统调用 vfork vfork假定系 统在调用完成 vfork 后会马上执行 exec,因此 vfork 不拷贝父进程的页
30、面,只是初始化私有的数据结构与准备足够的分页表。这样实际在 vfork 调用完成后父子进程事实上共享同一块存储器 (在子进程调用 exec 或是 exit 之前 ),因此子进程可以更改父进程的数据及堆栈信息,因此 vfork 系统调用完成后,父进程进入睡眠,直到子进程执行 exec o 当子进程执行exec 时,由于 exec 要使用被执行程序的数据,代码覆盖子进程的存储区域,这样将产生写保护错误 (do_ wp-page)(这个时候子进程写的实际巨是父进程的存储区 域 ),这个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。 uClinux
31、 的多进程处理 uClinux 没有 MMU管理存储器,在实现多个进程时 (fork 调用生成子进程 )需要实现数据保护。 uClinux 的 fork 和 vfork: uClinux 的 fork 等于 vfork。实际上 uClinux 的多进程管理通过vfork 来实现。这意味着 uClinux 系统 fork 调用完成后,要么子进程代替父进程执行 (此时父进程已经 sleep)直到子进程 调用 exit 退出,要么调用 exec 执行一个新的进程,这个时候将产生可执行文件的加载,即使这个进程只是父进程的拷贝,这个过程也不能避免。当子进程执行 exit 或 exec 后,子进程使用 w
32、akeup 把父进程唤醒,父进程继续往下执行。 uClinux 的这种多进程实现机制同它的内存管理紧密相关。 uClinux 针对 NOMMU 处理器开发,所以被迫使用一种 flat 方式的内存管理模式,启动新的应用程序时系统必须为应用程序分配存储空间,并立即把应用程序加载到内存。缺少了 MMU的内存重映射机制, uClinux必须在可执行文件加载阶 段对可执行文件 Relocation 处理,使得程序执行时能够直接使用物理内存。 ( 3) uC I i nux针对实时性的解决方案 uClinux 本身并没有关注实时问题,它并不是为了 Linux 的实时性而提出的。另外有一种 Linux: R
33、T-Linux 关注实时问题。 RT-Linux 执行管理器把普通 Linux 的内核当成一个任务运行,同时还管理了实时进程。而非实时进程则交给普通 Linux 内核处理。这种方法己经应用于很多的操作系统用于增强操作系统的实时性,包括一些商用版 UNIX 系统, Windows NT等等。这种方法 优点之一是实现简单,且实时性能容易检验。优点之二是由于非实时进程运行于标准 Linux 系统,同其它 Linux 商用版本之间保持了很大的兼容性。优点之三是可以支持硬实时时钟的应用。 uClinux 可以使用 RT-Linux 的 patch,从而增强 uClinux 的实时性,使得 uClinux
34、 可以应用于工业控制、进程控制等一些实时要求较高的应用。 2. 2 启动过程 引导程序在嵌入式 uClinux 中代码量较小,但是作用较大。这里所述的引导程序包括两个方面的内容 : 引导内核的 Bootloader 和内核自身的引导程序部分。 Bootloader 是 CPU 开机后执行的第一个程序,它的任务就是将内核 (压缩或是非压缩 )装载到内核要求的地址。内核引导程序部分就比较难定义了 , 分狭义和广义。狭义上指内核运行前的一段代码,例如压缩的内核被装载到内存中, Bootloader 将程序的让出控制权,在压缩内核前有一段解压缩程序,负责将内核解压缩到某个地址,从解压缩到将控制权交给内
35、核,这一段代码称为内核的引导部分。广义定义还要包括内核初始化部分,即直到有进程产生才算引导程序结束。 2.2.1 Linux启动过程 计算机加电后 CUP 首先读取代码段寄存器和指令计 数器的组合值 FFFF0 作为指令的起始地址。而 FFFF0 处有一个跳转指令,一般跳到系统 BIOS 的入口地址。也就是说,系统实际上首先执行 BIOS 程序实现系统自检,自检包括检查内存、硬盘、光驱和键盘等。然后BIOS 根据启动设备 (IDE 硬盘、软盘、 CDROM 或则 SCSI 硬盘 )读取引导区,将其存入内存。 硬盘的引导扇区就是主引导记录 (MBR),长度为 512 字节,包括 446 字节的预
36、引导区和 66字节的逻辑分区表。预引导区包含了活动分区信息,因此根据 MBR 可确定要引导哪个逻辑分区。实际上, Linux 一般在硬盘的 MBR 上装 载了 LILO,利用 LILO 就可决定引导哪个逻辑分区。 BIOS 进行一些系统硬件测试,这个步骤通常称为 POST(上电自检 )。这个阶段会显示一些信息,例如 BIOS 的版本号。然后初始化硬件设备。这个步骤对外设的 IRQ 和 I/O 端口进行检测,保证没有冲突。接着搜索一个操作系统来启动。根据 BIOS 的设置,这个过程可能要试图访问系统中的软盘,硬盘和光驱的一个扇区。最后加载第一扇区,将控制权交给该加载的程序。 如果 Linux 装有 LILO 之类的启动程序,则 LILO 取得控制权以后,根据配置将启动分区的 boot 区代码装到内 存中。如果没有装 LILO,则由内核程序中的 bootsect. S 负责装载内核。装载完了以后,控制权就交给内核了。
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。