Bootloader:Uboot
内核 启动是在Uboot将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:
theKernel (0, machid, bd->bi_boot_params);
其中
machid 是
bootloader传递到kernel 的机器ID,用于标识单板类型
bd->bi_boot_params 是启动参数在起始地址。通过这种方式将
Linux 启动需要的参数从
bootloader传递到内核。
启动条件
通常从系统上电执行的boot loader的代码, 而要从boot loader跳转到linux kernel的第一条指令处执行需要一些特定的条件。
这里讨论下进入到linux kernel时必须具备的一些条件,这一般是boot loader在跳转到kernel之前要完成的:
-
CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断都是禁止的;
-
MMU(内存管理单元)必须是关闭的, 此时虚拟地址就是物理地址;
-
数据cache(Data cache)必须是关闭的
-
指令cache(Instruction cache)可以是打开的,也可以是关闭的,这个没有强制要求;
-
CPU 通用寄存器0 (r0)必须是 0;
-
CPU 通用寄存器1 (r1)必须是 ARM Linux machine type (关于machine type, 我们后面会有讲解)
-
CPU 通用寄存器2 (r2) 必须是 kernel parameter list 的物理地址(parameter list 是由boot loader传递给kernel,用来描述设备信息属性的列表)。
更详细的关于启动arm linux之前要做哪些准备工作可以参考,“Booting ARM Linux"文档
Linux Kernel的启动过程分两个部分:
1.架构/开发板相关的引导过程
2.后续通用的启动过程
补充说明:
若是从压缩文件中启动需要首先自解压。
Linux
内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫 zImage。根据内核映像的不同,Linux
内核的启动在开始阶段也有所不同。zImage 是 Image经过压缩形成的,所以它的大小比 Image 小。但为了能使用
zImage,必须在它的开头加上解压缩的代码,将 zImage 解压缩之后才能执行,因此它的执行速度比 Image
要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用 zImage
可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。
然后从自解压后的文件进入架构/开发板相关的引导过程。-----------------
这部分描述是正确的吗?
一 架构/开发板相关的引导过程概述
引导过程按以下几步进行
1.检查内核是否支持当前处理器架构--在arch/arm/kernel/head.s文件中的见调用了 __lookup_processor_type
2.检查是否支持当前的开发板machid--在arch/arm/kernel/head.s文件中的见调用了__lookup_machine_type
3.设置页表,使能MMU,为了连接内核时使用虚拟地址
4.调用C语言编写的start_kernel之前的常规性工作,包括复制数据段、清楚BSS段、调用start_kernel函数
二 后续通用的启动过程
1.输出kerne 版本信息==??通过谁来输出?还没初始化串口
2.设置和架构相关的环境,如系统时钟、串口等
3.初始化控制台
4.启动init进程
后面将分两篇文章来描述记录
一 架构/开发板相关的引导过程概述和
二 后续通用的启动过程这两部分。
链接如下
阅读(960) | 评论(0) | 转发(0) |