基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(1)

news/2024/7/10 5:34:42 标签: linux, image, linux内核, 嵌入式, path, 存储

基于ARM 的Linux 的启动分析报告
摘要:本文主要分析基于ARM 的Linux-2.2.26 内核启动过程。将首先从/
arch/arm/Makefile着手,介绍三种不同的启动方案,再剖析典型的压缩内核
zImage启动方案的代码结构,最后将详细分析这种方案的启动过程,直到调用
start_kernel()为止。
1、Linux 内核的启动方案:
由/arch/arm/Makefile的代码可以看出,主要有三种启动方案,分别是:
echo '* zImage - Compressed kernel image (arch/$
(ARCH)/boot/zImage)'
echo ' Image - Uncompressed kernel image (arch/$
(ARCH)/boot/Image)'
echo ' bootpImage - Combined zImage and initial RAM disk'
echo ' (supply initrd image via make variable INITRD=<path>)'
Linux内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版
本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。
zImage是Image经过压缩形成的,所以它的大小比 Image小。但为了能使用
zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,
因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,
采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。
所以一般的嵌入式系统均采用压缩内核的方式(另外bootpImage 是编译包含
zImage和initrd的映像,可以通过make变量INITRD=<path>提供initrd映像)。
2、基于zImage 的启动方案。
1、zImage 的生成过程
1、编译链接vmlinux
2、生成vmlinux.lds链接脚本
3、链接生成zImage
2、zImage 的代码结构
在内核编译完成后会在arch/arm/boot/下生成zImage。
#arch/arm/boot/Makefile:
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo ' Kernel: $@ is ready'
由此可见,zImage的是elf格式的,由内核顶层目录下的
arch/arm/boot /compressed/vmlinux二进制化得到的:
#arch/armboot/compressed/Makefile:
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o /
$(addprefix $(obj)/, $(OBJS)) FORCE
$(call if_changed,ld)
@:
$(obj)/piggy.gz: $(obj)/../Image FORCE
$(call if_changed,gzip)
$(obj)/piggy.o: $(obj)/piggy.gz FORCE
总结一下zImage 的组成,它是由一个压缩后的内核piggy.o,连接
上一段初始化及解压功能的代码(head.o misc.o)组成的。


http://www.niftyadmin.cn/n/1748415.html

相关文章

基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(2)

3、zImage 的启动过程1. Linux 内核的一般启动过程&#xff1a;1)对于ARM 系列处理器来说&#xff0c;zImage 的入口程序即为 arch/arm/boot/compressed/head.S。它依次完成以下工作&#xff1a;开启 MMU 和 Cache&#xff0c;调用decompress_kernel()解压内核&#xff0c;最后…

CentOS6.X升级Python

CentOS6.X升级PythonCentOS6.X升级默认Python2.6.6到python2.7在centos下直接输入python即可进入python&#xff0c;能看到当前版本信息[rootlocalhost ~]# pythonPython 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2Type &quo…

基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(3)

(9) 调用文件misc.c的函数decompress_kernel()&#xff0c;解压内核于缓存结束的地方(r2地址之后)。此时各寄存器值有如下变化&#xff1a;r0为解压后kernel的大小r4为kernel执行时的地址r5为解压后kernel的起始地址r6为CPU类型值(processor ID)r7为系统类型值(architecture ID…

对ECMAScript的理解---博客园老牛大讲堂

以下是我对es的一些理解&#xff0c;如果不对&#xff0c;希望还是多多指出。--博客园老牛大讲堂 1、首先什么是es&#xff1f;--博客园老牛大讲堂 百度解释&#xff1a;什么是es ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会,英文名称是European Co…

查看Oracle数据库sid

select * from V$database转载于:https://www.cnblogs.com/lxcmyf/p/6496560.html

在不同浏览器中调试javaScript代码(一)

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道在前端开发中存在的一个最大的问题就是浏览器兼容性问题&#xff0c;同样在不同的浏览器中&#xff0c;调试工具也有所不同&#xff0c;这里我们就主要介绍一些主流浏览器&#xff1a;Firefox、Chrome、Opera,…

基于ARM 的Linux 的启动分析报告——ARM+Linux的启动分析(5)

//调用宏pgtbl&#xff0c;r4&#xff1d;0xc0024000&#xff1a;页表基址/** Clear the 16K level 1 swapper page table*/mov r0, r4 //r0&#xff1d;0xc0024000mov r3, #0add r6, r0, #0x4000 //r60xc00280001: str r3, [r0], #4str r3, [r0], #4str r3, [r0], #4str r3, […

循环引用检查{$ref:$.data[0]}

2019独角兽企业重金招聘Python工程师标准>>> 根据两个map的k&#xff0c;对比v值&#xff0c;相等时候输出相等&#xff0c;不相等时候则输出不相等。使用json&#xff0c;ssm框架。出现一个问题&#xff0c;根据数据库查找出结果为 {"msg":null,"co…