嵌入式linux启动打印分析,嵌入式Linux启动作业流程分析.doc

嵌入式Linux开启步骤分析(转)

linux 嵌入式 脚本 action login 终端

当Bootloader将控制权交给内核引导程序时,第一个实施程序就是head.S,它完成了加载内核大部分工作;misc.c则提供加载内核所需要子程序,其中解压内核子程序是head.S调用关键程序,另外内核加载还须知道系统硬件信息,该硬件信息在hardware.h中定义并被head.S所引用。本系统中内核开启步骤图1所表示。

本系统中,head.S首先配置S3C4510B系统寄存器SYSCFG、初始化系统Flash、SDRAM和总线控制寄存器,将Flash和SDRAM地址范围分别设置为0x0-0x1fffff和0x1000000-0x1ffffff;依据本系统功效特点,重新定义了中止优先级和I/O口配置;为了提升内核运行速度,将2M内核映像文件从Flash拷贝到SDRAM;经过操作部分系统寄存器,进行系统存放器重映射,将Flash和SDRAM地址区间分别重映射为0x1000000-0x11fffff和0x0-0xffffff;然后初始化系统堆栈;接着调用misc.c中函数decompress_kernel,对拷贝到SDRAM内核映像文件进行解压缩;最终跳转到实施调用内核函数call_kernel,调用call_kernel函数实际上是实施main.c中start_kernel函数,该函数完成功效包含处理器结构初始化、中止初始化、定时器初始化、进程相关初始化和内存初始化等初始化工作;最终内核创建一个init线程,在该线程中调用init进程,完成系统开启

?当用户打开PC电源,BIOS开机自检,按BIOS中设置开启设备(通常是硬盘)开启,接着开启设备上安装引导程序lilo或grub开始引导Linux,Linux首优异行内核引导,接下来实施init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务任务后,返回init;init开启了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这么就完成了从开机到登录整个开启过程。

-->power on-->BIOS-->Lilo/Grub-->Kernerl boot-->init(rc.sysinit, rc)?-->mingetty(login)-->Shell---->

下面就将逐一介绍其中多个关键部分:

第一部分:内核引导(核内引导)

Red Hat9.0能够使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU控制权,然后CPU就开始实施Linux关键映象代码,开始了Linux开启过程。这里使用了多个汇编程序来引导Linux,这一步泛及到Linux源代码树中“arch/i386/boot”下这多个文件:bootsect.S、setup.S、video.S等。

其中bootsect.S是生成引导扇区汇编源码,它完成加载动作后直接跳转到setup.S程序入口。setup.S关键功效就是将系统参数(包含内存、磁盘等,由BIOS返回)拷贝到尤其内存中,方便以后这些参数被保护模式下代码来读取。另外,setup.S还将video.S中代码包含进来,检测和设置显示器和显示模式。最终,setup.S将系统转换到保护模式,并跳转到 0x100000。

那么0x100000这个内存地址中存放是什么代码?而这些代码又是从何而来呢?

0x100000这个内存地址存放是解压后内核,因为Red Hat提供内核包含了众多驱动和功效而显得比较大,所以在内核编译中使用了“makebzImage”方法,从而生成压缩过内核,在RedHat中内核常常被命名为vmlinuz,在Linux最初引导过程中,是经过"arch/i386/boot/compressed/"中head.S利用misc.c中定义decompress_kernel()函数,将内核vmlinuz解压到0x100000。

当CPU跳到0x100000时,将实施"arch/i386/kernel/head.S"中startup_32,它也是vmlinux入口,然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中定义函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身设置。start_kernel()函数中,做了大量工作来建立基础Linux关键环境。假如顺利实施完start_kernel(),则基础Linux关键环境已经建立起来了。

在start_kernel()最终,经过调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值