收藏 分享(赏)

u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc

上传人:yjrm16270 文档编号:7651533 上传时间:2019-05-23 格式:DOC 页数:36 大小:148.50KB
下载 相关 举报
u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc_第1页
第1页 / 共36页
u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc_第2页
第2页 / 共36页
u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc_第3页
第3页 / 共36页
u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc_第4页
第4页 / 共36页
u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、本文以流行的 Samsung 公司的 S3C2410,openmoko 平台和 u-boot-1.3.2(2008.5 发布)为例,介绍如何在 ZIX 嵌入式开发环境下探索 u-boot 启动过程。虽然 u-boot 已经广泛应用,由于其相对的复杂性使用户在了解其内部机理和进行 u-boot 的移植工作时还是会碰到困难。u-boot 已有一些分析文档,但多数和真正的代码不能同步或者版本老旧,难以将概念和现实的代码匹配即硬件板上跑的代码在文档资料中却看不到,更无法紧密的跟踪。本文涉及的代码基于在 s3c2410 硬件运行的成熟 u-boot-1.3.2 代码,版本较新,提供的特性非常丰富,而且在

2、 可以自由浏览和下载。此 u-boot 代表了业界的较高水平,可以直接构建新版的嵌入式产品设计,有较高的应用价值。u-boot 总的启动流程如下-reset- 设置 CPU 模式- 关闭看门狗中断- 设置处理器时钟片上总线- 初始化调试串口- MMU外部总线SDRAM 等初始化- rom 代码数据搬移到 ram- 初始化函数调用栈- 初始化外围设备参数- 启动完毕,进入 main_loop 循环嵌入式系统离不开 bootloader 初始化硬件以及引导操作系统。现在,专用的嵌入式板子运行嵌入式 Linux 系统已经变得非常流行, u-boot 是一种非常适合此类系统的 bootloader。

3、u-boot 主要提供以下功能:设置目标板硬件参数并初始化;为操作系统传递必要信息;执行交互式的底层操作;智能化装载操作系统;引导和运行的固件程序;支持大容量存储和 USB 接口利用 ZIX 开发环境,能够通过比较直观的方式观察 u-boot 内部,而且可以将代码调试和分析同时进行,是一种了解、移植 u-boot 的强大工具。使用 arm 工具链编译 u-boot 源代码,得到可以烧录的 u-boot.bin 文件。 在 ZIX 开发环境里,可以将 u-boot.bin 载入 s3c2410 板运行,并利用 gdb 调试。gdb 能通过 JTAG 接口访问硬件,也可以通过 TCP/IP 访问虚

4、拟硬件。 建立好调试连接,即可通过gdb 操纵 u-boot 启动过程,下面可以跟随代码的执行顺序,了解从上点开始,究竟哪些操作被执行。s3c2410 复位之后,pc 指针会指向 0x0 地址。在 u-boot 代码中,该 0x0 地址是一个向量表,第一条指令跳转 branch 到复位代码 start_code。 位于 cpu/arm920t/start.S 汇编语言文件第 53 行:.globl _start _start: b start_code ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _pre

5、fetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq复位指令跳转之后来到第 154 行,开始执行 arm920t 处理器的基本初始化。首先修改当前程序状态寄存器 CPSR,使处理器进入 Supervisor|32 bit ARM 模式,并关闭 ARM9TDMI 中断和快速中断,这是通过设置 CPSR 相应掩码实现的:start_code: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 ms

6、r cpsr,r0 紧接着,将 S3C2410 特有的 WTCON 寄存器清零,此举仅为关闭看门狗 ,代码位置是 234 行:ldr r0, =pWTCON mov r1, #0x0 str r1, r0 然后在 241 行,将 S3C2410 中断控制器 INTMSK 寄存器置为全 1,INTSUBMSK 置为 0x7ff,禁止全部中断源。S3C2410 手册 358 页起对此有详细描述:mov r1, #0xffffffff ldr r0, =INTMSK str r1, r0 # if defined(CONFIG_S3C2410) | defined(CONFIG_S3C2440) |

7、 defined(CONFIG_S3C2442) | defined(CONFIG_S3C2443) ldr r1, =INTSUBMSK_val ldr r0, =INTSUBMSK str r1, r0 # endif 接下来在 259 行,访问 arm920t 控制寄存器 CP15,并置位最高两位31,30 。此两位置为 0b11 后,处理器时钟被设置为异步模式,允许处理器异步访问总线:mrc p15, 0, r1, c1, c0, 0 orr r1, r1, #0xc0000000 mcr p15, 0, r1, c1, c0, 0 至此 arm920t 相关的配置完成,后面开始设定

8、S3C2410 时钟合成参数。通过设置 UPLL,MPLL 和 CLKDIVN 三个寄存器(在 S3C2410 手册 237 页起讲述) ,得到需要的处理器工作频率,分别在 308 行:ldr r0, =UPLLCON ldr r1, =UPLLCON_val str r1, r0 321 行:ldr r1, =MPLLCON_val str r1, r0, #-4 /* MPLLCON */* FCLK:HCLK CLK = 1:2:4 */ ldr r0, =CLKDIVN mov r1, #CLKDIVN_val str r1, r0 S3C2410 的 UART0 得到初始化,以便于尽

9、早通过 UART0 打印信息。此段代码从 332 行开始,其中涉及到的寄存器读者可参考 S3C2410 手册 293 页起:/* enable uart */ldr r0, =0x4c00000c /* clkcon */ ldr r1, =0x7fff0 /* all clocks on */ str r1, r0 /* gpio UART0 init */ ldr r0, =0x56000070 mov r1, #0xaa str r1, r0 /* init uart */ ldr r0, =0x50000000 mov r1, #0x03 str r1, r0 ldr r1, =0x2

10、45 str r1, r0, #0x04 mov r1, #0x01 str r1, r0, #0x08 mov r1, #0x00 str r1, r0, #0x0c mov r1, #0x1a str r1, r0, #0x28 完成 UART0 设置之后,根据不同的编译时选项和运行时参数,代码会在 360 行进入相应的分支,分别是从 nand 启动,代码执行 lowlevel_init,主要是清除 cpu cache,以及关闭 mmu 和 i-cache,并且根据板极硬件配置初始化外部存储器总线和 GPIO,最后把代码从 nand flash 中拷贝到 ram 中并继续执行。从 nor

11、启动,与第 1 种情况相比,仅仅把代码拷贝部分简化,将 DATA 段从 flash 中拷贝到 ram 中,其余相同从 ram 启动,因为 u-boot 已经处于配置好的 ram 中,所以会跳过所有 cache,mmu, sdram,nand 和 nor 相关代码,跳转到 done_relocate 执行下面以最复杂的 nand 启动情况为例分析。首先会跳转到 572 行执行 cpu_init_crit,通过操作 CP15 完成 flush 处理器 arm920t 的 cache 和 tlb,并关闭 mmu 和 i-cache:cpu_init_crit:/* flush v4 I/D cach

12、es */ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ /* disable MMU stuff and caches*/ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 clear bits 13, 9:8 (-V- -RS) bic r0, r0, #0x00000087 clear bits 7, 2:0 (B- -CAM) orr r0, r0, #0x00000002

13、 set bit 2 (A) Align orr r0, r0, #0x00001000 set bit 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 然后跳转到 board/neo1973/common/lowlevel_init.S 文件的 139 行执行,进行总线数据宽度、时序、SDRAM 控制、GPIO 等配置,配置完毕后会返回 start.S 继续执行。因为该代码是与板相关,故放在 board 目录里面。由于代码较多,只粘贴开始部分:/* memory control configuration */ /* make r0 relative the

14、 current location so that it */ /* reads SMRDATA out of FLASH rather than memory ! */ adr r0, SMRDATA ldr r1, =BWSCON /* Bus Width Status Controller */ add r2, r0, #13*4 完成板级设置后,在 cpu/arm920t/start.S 的 373 行判断代码自身的执行位置。如果从 stepping stone 内执行,并且 u-boot 配置为 nand boot 模式,则跳转到 nand_load 拷贝代码:ldr r1, =BW

15、SCON /* Z = CPU booted from NAND */ ldr r1, r1 tst r1, #6 /* BWSCON2:1 = OM1:0 */ teqeq r0, #0 /* Z /* compiler optimization barrier needed for GCC = 3.4 */_asm_ _volatile_(“: : :“memory“);memset (void*)gd, 0, sizeof (gd_t);gd-bd = (bd_t*)(char*)gd - sizeof(bd_t);memset (gd-bd, 0, sizeof (bd_t); 然后在

16、一个 for 循环中从 init_sequence 地址开始,逐个调用初始化 C 函数至 NULL 为止。这些routine 函数按调用顺序分别是cpu_init() 在 common/main.c 文件,执行初始化中断栈操作board_init() 在 board/neo1973/gta01/gta01.c 文件中,执行板级初始化,主要是更新 GPIO 和 PLL设置interrupt_init() 在/cpu/arm920t/s3c24x0/interrupts.c 文件中,执行时钟中断初始化env_init() 在 common/env_nand.c 文件中,设置缺省环境变量init_b

17、audrate() 在 lib_arm/board.c 文件中,将环境变量中的 baudrate 存入 bd_info 结构 bdserial_init() 在 common/serial.c 文件中,调用驱动中真正的 init()初始化串口console_init_f() 在 common/console.c 文件中,更新 global_data 结构 gd 的 have_console 标记为 1display_banner() 在 lib_arm/board.c 文件中,打印 u-boot banner,输出版本、运行地址等信息。比如在控制台看到的init_func_i2c() 在 li

18、b_arm/board.c 文件中,初始化 i2c 总线dram_init() 在 board/neo1973/gta01/gta01.c 文件中,填充 bd-bi_dram0的 start 和 size 成员,用来描述 u-boot 可用的 ramdisplay_dram_config() 在 board/neo1973/gta01/gta01.c 文件中,打印当前 ram 配置。在控制台能够看到相应的 DRAM: 128 MB利用 gdb 可以清晰的看到调用过程:for (init_fnc_ptr = init_sequence; *init_fnc_ptr; +init_fnc_ptr)

19、 if (*init_fnc_ptr)() != 0) hang (); 接着是一些可选外设的初始化,如显示屏、nor、nand、dataflash 、网卡等,此过程执行后全部初始化工作完成。下面仅粘贴 nor 代码:#ifndef CFG_NO_FLASH /* configure available FLASH banks */ size = flash_init (); display_flash_config (size); #endif /* CFG_NO_FLASH */ 之后在 457 行进入无限循环,调用 common/main.c 文件的 278 行 main_loop()函

20、数,u-boot 完成启动过程。main_loop 提供一个交互式命令行,可通过串口或 usb 控制台操作,也可以进一步引导操作系统:for (;) main_loop (); 本文作者:周明 原载于嵌入式技术博客,请尊重作者劳动,欢迎转载但需注明原文链接!怎样在 ZIX 中调试 U-Boot 和 Kernel由 pyl880121 在 星期一, 09/28/2009 - 22:49 发表。怎样在 ZIX 中运用 DDD 调试并分析 U-Boot 和 Kernel,给出具体步骤 ,谢谢周老师请教 u-boot 启动 logo 问题由 trickeraxun 在 星期四, 12/18/2008

21、- 17:41 发表。周老师,能不能讲解下怎样修改 u-boot 的启动 logo?官方的 u-boot 没有 logo 的功能,ZIX 使用的 open由 zhoum 在 星期四, 12/25/2008 - 10:57 发表。官方的 u-boot 没有 logo 的功能,ZIX 使用的 openmoko 加入了这个功能。在 ZIX 里面进入 emulator 目录,运行 ./run-qemu在 u-boot 的 shell 里面键入 mtdparts 可以看到分区 No. 3 就是 splash,offset 是 0x244000有一个制作 logo 的脚本由 zhoum 在 星期五, 12

22、/19/2008 - 18:23 发表。有一个制作 logo 的脚本 splashimg.pl首先你要有一个 png 格式的图片,分辨率 480x640,比如叫做 logo.png运行 perl splashimg.pl logo.png logo得到 logo 文件,然后使用 gzip 压缩之把 logo.gz 烧写到板上 flash 的 splash 分区即可(1)zImage 自解压本文以流行的 Samsung 公司的 S3C2410,mini2440 平台和 linux-2.6.29 为例,介绍如何在 ZIX 嵌入式开发环境下探索 linux 内核启动过程。Linux 内核启动一般由外

23、部的 bootloader 引导,也可以在内核头部嵌入一个 loader,实际的应用中这两种方式都会经常遇到。所以要了解内核启动最开始的过程,必须对 bootloader 如何引导内核有所熟悉。下面我们从 u-boot 加载 linux 内核的代码开始分析(关于 u-boot 自身的启动流程,请参考 u-boot 启动过程 基于 S3C2410) 。1.处理器内核加载代码在 u-boot 的 do_bootm_linux 函数里,实现了处理器架构相关的 linux 内核加载代码,特别是 tags 传递。该函数中,在(u-boot-1.6)lib_arm/armlinux.c 的 90 行调用了

24、 getenv 将 bootargs 环境变量保存在commandlinechar *commandline = getenv (“bootargs“);然后解析 uImage 文件头,并且按照头中的定义分解和加载 uImage。所以这部分代码的运行取决于uImage 文件是如何生成的,本文不做过多叙述,可参考另文了解 u-boot 使用。接下来进行 tags 设置工作,分别调用了setup_start_tag()setup_memory_tag()setup_commandline_tag()setup_initrd_tag()setup_end_tag()然后对 TLB、cache 等进行

25、 invalid 操作,这是通过在 lib_arm/armlinux.c 的 268 行调用cleanup_before_linux()(cpu/arm920t/108)实现,然后即可跳入从 uImage 中分解出来的内核 Image 或zImage 入口cleanup_before_linux ();theKernel (0, machid, bd-bi_boot_params);/* does not return */return;在 s3c2410 平台上,该入口 theKernel 一般是物理地址 0x30008000。如果我们使用 zImage 自解压内核映像,对应的代码正是自解压

26、头,位置在内核源码 linux-2.6.29 的 arch/arm/boot/compressed/head.S第 114 行的 start 符号start:.type start,#function.rept 8mov r0, r0.endrb 1f.word 0x016f2818 Magic numbers to help the loader.word start absolute load/run zImage address.word _edata zImage end address1: mov r7, r1 save architecture IDmov r8, r2 save

27、atags pointer这也标志着 u-boot 将系统完全的交给了 OS,bootloader 生命终止。之后代码在 133 行会读取 cpsr 并判断是否处理器处于 supervisor 模式从 u-boot 进入 kernel,系统已经处于 SVC32 模式;而利用angel 进入则处于 user 模式,还需要额外两条指令。之后是再次确认中断关闭,并完成 cpsr 写入mrs r2, cpsr get current modetst r2, #3 not user?bne not_angelmov r0, #0x17 angel_SWIreason_EnterSVCswi 0x1234

28、56 angel_SWI_ARMnot_angel:mrs r2, cpsr turn off interrupts toorr r2, r2, #0xc0 prevent angel from runningmsr cpsr_c, r2然后在 LC0 地址(157 行)处将分段信息导入 r0-r6、ip 、sp 等寄存器,并检查代码是否运行在与链接时相同的目标地址(162 行),以决定是否进行处理。由于现在很少有人不使用 loader 和 tags,将zImage 烧写到 rom 直接从 0x0 位置执行,所以这个处理是必须的(但是 zImage 的头现在也保留了不用 loader 也可启动

29、的能力) 。arm 架构下自解压头一般是链接在 0x0 地址而被加载到 0x30008000运行,所以要修正这个变化。涉及到r5 寄存器存放的 zImage 基地址r6 和 r12(即 ip 寄存器)存放的 got(global offset table )r2 和 r3 存放的 bss 段起止地址sp 栈指针地址很简单,这些寄存器统统被加上一个你也能猜到的偏移地址 0x30008000。该地址是 s3c2410 相关的,其他的 ARM 处理器可以参考下表PXA2xx 是 0xa0008000IXP2x00 和 IXP4xx 是 0x00008000Freescale i.MX31/37 是

30、0x80008000TI davinci DM64xx 是 0x80008000TI omap 系列是 0x80008000AT91RM/SAM92xx 系列是 0x20008000Cirrus EP93xx 是 0x00008000这些操作发生在代码 172 行开始的地方,下面只粘贴一部分add r5, r5, r0add r6, r6, r0add ip, ip, r0后面在 211 行进行 bss 段的清零工作not_relocated: mov r0, #01: str r0, r2, #4 clear bssstr r0, r2, #4str r0, r2, #4str r0, r2

31、, #4cmp r2, r3blo 1b然后 224 行,打开 cache,并为后面解压缩设置 64KB 的临时 malloc 空间bl cache_onmov r1, sp malloc space above stackadd r2, sp, #0x10000 64k max 接下来 238 行进行检查,确定内核解压缩后的 Image 目标地址是否会覆盖到 zImage 头,如果是则准备将 zImage 头转移到解压出来的内核后面cmp r4, r2bhs wont_overwritesub r3, sp, r5 compressed kernel sizeadd r0, r4, r3,

32、lsl #2 allow for 4x expansioncmp r0, r5bls wont_overwritemov r5, r2 decompress after malloc spacemov r0, r5mov r3, r7bl decompress_kernel真实情况在大多数的应用中,内核编译都会把压缩的 zImage 和非压缩的 Image 链接到同样的地址,s3c2410 平台下即是 0x30008000。这样做的好处是,人们不用关心内核是 Image 还是 zImage,放到这个位置执行就 OK,所以在解压缩后 zImage 头必须为真正的内核让路。在 250 行解压完毕,

33、内核长度返回值存放在 r0 寄存器里。在内核末尾空出 128 字节的栈空间用,并且使其长度 128 字节对齐。add r0, r0, #127 + 128 alignment + stackbic r0, r0, #127 align the kernel length算出搬移代码的参数:计算内核末尾地址并存放于 r1 寄存器,需要搬移代码原来地址放在 r2,需要搬移的长度放在 r3。然后执行搬移,并设置好 sp 指针指向新的栈(原来的栈也会被内核覆盖掉)add r1, r5, r0 end of decompressed kerneladr r2, reloc_startldr r3, LC

34、1add r3, r2, r31: ldmia r2!, r9 - r14 copy relocation codestmia r1!, r9 - r14ldmia r2!, r9 - r14stmia r1!, r9 - r14zImage 和 uImage 的区别 收藏2 月 3 日zImage 和 uImage 的区别一、vmlinuzvmlinuz 是可引导的、压缩的内核。 “vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如 DOS 有 640KB 内存的限制。Linux 能够使用硬盘空间作为虚拟内存,因此得名 “vm”。vmlinuz 的建立

35、有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage 适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令 make bzImage 创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage 是压缩的内核映像,需要注意,bzImage 不是用 bzip2 压缩的,bzImage 中的 bz 容易引起误解,

36、bz 表示“big zImage”。 bzImage 中的b 是“big” 意思。 zImage(vmlinuz)和 bzImage(vmlinuz)都是用 gzip 压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip 解压缩代码。所以你不能用 gunzip 或 gzip dc 解包vmlinuz。二、initrd-x.x.x.imginitrd 是“initial ramdisk”的简写。 initrd 一般被用来临时的引导硬件到实际内核 vmlinuz 能够接管并继续引导的状态。initrd 映象文件是使用 mkinitrd 创建的。 mkinitrd 实用程序能够

37、创建 initrd 映象文件。这个命令是RedHat 专有的。其它 Linux 发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd 下面的命令创建 initrd 映象文件。最后生成的内核镜象有两种 zImage 以及 uImage。其中 zImage 下载到目标板中后,可以直接用 uboot的命令 go 来进行直接跳转。这时候内核直接解压启动。但是无法挂载文件系统,因为 go 命令没有将内核需要的相关的启动参数传递给内核。传递启动参数我们必须使用命令 bootm 来进行跳转。Bootm 命令跳转只处理 uImage 的镜象。uboot 源代码的 tool

38、s/目录下有 mkimage 工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。mkimage 在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个 0x40 字节的头,记录参数所指定的信息,这样 uboot 才能识别这个映象是针对哪个 CPU 体系结构的,哪个 OS 的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么用法如下:./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file:data_file. image-A = set architecture

39、 to arch-O = set operating system to os-T = set image type to type-C = set compression type comp-a = set load address to addr (hex)-e = set entry point to ep (hex)-n = set image name to name-d = use image data from datafile-x = set XIP (execute in place)参数说明:-A 指定 CPU 的体系结构:取值 表示的体系结构alpha Alphaarm

40、A RMx86 Intel x86ia64 IA64mips MIPSmips64 MIPS 64 Bitppc PowerPCs390 IBM S390sh SuperHsparc SPARCsparc64 SPARC 64 Bitm68k MC68000-O 指定操作系统类型,可以取以下值:openbsd、netbsd、freebsd、4_4bsd、linux、svr4 、esix、solaris 、irix、sco、dell、ncr、lynxos、vxworks、 psos、qnx、u-boot 、rtems、artos-T 指定映象类型,可以取以下值:standalone、kernel

41、、ramdisk、multi 、firmware、script、filesystem-C 指定映象压缩方式,可以取以下值:none 不压缩gzip 用 gzip 的压缩方式bzip2 用 bzip2 的压缩方式-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用 mkimage 制作映象时,这个参数所指定的地址值来下载-e 指定映象运行的入口点地址,这个地址就是-a 参数指定的值加上 0x40(因为前面有个 mkimage添加的 0x40 个字节的头)-n 指定映象名-d 指定制作映象的源文件我在编译时用到的命令如下:# make zImage /生成 zImage 镜象/usr/l

42、ocal/arm/k9uboot/tools/mkimage -n Linux 2.4.27 -A arm -O linux -Tkernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage内核镜象已经准备好了,这个时候我们就要来准备文件系统了。由于时间缘故,本人暂时采用的是其他人已经好的文件系统 k9.img.gz。这个时候我们要做的是,自己写一个简单 hello.c 的程序,编译通过后加入到该文件系统中,然后下载到目标板中运行。先编写 hello.c;编译:#/usr/local/arm/2.95.3/bin/arm-linux-g

43、cc o start-hello hello.c编译后生成可执行文件 start-hello下面我们就必须把该执行文件加入到文件系统中去,步骤如下:#gunzip k9.img.gz /解压缩#mount o loop k9.img /mnt/new_disk /挂载#cp start-hello /mnt/new_disk /将文件拷贝到文件系统中#cd /mnt/new_disk#umount /mnt/new_disk /卸载#gzip c v9 k9.img k9.img.gz /压缩 生成最终的文件系统下面我们就要下载内核以及准备好文件系统了,这边先说明我的内存分配情况如下:Flas

44、h:0x10000000 0x10020000 boot0x10020000 0x10040000 uboot0x10040000 0x10060000 uboot env0x10060000 0x10200000 kernel0x10200000 0x11000000 ramdiskSdram:0x20007fc0 0x20a00000 kernel0x20a00000 ramdiskLoadb 通过串口下载数据到 ram 中cp.b 拷贝 ram 中的数据到 flash 中。将 kernel 以及文件系统 ramdisk 下载完毕之后,我们还需要设置 uboot 的环境变量,这样 uboo

45、t 才能够在上电启动的时候启动内核等操作。环境变量设置如下:Set cpfltoram cp.b 10200000 20a00000 18ffff /拷贝文件系统到 ram 中Set boot bootm 20007fc0 /启动 kernelSet bootcmd run cpfltoker;run cpfltoram;run boot /uboot 复位的执行指令Set cpfltoker cp.b 10060000 20007fc0 f4fff /拷贝内核到 ram 中Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/lin

46、uxrc console=ttyS0,115200,mem=32m /uboot 传递给内核的启动参数http:/sunhualing.spaces.live.co . 32519133D6!165.trak对于 Linux 内核,编译可以生成不同格式的映像文件,例如:# make zImage# make uImagezImage 是 ARM Linux 常用的一种压缩映像文件,uImage 是 U-boot 专用的映像文件,它是在zImage 之前加上一个长度为 0x40 的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从 uImage 的 0x40 位

47、置开始执行,zImage 和 uImage 没有任何区别。另外,Linux2.4 内核不支持 uImage,Linux2.6 内核加入了很多对嵌入式系统的支持,但是 uImage 的生成也需要设置。vmlinux 编译出来的最原始的内核文件,未压缩。zImage 是 vmlinux 经过 gzip 压缩后的文件。bzImage bz 表示“big zImage”,不是用 bzip2 压缩的。两者的不同之处在于,zImage 解压缩内核到低端内存(第一个 640K),bzImage 解压缩内核到高端内存(1M 以上) 。如果内核比较小,那么采用zImage 或 bzImage 都行,如果比较大应

48、该用 bzImage。uImage U-boot 专用的映像文件,它是在 zImage 之前加上一个长度为 0x40 的 tag。vmlinuz 是 bzImage/zImage 文件的拷贝或指向 bzImage/zImage 的链接。initrd 是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核 vmlinuz 能够接管并继续引导的状态。vmlinux 是内核文件,zImage 是一般情况下默认的压缩内核映像文件,压缩 vmlinux,加上一段解压启动代码得到,只能从 0X0 地址运行。bzImage 在 uClinux 中很少见到。uImage 是 u-boot 使用 bootm 命令引导的 Lin

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报