您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

基于MIPS32平台的Linux利用体系移植

发布日期:2011-05-16

    小序

    如今,Linux作为仅次于微软Windows的利用体系已经在PC和嵌入式范畴得到了广泛的应用,尤其是在嵌入式开辟范畴,由于Linux利用体系具有资源低,可靠性高,源码要领等明显的长处,已经成为受浩繁嵌入式开辟者青睐的利用体系之一。如今,Linux利用体系所支持的包括X86、ARM、MIPS、MIPS64、Sun SPARC、POWER PC、Motorola 68K、IBM S/390、Alpha、IA64、cris、parisc、sh等紧张的体系布局。本文以实际项目中一个MIPS32架构的CPU和板级体系为例,叙述了怎样将Linux利用体系移植到目标平台上。

 
   1 目标平台概述

    本文所讨论的开辟平台采取的CPU是同济大学微电子中间自主开辟的BC320处理惩罚处罚器,采取MIPS 4KC的体系布局,带MMU、无浮点协处理惩罚处罚器、标准5段流水线,指令及数据Cache的大小各为4KB,寻址空间为4GB,此中0x00000000-0x7fffffff为用户空间,0x80000000-0xffffffff为内核空间,板级体系采取了PMC的PM8172芯片组,支持最高128MB的SDRAM,BOOT ROM的地点空间是0x1fc00000-0x1fffffff。

    2 Linux交错编译环境的创建及内核配置和编译

    在举行实际的Linux利用体系移植之前,须要在宿主机上创建图1所示的MIPS的交错编译环境,以便能在平常PC机上通过交错编译东西来调试运行在目标开辟板上的步调。 

    创建MIPS交错编译环境的紧张东西有binutils、GCC、glibc以及作为调试器的gdb等,此中binutils为二进制文件的处理惩罚处罚东西,它紧张包括一些资助开辟东西,比喻:readelf可表现elf文件信息及段信息;nm可列出步调的标记表;strip将不须要的代码去失以减小可实行文件,objdump可用来表现返汇编代码等,GCC是GNU提供的支持多种输入高级语言与多种输出呆板码的编译器,是Linux利用体系的配套编译器,支持Linux所采取的扩展C语言。glibc是连接和运行库,由于此链接和运行库须运行在目标开辟板上,以是必须用先前创建的交错编译器对其举行编译,如图内核大小恳求较为苛刻。还可以利用uclibc等其他链接和运行库作为glibc的调换品,别的,若不是从硬盘启动,则还须为Linux制作ramdisk。在ramdisk上,除了要摆设/dev(摆设Linux利用体系所须要的配置文件)、/etc(摆设Linux体系配置文件)、/lib(摆设交错编译后天生的库文件)等目次及其下的文件外,还须要在/bin和/sbin下摆设种种体系必须的下令步调,如shell、init、vi等,为此须要busybox大概tinylogin等专为Linux利用体系提供的标准东西步调。凡此种种,都可以在GNU旗下的网站下载并自由修改其源代码。

    由于Linux利用体系的内核源代码支持种种差别的体系结讨论差别的应用须要,以是在利用交错译码器编译前还须要举行内核的配置变乱,包括选择处理惩罚处罚器的体系布局、文件体系的种类、板级支持,对配置驱动的支持以及是否利用ramdisk等。配置东西包括make config、make menuconfig、make xconfig,保举利用利用界面更为精良的make menuconfig及make xconfig。在内核配置变乱完成后即可举行内核编译变乱,Linux源代码提供的强大的makefile结果,使得巨大的编译进程利用起来并不困难。

    关于Linux交错编译环境的创建及内核配置和编译的过细流程,在《Building Embedded Linux Systems》(Karim Yaghmour着)内有过细的叙述,本文为此不再赘述。

   
3 Linux移植中实际指令集小于标准MIPS指令集的标题

    随着软件可移植标题在整个软件要领学中告急性的日益增长,种种大型软件无不把进步自身的跨平台性作为软件筹划的紧张目标之一。为此,Linux提供了映射用范畴内各大主流体系布局的支持,仅以MIPS体系布局为例,Linux利用体系2.4.26版本的内核就支持险些全部32位和64位差别版本的MIPS架构,为利用体系的移植变乱提供了巨大的方便。然而,处于种种缘故因由(诸如专利掩护或分外应用),有相称一部分采取MIPS体系布局的芯片产品只提供了标准的MIPS指令集的一个子集。一旦内核代码在编译完成后天生了不属于实际指令集的指令,CPU将孕育产生生存指令例外,可以说,当体系布局间的差别不再成为最紧张的移植变乱时,怎样逻辑等效地消除实际指令集和标准指令集间的差别成了Linux移植变乱中最告急的一环,由于MIPS的专利掩护,相称多MIPS兼容芯片的开辟者并未对指令集的4条非对齐存取指令(lwl、lwr、swl、swr)加以实现,如Realtek RTL8181"Wireless LAN Access Point/Gateway Controller"等,下文将以同济大学自主开辟的BC320芯片为例,从修改内核源代码、修改编译器及汇编器这两个方面出发,讨论怎样办理4条非对齐存取指令未被实现的标题,由于编译器及汇编器的修改涉及编译原理方面的知识,不在本文范畴之内,以是将把重点放在讨论修改内核源代码的要领上,对GCC和GAS修改的底子知识仅作一样通常先容。

    3.1 修改内核源代码中的生存指令例外处理惩罚处罚步调

    当CPU实行到未被实现的呆板码时,将会孕育产生reserved instruction exception,然后根据例外的种类跳转到相应的例外处理惩罚处罚步调入口处。借助于编写映射的例外处理惩罚处罚步调,可以为被实际指令集实现但又属于标准指令集的指令(Iwl、lwr、swl、swr为例)提供逻辑等效的调换要领。在Linux内核源(以2.4.26版本为例)代码的目次树下进入.\arch\mips\kernal目次,打开traps.c文件,并添加simulate_lxRI函数,代码如下:


    此中:_OP_为宏利用,可取出32位呆板码中的利用码以刚强利用典范;0x22映射于lwl指令、0x26映射于lwr指令,0x2A映射于swl指令,而0x2E则映射于swr指令。步调将根据差别的利用码进入差别的调换步调。va和byte变量则谋略出4条非对齐指令的偏移量。

    完成代码后将此函数添加到同一文件的do_ri函数中去,此函数即认真处理惩罚处罚Linux利用体系的生存指令例外,添加的代码为:

    if(simulate_lxRI(regs,opcode)){
    compute_return_epc(regs);
    return;
    }

    即当simulate_lxRI正确处理惩罚处罚完非对齐存取指令并返回1后,体系将通过compute_return_epc函数把epc寄存器的值放回pc寄存器并返回;不然,连续处理惩罚处罚do_ri中其他的例外处理惩罚处罚步调。

    这一要领变乱量小,容易包管修改后的等效性,大多数熟习C语言的步调员来说都是易于掌握的。在软硬件协同开辟的体系筹划前期具有很大的实际利用价格。体系筹划师可快速创建原型机跑通利用体系,以验证软硬件的正确性。但由于其采取的是例外处理惩罚处罚的要领,若频繁孕育产生例外则将影响体系性能,以是对memcpy(此函数代码在Linux源代码的rach\mips\lib目次下的memcpy.s文件中)如许利用频繁的汇编步调应手工修改其代码。再加上编译器一样通常不会天生4条非对齐指令(仅当C步调中的布局体有非字对齐等少数环境下会出现),以是此修改要领可包管大抵靠近原性能。

    3.2 修改GCC编译器或GAS汇编器

    只管利用exception handler来办理生存指令例外标题方便、快捷、但其屈从终究是低于直接修改GCC编译器或GAS汇编器的,别的,修改exception handler的要领在smp的环境下有大概带来辩论,以是,直接修改GCC或GAS的要领是有着实用价格的。

    GCC的前端可以支持多种语音,后端可以支持多种体系布局,这一特性是由作为中间语言的RTL(寄存器传输语言)实现的,其大抵布局如图2所示。

    此中认真指令天生的部分在后端,涉及的源代码文件包括inst-cmit.c、inst-flags.h、inst-config.h、inst-code.h、inst-extrax.h、inst-opinit.c、inst-output.c等。别的,作为呆板形貌的machine.h、machine.md、machine.h文件也必须加以思量,相称一部分以inst开头的文件是由GCC提供的一组gen*东西根据这3个呆板形貌文件主动天生的。

    修改GAS相对大抵,只须修改GAS源代码中的tcmips.c文件,但屈从相对低于修改GCC源代码。

    直接修改GCC编译器的屈从且一劳永逸,但由于编译器的实现原理和利用体系大相径庭,以是此要领难度较大,大概会延误移植变乱进度,而编译器修改其本身的测试事来由于要和Linux利用体系的移植变乱殽杂在一起举行,对软件Debug来说也是相称巨大的,以是,在体系开辟早期保举利用修改生存指令例外处理惩罚处罚步调的要领,当软硬件都能包管相称的正确性时再利用修改GCC编译器的要领。

   
结语

    本文根据一个特定的开辟平台,先容了怎样将Linux利用体系移植到MIPS体系布局体系上的大抵流程和紧张技能,就移植进程中所遇到的标题,以4条非对齐指令为例,细致讨论了怎样办理实际实现的指令集未能完全包围标准指令集而孕育孕育产生生存指令例外的标题,文中过细先容了修改生存指令例外处理惩罚处罚步调的要领,简述了修改GCC或GAS的要领,掌握这些移植流程和修改技能,敷衍开辟嵌入式体系相称的实用价格,敷衍由其他体系布局实现的开辟平台也具有相称的参考意义。