admin管理员组

文章数量:1532170

2023年12月22日发(作者:)

计算机时代2010年第4期·37·U-Boot在64位多内核MIPS处理器上的移植吴晓汉,王江(上海贝尔股份有限公司CPG,上海201206)摘要:介绍了源码开放的通用启动模块U-Boot的文件结构,并以Broadcom公司的4内核处理器BCM1480和RMI的32内核处理器XLR732为例,阐述了该模块在64位多内核MIPS体系结构处理器上的移植经验,包括文件的修改、新增、编译、多内核的启动顺序等。关键词:MIPS;U-Boot;启动代码;高速缓存TransplantationofU-Booton64-bitMulti-coreMIPSProcessorWUXiao-han,WANGJiang(ShanghaiBellCo.,,Shanghai201206,China)Abstract:ThefilearchitectureofU-Bootwhichisanopensourceuniversalbootmoduleisintroduced,andtaking4-coremicroprocessorBCM1480fromBroadcomand32-coremicroprocessorXLR732fromRMIasexamples,thetransplantingexperiencesofthemoduleon64-bitmulti-coreMIPSmicroprocessorareexpounded,includingthemodification,creating,andcompilingoffiles,ds:MIPS;U-Boot;Bootrom;cache0引言目前,微处理器架构呈百家争鸣之势,x86、PowerPC、MIPS、68x、ARM、Xscale等架构纷纷在广阔的电子产品市场划分势力范围。x86架构在PC机领域独领风骚——虽然基于x86的处理器迄今最多集成4个内核,小于MIPS架构的32内核。ARM架构的处理器统治着消费类电子市场,而在嵌入式领域,尤其是通信产品领域,x86、MIPS、PowerPC架构的处理器正逐鹿中原。不同特性的处理器架构组成了丰富多彩的计算控制平台,但是无论是什么类型的处理平台,“开门第一件事”都是调用启动代码。启动代码一般存放在外部的非易失性存储器上,例如Flash芯片。通常不同的处理器,即便基于相同的架构,启动代码往往大相径庭,更何况不同的处理器架构了。例如,BIOS启动代码适合于x86的处理器,风河(Windriver)公司的基于VxWorks操作系统的Bootrom支持PowerPC、ARM、MIPS等多种处理器。但是,这些启动代码往往源码不开放、开发工具和许可费用昂贵、通用性差。U-Boot是德国Denx软件中心依照GPL发布的源码公开的公共软件,其全称是UniversalBootloader,即通用启动模块,目前它支持x86、PowerPC、MIPS、ARM等处理器架构,支持1000多种嵌入式平台。然而,因为U-Boot的前身是ppcboot,是一种专用于PowerPC架构处理器的启动模块,后来Denx软件中心将其扩展到ARM处理器等其他架构,所以目前U-Boot支持的平台中,PowerPC架构的处理器最多。其他架构的处理器平台正在全世界有兴趣的工程师的努力下逐渐完善。U-Boot的最新版本是1.1.5,支持4Kc、5Kc、MIPS32AU1x00等少数MIPS架构单内核处理器。笔者将U-Boot扩展到了业界先进的两款64位多内核MIPS处理器上。1U-Boot的结构U-Boot最新版本的源码可以从其官方网站(/projects/u-boot)下载。其目录结构按功能模块分为以下部分:⑴board:各类处理器平台个性相关的代码;⑵common:共享通用的代码;⑶cpu:与各种架构处理器相关的代码;⑷disk:磁盘驱动代码;⑸doc:相关文档;⑹drivers:各类驱动代码,例如网口驱动、PCI驱动;⑺include:相关的头文件;⑻lib_arm、lib_blackfin、lib_i386、lib_m68k、lib_microblaze、lib_mips、lib_nios、lib_nios2、lib_ppc:各类与架构相关的库函数;⑼lib_generic:公用的库函数,例如CRC算法、解压缩算法;⑽其他还有包含从NANDflash启动的代码的nand_spl目录、包含简单的TFTP等网络协议的net目录、包含一些实时时钟代码的rtc目录。与这些目录平行放置的是一些编译管理文件,主要包括:Makefile、、MAKEALL、mkconfig、mips_、i386_、ppc_等。高度模块化的结构使得U-Boot可以被方便地移植到其他处理器平台上,只需要更改或增加以下一些主要目录或文件:⑴Makefile文件;⑵MAKEALL文件;⑶在/board目录下增加新平台的目录及相关文件;⑷在/cpu目录下增加和修改与新处理器相关的文件;

·38·⑸在/doc目录下添加相关文档。ComputerEraNo.42010其次,在MAKEALL文件中增加下列语句,表明bcm1480属于多内核MIPS处理器。LIST_mips_multi_el="bcm1480"LIST_mips_el="${LIST_mips4kc_el}${LIST_mips5kc_el}${LIST_au1xx0_el}${LIST_mips_multi_el}"2移植BCM1480是博通(Broadcom)公司开发的基于MIPS架构的四内核、高性能64位RISC微处理器,最高主频1.2GHz。它是一种紧耦合共享内存对称式多处理器(SMP),具有1个PCI-x接口、4个千兆网口、3个HT(HyperTransport)接口、1个DDR/DDR-IISDRAM控制器等丰富的外部接口;一条面向网络分组处理优化的片内公共高速总线ZBbus,将4个内核、二级缓存、内存控制器等外围模块连接起来,总线数据宽度为256位,速率是处理器主频的一半。总线使用MESI协议以保证4个内核、二级缓存、内存和外部设备的数据的一致性。四个内核之间通过邮箱、中断等方式通信。XLR732是RMI公司推出的一种面向网络应用的64位32内核MIPS架构处理器,集成了2个10GE以太网口、1个HT口、4个千兆以太网口、1个PCI-X接口、内存控制器、网口加速器、安全处理引擎等模块。与其他常见处理器不同的是,所有内部模块通过消息环进行通信,消息环的速度就是内核的运行速度。U-Boot在多内核MIPS处理器上的移植,主要要考虑两方面问题:⑴MIPS架构在不同处理器上的实现具有不同的方式,如何借助已支持的MIPS处理器的U-Boot代码来实现对新处理器的支持。⑵在多处理器环境下,如何有序地初始化各个内核和外设,内核之间如何有效地通信。在以下的论述中,笔者以BCM1480为主,XLR732为辅(出现bcm1480的地方均可以xlr732替代),介绍了U-Boot的移植过程,其中PlatformBcm表示平台名称。移植是分两步完成的,第一步是让U-Boot在单内核中先运行起来;第二步是在第一步的基础上,增加对多内核的支持。整个启动过程是一个最小系统的启动,只要最小系统起来了,其他模块的初始化并非难事。2.1选择编译器因为U-Boot主要在系统启动的初期起作用,所以对编译器的选择没有实时操作系统那么严格,笔者选择了mips-linux交叉编译工具链,版本是2.7.16(可参考)。为此,Makefile文件中的编译工具相应修改为:ifeq($(ARCH),mips)CROSS_COMPILE=mips_linux-Endif其中,el表示处理器工作于小端模式(littleEndian)。2.3增加新代码新增代码分为两部分:①与平台相关部分;②与处理器相关部分。因为增加了新的平台,所以在board目录下新建目录PlatformBcm,与平台个性相关的代码都存放在该目录下,包括lowlevel_init.S,PlatformBcm.c,flash.c。同时,在/include/configs/目录下新建文件PlatformBcm.h。这个头文件定义了U-Boot在新平台中的特性,例如,串口波特率、环境变量、内存加载地址、以太网端口的MAC地址等信息。新增的与处理器相关的头文件bcm1480.h位于/include/asm-mips/目录。与处理器相关的代码,例如网口驱动程序、串口驱动程序等,位于目录/cpu/mips/下。所有新增加的文件和需要修改的文件列于表1。修改完代码之后,不要忘了在/doc目录下增加相关文档。表1类别修改文件列表功能与处理器相关的头文件串口驱动程序网口驱动程序二级缓存操作与平台相关的头文件底层初始化程序与平台相关的函数Flash芯片读写驱动文件名/include/asm-mips/bcm1480.h/cpu/mips/bcm1480_serial.c/cpu/mips/bcm1480_mac.c/cpu/mips/bcm1480_l2c.c/include/configs/PlatformBcm.h/board/PlatformBcm/lowlevel_init.S/board/PlatformBcm/PlatformBcm.c/board/PlatformBcm/flash.c处理器相关平台相关2.4编译U-Boot的编译方法与其他软件包的编译类似,运行以下两条命令便能得到最后的目标文件:MakePlatformBcm_configMakeall第一条命令是为了根据PlatformBcm的配置生成相关文件,第二条命令是产生U-Boot的目标文件:。后者是一个二进制文件,位于U-Boot根目录下,可以用烧录器或者软件直接烧到启动Flash中使用。同时生成的还有和等,后者也是一个可烧录文件。下一步便是启动了。2.2修改配置文件首先在Makefile文件中增加新平台的配置项,以便在编译时找到相关规则,生成相应文件:PlatformBcm_config:unconfig@>include/config.h@echo"#defineCONFIG_PlatformBcm1">>include/config.h@./mkconfig-abcm1480mipsmipsbcm14803启动MIPS处理器上电或重启后,所有内核总是从物理地址0x1fc00000读取第一条指令。在U-Boot中,这条指令位于/cpu/mips/start.S文件中,标号reset指明了这个启动入口。BCM1480与XLR732不同的是,BCM1480启动后只有内核0激活,其他核都处于Reset状态;而XLR732在启动后所有内核都是活的。两种处理器的内核0的启动顺序基本相同,而其他内核的启动顺序稍有不同。以下介绍内核0的启动顺序,它与其他单核处理器的启动顺序大同小异。上电后,内核0先对状态、控制等内部寄存器初始化,然后同时在编译时会自动在/include目录下生成一个文件config.h:#defineCONFIG_BCM14801#include

计算机时代2010年第4期调用lowlevel_init(位于lowlevel_init.S)进行内核其他模块的初始化,包括初始化串口、一级高速缓存、二级高速缓存、内存等。此时的串口初始化是最基本的初始化,能够输入输出字符。尽早初始化串口,及早建立人机交互界面有利于用户了解上电后U-Boot做了些什么,如故障诊断等。内存初始化完毕后,U-Boot对自己将用到的内存进行测试。如果是高可靠性设备,U-Boot需要对内存设置ECC(故障纠错功能),而且在使用内存之前对所有内存内容清零。以上过程中的所有代码都使用汇编语言编写。由于U-Boot采用了一种技巧,将CPU的一级高速缓存设置成内存模式,可以允许C语言程序在其中运行,但代码量不能太大,因为通常一级缓存小于32KB。下一步便是在一级缓存中运行board_init_f()函数(位于/lib_mips/board.c)。该函数的主要功能是将剩余代码从Flash复制到内存,并完成串口的真正初始化,重定位堆栈指针、全局指针和定时器等初始化,接着调用relocate_code(位于/cpu/mips/start.S),跳转到真正在内存中运行的指令段的第一个函数board_init_r(位于/lib_mips/board.c)。此后所有的代码都可以用C语言编写。函数board_init_r()初始化网口、内存管理、PCI、TCP/IP、TFTP等模块。最后进入main_loop()函数(位于/common/main.c),按照环境变量的设置,或者从网络或硬盘等装载操作系统,或者停在一个人机交互的界面,等待手工输入命令。U-Boot提供了丰富多彩的命令,例如内存测试、PCI设备扫描、时间设置、网口测试、装载软件并运行等,还允许用户自定义命令。CPU0CPU0基本初始化串口初始化所有内核的邮箱清零一级缓存初始化二级缓存初始化释放其他CPU的ResetCPUx基本初始化零查询邮箱寄存器非零初始化内存将数据从ROM复制到RAM初始化网口、PCI和GE等其他模块装载软件或者等待用户命令查询邮箱寄存器非零零一级缓存初始化通知CPU0并等待Lowlevel_initBCM1480CPUx保持Reset状态XLR732CPUxCPUx基本初始化一级缓存初始化等待来自CPU0的消息·39·寄存器和一级缓存,接着通过邮箱告诉内核0,“我已经初始化完毕”,再轮询邮箱等待真正的工作任务的到来,与XLR732的非零内核等待消息的原理一样。内核0发现其他内核全部完成初始化后,就继续初始化内存、网络等其他共享模块,最后装载操作系统或等待用户输入命令。图1显示了U-Boot应用在多处理器上的启动过程。第一列是内核0的启动过程。BCM1480与XLK732基本类似,虚线框所指模块是BCM1480内核0所特有的。第二列是BCM1480其余内核的启动过程,第三列是XLK73其余内核的启动过程。图2显示了U-Boot在BCM1480处理器上启动时串口的输出信息,中文是笔者所加的注释。[BOOT][L1CH][L2CH][CPU1][CPU2][CPU3][DRAM][RMOK]DRAM:l28MBTopofRAMusableforU-Bootat:88000000Reserving135kforU-Bootat:87fdc000Reserving192kformalloc()at:87fac000Reserving44BytesforBoardInfoat:87fabfd4Reserving36BytesforGlobalDataat:87fabfb0Reservingl28kforbootparams()at:87f8bfb0StackPointerat:87f8bf98NowrunninginRAM-U-Bootat:87fdc000Flash:l6MBUsingdefaultenvironmentIn:serialOut:serialErr:serialInitEthernetInitPCIHitanvkeytostopautoboot:543BCM1480#/*内核0启动*//*初始化一级缓存*//*初始化二级缓存*//*内核1启动*//*内核2启动*//*内核3启动*//*初始化内存*//*内存测试成功*/U-Boot1.1.5(Oct292007-14:26:38)图2U-Boot在BCM1480处理器上启动输出4结束语具有开源风格的U-Boot正追逐在Linux的成功之路上,它可以服务于多种架构的处理器平台,全世界的开发者集思广益,为它贡献自己的智慧,不断完善它,增加新的特性,修正潜在的问题。本文介绍了作者自身将U-Boot移植到两种多内核64位MIPS处理器上的经验,希望对U-Boot在其他MIPS处理器上的移植以及在其他架构多内核处理器上的移植有所帮助。参考文献:[1]/projects/u-boot[2]BCM1480User’sManual,BroadcomInc,2003.12.[3]XLRProcessorFamilyProgrammingReferenceManual,RazaMicroelectronics,Inc,2006.11.[4]TheMIPS64PrivilegedResourceArchitecture,MIPSTechnologies,Inc,2005.7.图1多内核处理器的U-Boot启动过程掌握了内核0的启动过程,其余内核的启动相对简单,因为除了一级高速缓存之外,其他模块,诸如二级高速缓存、内存、网口、PCI等都是所有内核共享的,这些共享的模块都由内核0完成初始化,其余内核只需初始化属于自己的部件。所以X732的其余内核启动后只做两件事,一是初始化内核寄存器;二是初始化属于自己的一级高速缓存,然后就一直等待消息。这个消息是由运行在内核0上的操作系统发出的,消息中存放着将在其他内核运行的操作系统或者任务的起始地址等信息。在BCM1480处理器中,其他内核上电后处于Reset状态,内核0在完成二级缓存初始化后,激活其他内核,然后通过邮箱等待其他内核完成初始化。其他内核被激活以后,初始化内核基本▲CE

本文标签: 内核处理器启动相关代码