ARM+Linux启动过程分析

ARM+Linux启动过程分析
ARM+Linux启动过程分析

ARM Linux启动过程分析

摘要:嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不

同体系结构的处理器来说Linux的启动过程也有所不同。本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。

关键词:ARM Linux bootloader 启动过程

中图分类号:TP316

1. 引言

Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。虽然Linux 在桌面PC 机上的普及程度远不及微

软的Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来Linux 在嵌入式领域的迅猛发展,更是给Linux 注入了新的活力。

一个嵌入式Linux 系统从软件角度看可以分为四个部分[1]

:引导加载程序(bootloader),

Linux 内核,文件系统,应用程序。

其中bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及

外设,然后调用Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统做

为根文件系统(Root Filesystem)。根文件系统是Linux 系统的核心组成部分,它可以做为

Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统

所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用

意义。

从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux 内核。在嵌入式系统开发的过程中,很大一部分精力都是花在bootloader 和Linux 内核的开发或移植上。如果能清楚的了解bootloader 执行流程和Linux

的启动过程,将有助于明确开发过程中所需的工作,从而加速嵌入式系统的开发过程。而这正是本文的所要研究的内容。

2. Bootloader

2.1 Bootloader的概念和作用

Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用

类似于PC 机上的BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC 等)中的Linux 内核拷贝到RAM 中去,然后跳转到内核的第一条指令处继

续执行,从而启动Linux 内核。

由此可见,bootloader 和Linux 内核有着密不可分的联系,要想清楚的了解Linux内核的启动过程,我们必须先得认识bootloader的执行过程,这样才能对嵌入式系统的整个启动

过程有清晰的掌握。

2.2 Bootloader的执行过程

不同的处理器上电或复位后执行的第一条指令地址并不相同,对于ARM 处理器来说,

该地址为0x00000000。对于一般的嵌入式系统,通常把Flash 等非易失性存储器映射到这个

地址处,而bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序

便是bootloader。而因为存储bootloader的存储器不同,bootloader的执行过程也并不相同,

下面将具体分析。

嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Flash 又分为Nor Flash 和Nand Flash 两种。它们之间的不同在于:Nor Flash 支持芯片内执行(XIP,eXecute In Place),

这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以要想执行Nand Flash 上的代码,必须先将其拷贝到RAM中去,然后跳到RAM 中去执

行。

实际应用中的bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化

系统和调用Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置Linux 启

动参数,给Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动

Linux 内核的目的,所有的bootloader都必须具备以下功能[2]

1) 初始化RAM

因为Linux 内核一般都会在RAM 中运行,所以在调用Linux 内核之前bootloader 必须设置和初始化RAM,为调用Linux内核做好准备。初始化RAM 的任务包括设置CPU 的控

制寄存器参数,以便能正常使用RAM 以及检测RAM 大小等。

2) 初始化串口

串口在Linux 的启动过程中有着非常重要的作用,它是Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解Linux 的启动过

程。

虽然它并不是bootloader 必须要完成的工作,但是通过串口输出信息是调试bootloader 和

Linux 内核的强有力的工具,所以一般的bootloader 都会在执行过程中初始化一个串口做为

调试端口。

3) 检测处理器类型

Bootloader在调用Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中

提供给Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。

4) 设置Linux启动参数

Bootloader在执行过程中必须设置和初始化Linux 的内核启动参数。目前传递启动参数

主要采用两种方式:即通过struct param_struct 和struct tag(标记列表,tagged list)两种结

构传递。struct param_struct 是一种比较老的参数传递方式,在 2.4 版本以前的内核中使用较

多。从2.4 版本以后Linux 内核基本上采用标记列表的方式。但为了保持和以前版本的兼容

性,它仍支持struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标

记列表方式。

标记列表方式是种比较新的参数传递方式,它必须以ATAG_CORE 开始,并以

ATAG_NONE 结尾。中间可以根据需要加入其他列表。Linux内核在启动过程中会根据该启动参数进行相应的初始化工作。

5) 调用Linux内核映像

Bootloader完成的最后一项工作便是调用Linux内核。如果Linux 内核存放在Flash 中,

并且可直接在上面运行(这里的Flash 指Nor Flash),那么可直接跳转到内核中去执行。但由于在Flash 中执行代码会有种种限制,而且速度也远不及RAM 快,所以一般的嵌

入式系统都是将Linux内核拷贝到RAM 中,然后跳转到RAM 中去执行。

不论哪种情况,在跳到Linux 内核执行之前CUP的寄存器必须满足以下条件:r0=0,

r1=处理器类型,r2=标记列表在RAM中的地址。

3. Linux内核的启动过程

在bootloader将Linux 内核映像拷贝到RAM 以后,可以通过下例代码启动Linux 内核:call_linux(0, machine_type, kernel_params_base)。

其中,machine_tpye 是bootloader检测出来的处理器类型,kernel_params_base 是启动参

数在RAM 的地址。通过这种方式将Linux 启动需要的参数从bootloader传递到内核。Linux 内核有两种映像:一种是非压缩内核,叫Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。zImage 是Image

经过压缩形成的,所以它的大小比Image 小。但为了能使用zImage,必须在它的开头加上

解压缩的代码,将zImage 解压缩之后才能执行,因此它的执行速度比Image 要慢。但考虑

到嵌入式系统的存储空容量一般比较小,采用zImage 可以占用较少的存储空间,因此牺牲

一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

对于ARM 系列处理器来说,zImage 的入口程序即为arch/arm/boot/compressed/head.S。

它依次完成以下工作:开启MMU 和Cache,调用decompress_kernel()解压内核,最后通过

调用call_kernel()进入非压缩内核Image 的启动。下面将具体分析在此之后Linux 内核的启

动过程。

3.1 Linux内核入口

Linux 非压缩内核的入口位于文件/arch/arm/kernel/head-armv.S 中的stext 段。该段的基地址就是压缩内核解压后的跳转地址。如果系统中加载的内核是非压缩的Image,那么bootloader将内核从Flash中拷贝到RAM 后将直接跳到该地址处,从而启动Linux 内核。不同体系结构的Linux 系统的入口文件是不同的,而且因为该文件与具体体系结构有

关,所以一般均用汇编语言编写[3]

。对基于ARM 处理的Linux 系统来说,该文件就是

head-armv.S。该程序通过查找处理器内核类型和处理器类型调用相应的初始化函数,再建立页表,最后跳转到start_kernel()函数开始内核的初始化工作。

检测处理器内核类型是在汇编子函数__lookup_processor_type中完成的。通过以下代码

可实现对它的调用:

bl __lookup_processor_type。

__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中。其中

r8 保存了页表的标志位,r9 保存了处理器的ID 号,r10 保存了与处理器相关的stru proc_info_list 结构地址。

检测处理器类型是在汇编子函数__lookup_architecture_type 中完成的。与

__lookup_processor_type类似,它通过代码:“bl __lookup_processor_type”来实现对它的调

用。该函数返回时,会将返回结构保存在r5、r6 和r7 三个寄存器中。其中r5 保存了RAM 的起始基地址,r6 保存了I/O基地址,r7 保存了I/O的页表偏移地址。

当检测处理器内核和处理器类型结束后,将调用__create_page_tables 子函数来建立页表,它所要做的工作就是将RAM 基地址开始的4M 空间的物理地址映射到0xC0000000 开

始的虚拟地址处。对笔者的S3C2410 开发板而言,RAM 连接到物理地址0x30000000 处,当调用__create_page_tables 结束后0x30000000 ~0x30400000 物理地址将映射到

0xC0000000~0xC0400000 虚拟地址处。

当所有的初始化结束之后,使用如下代码来跳到C 程序的入口函数start_kernel()处,开始之后的内核初始化工作:

b SYMBOL_NAME(start_kernel)

3.2 start_kernel函数

start_kernel是所有Linux 平台进入系统内核初始化后的入口函数,它主要完成剩余的与

硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个Linux 内核便启动完毕。该函数所做的具体工作

有[4][5]

1) 调用setup_arch()函数进行与体系结构相关的第一个初始化工作;

对不同的体系结构来说该函数有不同的定义。对于ARM 平台而言,该函数定义在

arch/arm/kernel/Setup.c。它首先通过检测出来的处理器类型进行处理器内核的初始化,然后

通过bootmem_init()函数根据系统定义的meminfo 结构进行内存结构的初始化,最后调用

paging_init()开启MMU,创建内核页表,映射所有的物理内存和IO空间。

2) 创建异常向量表和初始化中断处理函数;

3) 初始化系统核心进程调度器和时钟中断处理机制;

4) 初始化串口控制台(serial-console);

ARM-Linux 在初始化过程中一般都会初始化一个串口做为内核的控制台,这样内核在

启动过程中就可以通过串口输出信息以便开发者或用户了解系统的启动进程。

5) 创建和初始化系统cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。

6) 初始化内存管理,检测内存大小及被内核占用的内存情况;

7) 初始化系统的进程间通信机制(IPC);

当以上所有的初始化工作结束后,start_kernel()函数会调用rest_init()函数来进行最后的

初始化,包括创建系统的第一个进程-init 进程来结束内核的启动。Init 进程首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。最后init 进程会执行用

户传递过来的“init=”启动参数执行用户指定的命令,或者执行以下几个进程之一:execve("/sbin/init",argv_init,envp_init);

execve("/etc/init",argv_init,envp_init);

execve("/bin/init",argv_init,envp_init);

execve("/bin/sh",argv_init,envp_init)。

当所有的初始化工作结束后,cpu_idle()函数会被调用来使系统处于闲置(idle)状态并

等待用户程序的执行。至此,整个Linux 内核启动完毕。

4. 结论

Linux 内核是一个非常庞大的工程,经过十多年的发展,它已从从最初的几百KB 大小

发展到现在的几百兆。清晰的了解它执行的每一个过程是件非常困难的事。但是在嵌入式开发过程中,我们并不需要十分清楚linux 的内部工作机制,只要适当修改linux 内核中那些

与硬件相关的部分,就可以将linux 移植到其它目标平台上。通过对linux 的启动过程的分

析,我们可以看出哪些是和硬件相关的,哪些是linux 内核内部已实现的功能,这样在移植

linux 的过程中便有所针对。而linux内核的分层设计将使linux 的移植变得更加容易。

参考文献

[1] 詹荣开.嵌入式系统bootloader技术内幕[EB/OL]. https://www.360docs.net/doc/b710795335.html,/developerworks/cn/linux/l-btloader

/index.html,2003.12.

[2] Russell King.Booting ARM Linux[Z].Linux Documentation.May 2002

[3] 刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京航空航天大学出版社.2006.6

[4] William Gatliff.The Linux 2.4 Kernel’s Startup Procedure[DB/CD].2002 Embedded System Conference San

Francisco,March..2002

[5] Claudia Salzberg Rodriguez,Gordon Fischer,Steven Smolski.Linux内核编程[M].陈莉君,贺炎,刘霞林.机

械工业出版社.2006.7

ARM Linux Start-up Procedure Analysis

Yao Chengqiang Sun Wensheng

School of Telecommunication Engineering of Beijing University of Posts and Telecommunications

Abstract

We can see embedded Linux in kinds of electronic products because of its portability. Linux’s

start-up procedure for different processors is also different. This paper provides the analysis of

bootloader execution process and Linux kernel start-up procedure - taking the S3C2410 ARM

processor as example.

Keywords: ARM Linux bootloader start-up procedure

详解bootloader的执行流程与ARM Linux启动过程分析

详解bootloader的执行流程与ARM Linux启动过程分析 ARM Linux启动过程分析是本文要介绍的内容,嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。 1、引言 Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。虽然Linux 在桌面PC 机上的普及程度远不及微软的Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来Linux 在嵌入式领域的迅猛发展,更是给Linux 注入了新的活力。 一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。 Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。 根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。 应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本

linux启动过程

Linux系统启动过程分析 by 王斌斌 binbinwang118@https://www.360docs.net/doc/b710795335.html, Linux系统启动过程分析 操作系统的启动过程,实际上是控制权移交的过程。Linux 系统启动包含四个主要的阶段:BIOS initialization, boot loader, kernel initialization, and init startup.见下图: 阶段一、BIOS initialization,主要功能如下: 1.Peripherals detected 2.Boot device selected 3.First sector of boot device read and executed 系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。 执行POST代码对系统外围关键设备检测通过后,系统启动自举程序,根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。 注:在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否准备好,以供操作系 “” 统使用。 阶段二、Boot Loader 关于Boot Loader,简单的说就是启动操作系统的程序,如grub,lilo,也可以将boot loader本身看成一个小系统。 The BIOS invokes the boot loader in one of two ways: 1.It pass control to an initial program loader (IPL) installed within a driver's Master Boot Record (MBR) 2.It passes control to another boot loader, which passes control to an IPL installed within a partition's boot sector. In either case, the IPL must exist within a very small space, no larger than 446 bytes. Therefore, the IPL for GRUB is merely a first stage, whose sole task is to locate and load a second stage boot loader, which does most of the work to boot the system. There are two possible ways to configure boot loaders: Primary boot loader: Install the first stage of your Linux boot loader into the MBR. The boot loader must be configure to pass control to any other desired operating systems. Secondary boot loader: Install the first stage of your Linux boot loader into the boot sector of some partition. Another boot loader must be installed into the MBR, and configured to pass control to your Linux boot loader. 假设Boot Loader 为grub (grub-0.97),其引导系统的过程如下: grub 分为stage1 (stage1_5) stage2两个阶段。stage1 可以看成是initial program loaderI(IPL),而stage2则实现了grub 的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root )等。

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

linux grub 引导启动过程详解

linux grub 引导启动过程详解 2008-01-08 17:18 这几天看了很多文档,算是对linux的启动过程有了比较细致的了解. 网上有很多文章谈到这方面的内容,但总觉得没有一篇完全的解析linux启动的 细节,下面是我小弟在学习的过程中总结出来的一些东东.这个是完整的linux启动过程, 不涉及内核,但是我觉得比较详细哦. (由于本人比较懒,这一段是从网上抄的) 机器加电启动后,BIOS开始检测系统参数,如内存的大小,日期和时间,磁盘 设备以及这些磁盘设备用来引导的顺序,通常情况下,BIOS都是被配置成首先检查 软驱或者光驱(或两者都检查),然后再尝试从硬盘引导。如果在这些可移动的设 备中,没有找到可引导的介质,那么BIOS通常是转向第一块硬盘最初的几个扇区, 寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader. linux里面的boot loader通常是lilo或者grub,从Red Hat Linux 7.2起,GRUB( GRand Unified Bootloader)取代LILO成为了默认的启动装载程序。那么启动的时候grub是如何被载入的呢 grub有几个重要的文件,stage1,stage2,有的时候需要stage1.5.这些文件一般都 在/boot/grub文件夹下面.grub被载入通常包括以下几个步骤: 1. 装载基本的引导装载程序(stage1),stage1很小,网上说是512字节,但是在我的系统上用du -b /boot/grub/stage1 显示的是1024个字节,不知道是不是grub版本不同的缘故还是我理解有误.stage1通常位于主引导扇区里面,对于硬盘就是MBR了,stage1的主要功能就是装载第二引导程序(stage2).这主要是归结于在主引导扇区中没有足够的空间用于其他东西了,我用的是grub 0.93,stage2文件的大小是107520 bit. 2. 装载第二引导装载程序(stage2),这第二引导装载程序实际上是引出更高级的功能, 以允许用户装载入一个特定的操作系统。在GRUB中,这步是让用户显示一个菜单或是输入命令。由于stage2很大,所以它一般位于文件系统之中(通常是boot所在的根 分区). 上面还提到了stage1.5这个文件,它的作用是什么呢你到/boot/grub目录下看看, fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系统 有关系.有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这 时候就需要stage1.5来连接stage1和stage2了.因此对于不同的文件系统就会有不同的stage1.5.但是对于grub 0.93好像stage1.5并不是很重要,因为我试过了,在没有stage1.5 的情况下, 我把stage1安装在软盘的引导扇区内,然后把stage2放在格式化成ext2或者fat格式的软盘内,启动的时候照常引导,并不需要e2fs_stage_1.5或者fat_stage_1.5. 下面是我的试验: #mkfs.ext2 /dev/fd0 #mount -t ext2 /dev/fd0 /mnt/floppy #cd /mnt/floppy #mkdir boot #cd boot #mkdir grub (以上三步可用mkdir -p boot/grub命令完成) #cd grub #cp /boot/grub/{stage1,stage2,grub.conf} ./ #cd; umount /mnt/floppy

Linux启动过程详解

深入浅出:Linux的启动流程刨析 Linux的启动过程,是一个Linuxer必须要熟练掌握的。通过系统的启动过程,可以更深入的理解Linux,假如Linux系统出问题的话,可以通过启动过程来分析原因,解决问题。而且,在掌握了Linux的启动流程后,还可以借助宿主机来打造自己的Linux。 下面是我画的一张简单的Linux启动流程图 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1、/sbin/init 2、/etc/inittab 3、/etc/rc.d/rc.sysinit 4、/etc/rc.d/rcN.d //这是几个文件夹N代表数字1,2,3,4.. 5、/etc/fstab 1、关于/sbin/init与/etc/inittab 关于/sbin/init ,它是一个二进制可执行文件,为系统的初始化程序,而/etc/inittab是它的配置文件,我们可以通过/etc/inittab来一睹它的功能,里面的内容是一种固定的文本格式,id:runlevels:action:process 我们来通过它的内容来学习它之前,先了解写运行级别的分类(0-6): 0:关机half

1:单用户模式singel user 2:多用户模式multi user ,不提供nfs服务without nfs 3:完全多用户字符模式full multiuser text mod 4:系统预留officially undefined 5:图形登录界面graphical login 6:重启reboot id:3:initdefault: //这里定义linux的启动时的运行级别,可以看到我的主机的启动级别是3 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit //紧接着,运行系统第一个脚本/etc/rc.d/rc/sysinit //它的action:sysyinit指的是定义系统初始化过程 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 //然后就是加载服务了,他们被定义在/etc/rc.d/rcN.d l3:3:wait:/etc/rc.d/rc 3 //action:waite 这个进程在在对应级别启动一次,知道它结束为止,我的系统启动级别为3,所有执行rc 3对应的服务 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ca::ctrlaltdel:/sbin/shutdown -t3 -r now //这里定义了一个组合快捷键,熟悉吧,没错就是重启,你可以把它注释掉不用 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"//这里定义了ups电源,powerfail 指的是如果突然断电,它对应的process命令是,提示用户系统电源失效,将要关机,提醒用户把数据都存储好 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"//这里的action,powerokwaite,指的是系统恢复供电,关机取消...

 1:2345:respawn:/sbin/mingetty tty1 //开启终端,在系统准备工作做好后,就会启动出6个终端,tty1~6 mingetyy就是终端的执行命令 2:2345:respawn:/sbin/mingetty tty2 //可以看到他们对应的级别是2345,你也可以注释

Linux启动全过程-由bootloader到fs

Linux启动过程 许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实Linux的启动过程并不象启动信息所显示的那样复杂,它主要分成两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动, 包括重要系统精灵程序和其它指定在启动时装入的软件。 下面以Red Hat为例简单介绍一下Linux的启动过程。 一、启动内核 首先介绍启动内核部分。电脑启动时,BIOS装载MBR,然后从当前活动分区启动,LILO获得引导过程的控制权后,会显示LILO提示符。此时如果用户不进行任何操作,LILO将在等待制定时间后自动引导默认的操作系统,而如果在此期间按下TAB键,则可以看到一个可引导的操作系统列表,选择相应的操作系统名称就能进入相应的操作系统。当用户选择启动LINUX操作系统时,LILO就会根据事先设置好的信息从ROOT文件系统所在的分区读取LINUX映象,然后装入内核映象并将控制权交给LINUX内核。LINUX内核获得控制权后,以如下步骤继续引导系统: 1. LINUX内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。 2. 如果系统中安装有可支持特殊文本模式的、且LINUX可识别的SVGA卡,LINUX会提示用户选择适当的文本显示模式。但如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式可通过LILO或RDEV工具程序设置。 3. 内核接下来检测其他的硬件设备,例如硬盘、软盘和网卡等,并对相应的设备驱动程序进行配置。这时,显示器上出现内核运行输出的一些硬件信息。 4. 接下来,内核装载ROOT文件系统。ROOT文件系统的位置可在编译内核时指定,也可通过LILO 或RDEV指定。文件系统的类型可自动检测。如果由于某些原因装载失败,则内核启动失败,最终会终止系统。 二、执行init程序 其次介绍init程序,利用init程序可以方便地定制启动其间装入哪些程序。init的任务是启动新进程和退出时重新启动其它进程。例如,在大多数Linux系统中,启动时最初装入六个虚拟的控制台进程,退出控制台窗口时,进程死亡,然后init启动新的虚拟登录控制台,因而总是提供六个虚拟登陆控控制台进程。控制init程序操作的规则存放在文件/etc/inittab中。Red Hat Linux缺省的inittab文件如下:# #inittab This file describes how the INIT process should set up the system in a certain #run-level. # # #Default runlevel.The runlevels used by RHS are: #0-halt(Do NOT set initdefault to this) #1-Single user mode #2-Multiuser,without NFS(the same as 3,if you do not have networking) #3-Full multiuser mode #4-unused #5-X11 #6-reboot(Do NOT set initdefault to this)

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

嵌入式linux系统地启动过程

一、分析嵌入式系统的启动过程 嵌入式系统的启动过程: 上电------->u-boot------->加载Linux内核------->挂载rootfs ---->执行应用程序 二、分析u-boot 1.什么是u-boot(是一个通用的bootloader) U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。 Universal ----------->通用的 Boot ----------------->启动,引导 Loader ----------------->加载 通用------->支持多种架构的CPU,除了支持ARM系列的处理器外,还能支持MIPS、x86、Power PC、NIOS等诸多常用系列的处理器 ------->支持多种厂家的开发板,如cortex-A8,cortex-A9,cortex-A53等不同厂 家的开发板 ------->支持多种嵌入式操作系统,U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持Net BSD, Vx Works, QNX, RTEMS, ARTOS, Lynx OS, android 嵌入式操作系统。 Boot -------->完成硬件的初始化,启动硬件平台。 Loader ------->当初始化硬件结束后,加载操作系统。 2.u-boot的作用 大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。 (1)Stage1:CPU(S5P6818-->Cortex-A53)的初始化,使用汇编语言编写。 如:初始化Cache、MMU、clock、中断、看门狗、DDR3、eMMC、... (2)Stage2:板级初始化,使用C语言编写。 如:uart、网卡、usb、LCD、.... (3)提供了一些工具,如进入uboot的命令行模式,使用u-boot命令 (4)加载操作系统 3.U-boot的工作模式 U-Boot的工作模式有启动加载模式和下载模式。

linux系统引导过程

linux系统引导过程简介 首先,主板的BIOS会读取硬盘的主引导记录(MBR),MBR中存放的是一段很小的程序,他的功能是从硬盘读取操作系统核心文件并运行,因为这个小程序太小了,因此通常这个小程序不具备直接引导系统内核的能力,他先去引导另一个稍微大一点的小程序,再由这个大一点的小程序去引导系统内核.在linux系统中这样的小程序有LILO和GRUB.在这个项目中,我决定用LILO来做系统引导程序.在软盘上启动linux系统的过程和在硬盘上启动的过程相似. Linux系统内核被引导程序装入内核并运行后,linux内核会检测系统中的各种硬件.并做好各种硬件的初始化工作,使他们在系统正式运行后能正常工作.之后内核做的最后一个工作是运行 /sbin下的init程序,init是英文单词initialization(初始化)的简称,init程序的工作是读取/etc/inittab 文件中描述的指令,对系统的各种软硬件环境做最初化设定.最后运行mingetty等待用户输入用户名登录系统.所有的工作就这么简单,虽然linux启动的时候有很多内容,看上去十分高深,但是都不过是对这个过程的扩充.明白了这个道理,你可以写一些脚本程序让他在系统启动的特定时间运行完成任务.事实上系统内核并不关心/sbin下的init是不是真的init,只要是放在/sbin下名叫init 的可执行程序他都可以执行. Red Hat Enterprise Linux在电脑的启动阶段,一共经历以下两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init.(系统初始化).装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动,包括重要系统精灵程序和其它指定在启动时装入的软件。 开机---BIOS自检---载入启动程序---加载内核---启动init服务---加载/etc/inittab---Run level---rc.sysinit---rc--- mingetty---rc.local 一.BIOS自检 当电脑开机的时候,电脑会进入BIOS,在PC机中引导LINUX是从BIOS中的地址0xFFFF0处开始的.BIOS的第一个步骤是加电自检,即所谓的POST(Power On Self Test),BIOS的第二个步骤是进行本地设备的枚举和初始化,侦测电脑周边配套设备是否工作正常,如cpu的类型,速度,缓存等;主板类型,内存的速度,容量,硬盘的大小,类型和工作模式,风扇速度等,主要是为了检查这些设备在开机的时候是否能通过检测,说明电脑可以正常的工作.BIOS由两部分组成:POST代码和运行时的服务.当POST完成之后,它被从内存中清理了出来,但是,BOIS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务 二.载入启动程序

ARMLinux启动过程分析_百度文库.

ARM Linux启动过程分析 一个嵌入式Linux 系统从软件角度看可以分为四个部分[1]:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。在嵌入式系统开发的过程中,很大一部分精力都是花在bootloader 和 Linux 内核的开发或移植上。如果能清楚的了解 bootloader 执行流程和 Linux的启动过程,将有助于明确开发过程中所需的工作,从而加速嵌入式系统的开发过程。而这正是本文的所要研究的内容。 2. Bootloader 2.1 Bootloader的概念和作用Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。由此可见,bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识bootloader的执行过程,这样才能对嵌入式系统的整个启过程有清晰的掌握。 2.2 Bootloader的执行过程不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而 bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 bootloader。而因为存储 bootloader的存储器不同,bootloader的执行过程也并不相同,下面将具体分析。嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为 Nor Flash 和Nand Flash 两种。它们之间的不同在于: Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。实际应用中的 bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给 Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能:BR> 1 初始化RAM 因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用

在linux下设置开机自动启动程序的方法

下面用自启动apache为例; 自启动脚本: /usr/local/apache2/bin; ./apachectl start 文件位于/etc/rc.d/init.d下,名为apached, 注意要可执行. #chmod +x /etc/rc.d/init.d/apached //设置文件的属性为可执行 #ln -s /etc/rc.d/init.d/apached /etc/rc3.d/S90apache //建立软连接,快捷方式 #ln -s /etc/rc.d/init.d/apached /etc/rc0.d/K20apache 在Red Hat Linux中自动运行程序 1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或/etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序。例如:编辑/etc/rc.d/rc.local 文件,在文件最末加上一行"xinit"或"startx",可以在开机启动后直接进入X-Window。 2.登录时自动运行程序 用户登录时,bash首先自动执行系统管理员建立的全局登录script :/etc/profile。然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、/.profile,但只执行最先找到的一个。 因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。 3.退出登录时自动运行程序 退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。例如,在/.bash_logout 中加入命令"tar -cvzf c.source.tgz *.c",则在每次退出登录时自动执行 "tar" 命令备份*.c 文件。 4.定期自动运行程序 Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab 命令来建立、修改、删除这些命令文件。 例如,建立文件crondFile,内容为"00 9 23 Jan * HappyBirthday",运行"crontab cronFile"命令后,每当元月23日上午9:00系统自动执行"HappyBirthday"的程序("*"表示不管当天是星期几)。 5.定时自动运行程序一次 定时执行命令at 与crond 类似(但它只执行一次):命令在给定的时间执行,但不自动重复。at命令的一般格式为:at [ -f file ] time ,在指定的时间执行file文件中所给出的所有命令。也可直接从键盘输入命令: $ at 12:00 at>mailto Roger -s ″Have a lunch″ < plan.txt

Linux 启动过程详解

Linux 启动过程详解 下面来详细了解一下Linux 的启动过程。Linux 的启动 过程包含了Linux 工作原理的精髓, 而且在嵌入式的开发过程也非常需要这方面知识的积累。 用户开机启动Linux 过程总体上是这样的: 首先当用户打开PC 的电源时,CPU 将自动进入实模式,并从地址0xFFFF0 开始自 动执行程序代码,这个地址通常是ROM-BIOS 中的地址。这时BIOS 进行开机自检,并 按BIOS 中设置的启动设备(通常是硬盘)进行启动,接着启动设备上安装的引导程序 lilo 或grub 开始引导Linux(也就是启动设备的第一个扇区) ,这时,Linux 才获得了启 动权。 接下来的第二阶段,Linux 首先进行内核的引导,主要完成磁盘引导、读取机器系统数 据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。 第三阶段执行init 程序(也就是系统初始化工作) init 程序调用了rc.sysinit 和rc 等程序, 而rc.sysinit 和rc 在完成系统初始化和运行服务的任务后,返回init。 之后的第四阶段,init 启动mingetty,打开终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。 Linux 启动总体流程图如图所示, 其中的4 个阶段分别由同步棒隔开。由于第一阶段 不涉及Linux 自身的启动过程,因此,下面分别对第二和第三阶段进行详细讲解。 内核引导阶段 2.2.2 在grub 或lilo 等引导程序成功完成引导Linux 系统的任务后,Linux 就从它们手中接管 了CPU 的控制权。用户可以从https://www.360docs.net/doc/b710795335.html, 上下载最新版本的源码进行阅读,其目录为: linux-2.6.*.*archi386boot。在这过程中主要用到该目录下的这几个文件:bootsect.S、setup.S 以及compressed 目录下的head.S 等。 首先要介绍一下,Linux 的内核通常是压缩过后的,包括如上述提到的那几个重要的汇 编程序,它们都是在压缩内核vmlinuz 中的。因为Linux 中提供的内核包含了众多驱动和功能,因而比较大,所以在采用压缩内核可以节省大量的空间。

LINUX启动流程详解

2008-11-27 11:04:06 收藏 | 打印 | 投票(7) | 评论(1) | 阅读(30264) ◇字体:[大中小]linux系统引导过程简介 首先,主板的BIOS会读取硬盘的主引导记录(MBR),MBR中存放的是一段很小的程序,他的功能是从硬盘读取操作系统核心文件并运行,因为这个小程序太小了,因此通常这个小程序不具备直接引导系统内核的能力,他先去引导另一个稍微大一点的小程序,再由这个大一点的小程序去引导系统内核.在linux系统中这样的小程序有LILO和GRUB.在这个项目中,我决定用LILO来做系统引导程序.在软盘上启动linux系统的过程和在硬盘上启动的过程相似. Linux系统内核被引导程序装入内核并运行后,linux内核会检测系统中的各种硬件.并做好各种硬件的初始化工作,使他们在系统正式运行后能正常工作.之后内核做的最后一个工作是运行 /sbin下的init程序,init是英文单词initialization(初始化)的简称,init程序的工作是读取/etc/inittab文件中描述的指令,对系统的各种软硬件环境做最初化设定.最后运行mingetty等待用户输入用户名登录系统.所有的工作就这么简单,虽然linux启动的时候有很多内容,看上去十分高深,但是都不过是对这个过程的扩充.明白了这个道理,你可以写一些脚本程序让他在系统启动的特定时间运行完成任务.事实上系统内核并不关心/sbin下的init是不是真的init,只要是放 在/sbin下名叫init的可执行程序他都可以执行. Red Hat Enterprise Linux在电脑的启动阶段,一共经历以下两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init.(系统初始化).装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动,包括重要系统精灵程序和其它指定在启动时装入的软件。 开机---BIOS自检---载入启动程序---加载内核---启动init服务---加载/etc/inittab---Run level---rc.sysinit---rc--- mingetty---rc.local 一.BIOS自检 当电脑开机的时候,电脑会进入BIOS,在PC机中引导LINUX是从BIOS中的地址0xFFFF0处开始的.BIOS的第一个步骤是加电自检,即所谓的POST(Power On Self Test),BIOS的第二个步骤是进行本地设备的枚举和初始化,侦测电脑周边配套设备是否工作正常,如cpu的类型,速度,缓存等;主板类型,内存的速度,容量,硬盘的大小,类型和工作模式,风扇速度等,主要是为了检查这些设备在开机的时候是否能通过检测,说明电脑可以正常的工作.BIOS由两部分组成:POST代码和运行时的服务.当POST完成之后,它被从内存中清理了出来,但是,BOIS运行时服务依然保留在内存中,目标操作系统可以使用这些服务 二.载入启动程序 BIOS自检完成后,BIOS会根据用户设置的启动顺序来由哪个设备启动电脑的操作系统,设备需是处于活动状态并且可以引导的,(引导设备可以是软盘,CD-ROM,硬盘上的某个分区,网络上的某个设备,甚至是USB闪存),对于linux这个设备一般是硬盘.也就是进入硬盘的MBR区域,(master boot record,位于磁盘上的第一个扇区中,0道0柱面1扇区),这个区域中有512个字节的大小,其中前446个字节中保存的就是启动程 序,(446个字节包含可执行代码和错误消息文本,接下来的64个字节是分区表,其中4个分区的记录,每个记录的大小是16个字节,MBR以两个特殊数字的字节0xAA55结束,这个数字用来进行MBR的有效性检查,当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR),然后由这个小程序来加载存储在其他位置的操作系统,也就是启动grub程序.(grub不像lilo一样使用裸扇区,而是可以从ext2或ext3文件系统中加 载LINUX内核). 要看MBR的内容,请使用下面的命令 #从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中 [root@localhost ~]# dd if=/dev/sda of=mbr.bin bs=512 count=1 #以十六进制和ASCII码格式打印这个二进制文件的内容 [root@localhost pam.d]# od -xa mbr.bin grub程序的这个配置文件是保存在:/boot/grub/grub.conf这个文件中,如果修改这个文件后,设置会立刻生效.

Linux内核启动过程分析

1、Linux内核启动协议 阅读文档\linux-2.6.35\Documentation\x86\boot.txt 传统支持Image和zImage内核的启动装载内存布局(2.4以前的内核装载就是这样的布局): | | 0A0000 +------------------------+ | Reserved for BIOS | Do not use. Reserved for BIOS EBDA. 09A000 +------------------------+ | Command line | | Stack/heap | For use by the kernel real-mode code. 098000 +------------------------+ | Kernel setup | The kernel real-mode code. 090200 +------------------------+ | Kernel boot sector | The kernel legacy boot sector. 090000 +------------------------+ | Protected-mode kernel | The bulk of the kernel image. 010000 +------------------------+ | Boot loader | <- Boot sector entry point 0000:7C00 001000 +------------------------+ | Reserved for MBR/BIOS | 000800 +------------------------+ | Typically used by MBR | 000600 +------------------------+ | BIOS use only | 000000 +------------------------+ 当使用bzImage时,保护模式的内核会被重定位到0x1000000(高端内存),内核实模式的代码(boot sector,setup和stack/heap)会被编译成可重定位到0x100000与低端内存底端之间的任何地址处。不幸的是,在2.00和2.01版的引导协议中,0x90000+的内存区域仍然被使用在内核的内部。2.02版的引导协议解决了这个问题。boot loader应该使BIOS 的12h中断调用来检查低端内存中还有多少内存可用。 人们都希望“内存上限”,即boot loader触及的低端内存最高处的指针,尽可能地低,因为一些新的BIOS开始分配一些相当大的内存,所谓的扩展BIOS数据域,几乎快接近低端内存的最高处了。 不幸的是,如果BIOS 12h中断报告说内存的数量太小了,则boot loader除了报告一个错误给用户外,什么也不会做。因此,boot loader应该被设计成占用尽可能少的低端内存。对zImage和以前的bzImage,这要求数据能被写到x090000段,boot loader应该确保不会使用0x9A000指针以上的内存;很多BIOS在这个指针以上会终止。 对一个引导协议>=2.02的现代bzImage内核,其内存布局使用以下格式:| Protected-mode kernel | 100000 +------------------------+ | I/O memory hole | 0A0000 +------------------------+ | Reserved for BIOS | Leave as much as possible unused ~ ~

相关文档
最新文档