内核启动地址的指定 (转)

Bootloader及内核解压
      Bootloader将内核加载到内存中,设定一些寄存器,然后将控制权交由内核,该过程中,关闭MMU功能。通常,内核都是以压缩的方式存放,如zImage,这里有两种解压方法:
使用内核自解压程序。
arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S
arch/arm/boot/compressed/misc.c
在Bootloader中增加解压功能。
使用该方法时内核不需要带有自解压功能,而使用Bootloader中的解压程序代替内核自解压程序。其工作过程与内核自解压过程相似:Bootloader把压缩方式的内核解压到内存中,然后跳转到内核入口处开始执行。

2. 几种内核启动方式介绍
XIP (EXECUTE IN PLACE) 是指直接从存放代码的位置上启动运行。
2.1 非压缩,非XIP
非XIP方式是指在运行之前需对代码进行重定位。该类型的内核以非压缩方式存放在Flash中,启动时由Bootloader加载到内存后运行。
2.2 非压缩,XIP
该类型的内核以非压缩格式存放在ROM/Flash中,不需要加载到内存就能运行,Bootloader直接跳转到其存放地址执行。Data段复制和BSS 段清零的工作由内核自己完成。这种启动方式常用于内存空间有限的系统中,另外,程序在ROM/Flash中运行的速度相对较慢。
2.3 RAM自解压
压缩格式的内核由开头一段自解压代码和压缩内核数据组成,由于以压缩格式存放,内核只能以非XIP方式运行。RAM自解压过程如下:压缩内核存放于 ROM/Flash中,Bootloader启动后加载到内存中的临时空间,然后跳转到压缩内核入口地址ZTEXTADDR执行自解压代码,内核被解压到最终的目的地址ZRELADDR然后运行。压缩内核所占据的临时空间随后被Linux回收利用。这种方式的内核在嵌入式产品中较为常见。
2.4 ROM自解压
解压缩代码也能够以XIP的方式在ROM/Flash中运行。ROM自解压过程如下:压缩内核存放在ROM/Flash中,不需要加载到内存就能运行, Bootloader直接跳转到其存放地址ZTEXTADDR执行其自解压代码,将压缩内核解压到最终的目的地址ZRELADDR并运行。ROM自解压方式存放的内核解压缩速度慢,而且也不能节省内存空间。

3. 内核启动地址的确定
内核自解压方式
Head.S/head-XXX.S获得内核解压后首地址ZREALADDR,然后解压内核,并把解压后的内核放在ZREALADDR的位置上,最后跳转到ZREALADDR地址上,开始真正的内核启动。

arch/armnommu/boot/Makefile,定义ZRELADDR和 ZTEXTADDR。ZTEXTADDR是自解压代码的起始地址,如果从内存启动内核,设置为0即可,如果从Rom/Flash启动,则设置 ZTEXTADDR为相应的值。ZRELADDR是内核解压缩后的执行地址。
arch/armnommu/boot/compressed/vmlinux.ld,引用LOAD_ADDR和TEXT_START。
arch/armnommu/boot/compressed/Makefile, 通过如下一行:
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;
使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。

说明:
执行完decompress_kernel函数后,代码跳回head.S/head-XXX.S中,检查解压缩之后的kernel起始地址是否紧挨着 kernel image。如果是,beq call_kernel,执行解压后的kernel。如果解压缩之后的kernel起始地址不是紧挨着kernel image,则执行relocate,将其拷贝到紧接着kernel image的地方,然后跳转,执行解压后的kernel。

Bootloader解压方式
Bootloader把解压后的内核放在内存的TEXTADDR位置上,然后跳转到TEXTADDR位置上,开始内核启动。
arch/armnommu/Makefile,一般设置TEXTADDR为PAGE_OFF+0x8000,如定义为0x00008000, 0xC0008000等。
arch/armnommu/vmlinux.lds,引用TEXTADDR。

时间: 2024-10-09 16:56:47

内核启动地址的指定 (转)的相关文章

ARM linux内核启动时几个关键地址【转】

转自:http://www.cnblogs.com/armlinux/archive/2011/11/06/2396787.html 1.       内核启动地址1.1.   名词解释ZTEXTADDR 解压代码运行的开始地址.没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态.这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介. Start address of decompressor. here's no point in talking about virtua

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Linux内核启动及根文件系统载入过程

上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了.本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为

Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html 在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup.在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作,详解

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作

Linux内核启动及加载根文件系统

</pre></h1><p><span style="font-family:KaiTi_GB2312;font-size:18px;">上接博文<<a target=_blank href="http://blog.csdn.net/gqb_driver/article/details/8931775" style="text-decoration: none; font-family: 'Mi

linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)【转】

转自:http://blog.csdn.net/tommy_wxie/article/details/17093297 最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过程中总结了一点东西,希望可以帮助大家调试内核. 当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人太多了,像这种内核启动的上古代码早就被人分析的彻彻底底.这注定我写的只能是烂微博了. 为了此微博有存在的必要,我会显示内核启动打印的代码位置(用绿色表示)及出现错误打印的原因(用红

Linux内核启动参数

Linux内核启动参数   Console Options                         参数 说明 选项 内核配置/文件   console=Options 用于说明输出设备 ttyn 终端 ttySn[,options], ttyUSB0[,options] 串口uart,io,addr[,options],uart,mmio,addr[,options]&<60;     netconsole=[src-port]@[src-ip]/[dev],[target-por

Linux内核启动流程分析(二)【转】

转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第一阶段的代码跳转后,会进入第二阶段的代码. 第二阶段的代码是从\arch\arm\kernel\head.S开始的. 内核启动第二阶段主要完成的工作有,cpu ID检查,machine ID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkerne