首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM多核引导过程(2)

ARM多核引导过程(2)

第二章、Bootloader(U-Boot)
1、当放在NOR flash的bootloader被引导监视器调用的时候,它还不能访问系统RAM,因为这个时候内存控制器还   没有初始化成U-Boot所希望的那样;2、U-Boot是如何从flash memory移动自己到主 memory的呢?3、为了得到能正常工作的C环境并运行初始化代码,U-Boot需要分配最小的栈,ARM11 MPCore是在锁定L1 data cache   memory的情况下完成的。U-Boot的初始化阶段,SDRAM控制器初始化完成前,cache内存用作临时数据存储;4、然后,U-Boot初始化ARM11 MPCore、它的caches和它的SCU;5、下一步,所有可用的内存bank被初步的映射,并且进行简单的内存测试,用来确定SDRAM所有banks的大小;6、最后,bootloader安装它自己在SDRAM高端(upper end of)区域,并且分配内存用来给malloc()函数用,   和保存全局board信息数据用。7、在低端内存,异常处理代码向量被copied进来;8、最后,建立栈。   在这个阶段,第二个bootloader U-Boot是在主内存里的,并且C环境建立了。bootloader先传递一些引导参数给内核,然后准备从预先设置好的地址启动Linux内核映像。另外,还要初始化串口或控制台给内核用。最后,它调用内核映像,方法是jumping到start标签的代码(arch/arm/boot/compressed/head.s 汇编代码),这是Linux内核解压自己的代码的开始;bootloader能完成很多功能,最小集如下:1、配置系统主内存:   内核不具备建立和配置RAM的能力和知识,找到并初始化内存是bootloader的任务,内核只负责使用这些内存保存数据。传递物理内存layout给内核是通过ATAG_MEM 参数,下面有具体说明。2、在确定的的地址装载内核映像:   uImage映像是由一个特定魔数的头信息和数据区组成,头信息和数据合起来有一个checksum。在数据区,保存有开始和结束偏移量,用以确定压缩映像的长度,以便于知道多大内存需要分配。ARM Linux 内核被定位在主内存的0x7fc0地址。3、初始化控制台:   因为对所有平台来说,为了debug工具的需要,一个串口控制台是最基本的。bootloader应该在目标板上初始化并使能一个串口,然后传递相关的控制台参数选项给内核,目的是通知内核已经准备好的串口号。4、初始化启动参数,并传递给内核:   bootloader必须以tags的形式传递参数,描述setup已经完成,内存的大小和轮廓,可选的各种测试见下表:Tag name        DescriptionATAG_NONE        Empty tag used to end listATAG_CORE        First tag used to start listATAG_MEM        Describes a physical area of memoryATAG_VIDEOTEXT        Describes a VGA text displayATAG_RAMDISK        Describes how the ramdisk will be used in kernelATAG_INITRD2        Describes where the compressed ramdisk image is placed in memoryATAG_SERIAL        64 bit board serial numberATAG_REVISION        32 bit board revision numberATAG_VIDEOLFB        Initial values for vesafb-type framebuffersATAG_CMDLINE        Command line to pass to kernel5、获得 ARM Linux的机器类型:    bootloader 也会提供机器类型,它是一个系统唯一的数字id。因为它是预定义的,所以它可以被硬编码代码中,否则就从board登记处读出。机器类型数字可以从ARM-Linux项目网页上获取。6、带着合适的寄存器值进入内核运行:   最后,开始运行内核之前,ARM11 MPCore寄存器必须合理的设置:   a、监管模式(SVC);   b、IRQ和FIQ中断禁止;   c、MMU 关闭;   d、数据cache 关闭;   e、指令cache可以开也可以关;   f、CPU register0=0;   g、CPU register1=ARM Linux 机器类型;   h、CPU register2=传递参数的物理地址; 7、uboot启动中函数调用过程    a、汇编code ->     b、board_init_r(init_sequence数组定义了一系列初始化函数,包括arch_cpu_init、board_early_init_f、init_func_i2c、dram_init等) ->     c、这里可以进入cmd模式,输入某个命令来测试u-boot,但默认进入do_cboot ->    d、do_cboot(判断启动方式选择进入recovery_mode、fastboot_mode、autodloader_mode、normal_mode之一的启动模式),但默认进入normal_mode ->     e、normal_mode ->     f、vlx_nand_boot ->     g、vlx_entry ->     h、start_linux
继承事业,薪火相传
返回列表