东南太学硕士学位论文
植没有深入研讨。 不管有没有进行b00tloader的移植,都可以进行ucLinux的内核的移植。当然如果购买的商业 套件中已经有了移植好的版本,那就可以直接应用。例如.在MIcETEK的ucLinux的套件中t就有 移植好的“B0x版本,但是该版本的内核版本日期是20020625的,经过实际运行测试,发现这个版 本在进程间通信及JFFs2文件系统的支持上存在不足,所以决定在内核新版本上进行自己的移植。
2.4.2本课题中所用内核移植的具体步骤
同样,在进行uCLinux的移植时,尽可能寻找移植过程中需要改动最少的版本,这里选择的 ucLinux—dist-20030522.tar.gz,支持s∞sun94510的版本,另外也参考了从 gz)和httD://wwW.start-Web.net/tpu/下载的ucLinux版本(文件名为ucLinux一2.4.17一ucltt
MICET既移植的版本,具体步骤如下:
第一步:在月jnllx.2.4.x,arch,amnoⅫⅢ,目录下修改mlcc珂e和coII丘gjn,这样在内核配置的增
添“B0x的选项,具体为:
1.在make丘k中添加如下代码:(要添加的新代码的位置可以在源程序中类似代码附近, 下同)
i蛔(¥(col町FIG ARcH_mB0x),y)
.IEXt~DDR
MACH阱E
EⅡdif
口4舭
=Oxoc008000
2.在con丘g血中添加如下代码:
ONFIGA4480X\ 第一处:“BOX CRC}LRcH第二处:if【”¥coNFIG A4480x”=”y“】;山∞
dc丘ne boolcoNFIG NOJ屺T..CAo珥y dc五neboolCoNFIG
oUj2y
n
de丘nebcdcoNHGna’U—26
de丘n幽ol
CONFIG CPI,.ARM7加yde缸山lde血ebcdCoNFIG C吼,WⅡHC^oⅢy
CON珊GaHrWrrHde石Deb∞lCDNFIG-sERIAI{4480y MCR-.矾S1限I脚NoolCdc丘ne bONFIGI、仃’y de丘北h
强DRAM—BASE舨OC∞0000
de丘ne h盟FLASHS攻置0]由0801)000 de丘ne hcxDRAMde丘IIc._bex丘
MEM—BASE伪【删0 FLASH._S皿0x00200000
第二步:在恤llx-2.4.地rc呐Ⅲ∞mml虾新建mach44b0)【文件夹,同时参照M【a盯EK版本相
应目录下的文件,在该文件夹中分别新建arch.c,ifq.c,血”.c文件;
第三步:在/ljn“.2.4.柏rch栅枷咖删l,boot,mal∞衄e中添加如下代码:
RCH-舭B0均'y) ia田(¥I:CONI礓G A
ZRⅡ.ADD鼠 一0xOoD08000Z11三】cI.ADDR一呶Ⅸ)000000
ZBSSADDR
Endif
一嘛OC4I)0咖
其中丑也u山DR(0xoc008000):决定keⅡerl解压后数据输出地址:
第二章ucu¨x及其开发环境的建立
第四步:在/lin吼一2.4.加fcM咖衄om舢,咖t细岬sed目录下:
1.将MICFrEK相应目录下的head_44b0】【.s文件拷贝到该目录下:
2.在mkc丘le中添加如下代码:
i矗Ⅺ(¥(CoNFIG A
R(Ⅲ44BOx),y) H队D=h∞d44box.o aIdif
第五步:在ua血慨一2.4.x,arch,a衄nom删l/kc蛐el,en时一a咖v.s中添加如下代码:
托Iifde丘ned(coNFIGARCH4480)()
.mcrodisabloq
.endm
.眦mget i
rqnI:and ba∞,irqnr'irqs诅t'b器e,nI单 l出、b∞e,=ruSPR
lt击恤qeqⅢ’呐∞e峨#o】
.endm
.mac∞ilq pri0_上【ble 第六步:在ucUn.lle】【.2ndm
.4.x觚Mlmmom衄蜘e】/h∞d.a珊v_s中添加如下代码:
第一处:
能lifdc岛e脚vd(crOlNF,踟AIG AR叫唧4删“B4OXB)ox
第二处:
撇fde丘n叫∞NFIGAR(H“B0)()
adr 15.U:0
ldmia r5,{r5,r6,r8,r9,sp}
@S咖ps纽ck 严
C0pyda协∞嘶。璐totbeirⅡ胛h咄. 吖
.
,.aeⅡBSS},
mv^绚
1:
唧r5,r8
s慨r4,陋】斟
h:c lb
产Pl吼曲dweImowwhatourpIoo豁sorcodeis(fhar皿jd)
吖
ldr r2,EV44Bo..PRoCESSoR Tn'E
str
眨哂】r2,撇C
啪v
HTn,E“BOX s订 r2,嘲
mv审,加
b sta^kmd Loo:
.10ng—bss-staIt
.10ng
pIoc酋∞r_id
.10ng—-end
.10ng—蚰c蜘由earc血孵
.Iong
init task_吼i∞+8192
EV“B0PROCESSORrn'E:
蛔g ox34345036 捍∞成f
13
东南大学硕士学位论文
uCUnll】【的内核(解压后)就是从该程序开始执行的。
第七步:在ucIjnII】c一2.4.砒IrcMm∞oⅫⅢ肥mel/岫.c中添加如下代码:
第一处:
髂mlinhgcvoidd0 mQ(.mthqs廿IlctpLregs+regs) I
s劬Jctirqd嚣c+d郫c; 蛐n
lctirqacdon+action; intcpu;
掸i融efCONFIG.ARaLSAMSUNG aEARPI科DD盯(ir吐 托ndif
irq=丘xup-jIq(ifq);
新fdcfcoNFIG ARcH4480X删新增代码
iIq;“B∞(唧r右xq“b);0
(irq);
CU三ARPl玳D自Eendif
第二处:在asm曲kagevoiddo.JRQ(intirq,sⅡuctptIegs+regs)前面添加:
撇lefcomGAR口44BoX
int“BOX-丘x44b0血tx)
I
int译O:
§Ⅱ(ie
0;i《26;“+)
{
遗x=a1)
br咄
x=x>>l:
}
∞nlmt
l
托ndif
第八步:在,linH一2.4.址∽MImmomⅢ恤n目录下:
1.在proc-Ⅲn6’7.s文件中添加如下代码:
第一处:
cp峭舢m0--衄IL.D龇:
.鹊dz
”44BOX。
cpu—w44b(1ml“圮: .a踮iz ”S3C44BO” 第九步:在恤“-2'4.硝HMlmmⅫm】f协ols,mach-t),p∞中添加 “b0】【
ARC H“BOX “BOX
第十步:在舳IIx_2.4.舳酏h178毗o nfigjn文件中添加如下代码:
if【“¥coNFIG ARcH44BOx”=。y”】;nIen
b00lEV4480serial
p毗suppo州CONFIG SERIAL4480 if【”¥CoNnG sERIAI.4480”a”y”】;then b00l’ Supponfbr∞璐oleonSaⅢs岫gserialpon.CONHG—SERIALSAMSUNG--cONSoLfi
if【”¥CONFlG SEmAL4480”=”y”】;th即
14
E
第二章ucLj呱及其开发环境的建立
b00l’ Suppon丘
for衄AonmDA AMSU_NGscdalS锄s咖gpon.∞mG-SERIALSfi
第十一步:在舳ux.2.4.mer/ch删blakc丘Ie文件中添加如下代码: S职IALscIia∽b0.o
第十二步:在恤Ilx.2,4.圳ri蚴耐目录下新建seIjaIobj_¥(CoNFIG44BoX)+l44b0.c。
第十三步:uCⅡnIl】【一2.4.】【,i∽lude协m.m∞mⅫ】,下,新建arch.44b咴文件夹,拷贝相应
arch.mi∞tek下的所有文件。
第十四步:在uCIjnⅡ.2.4.妇dude加m_amn∞1m昨roc?mnv,systcnh中添加如下代码:
椭唰ef ARMARCH4
(原码)
制觚∞vec自嗌_b懿e0 ((cr-alignment&CR
#else
V)?眈Ⅲ蝴:0)
衔fdefCONFIG ARcH“BOx(新增代码)
珧e
#defineVec咖sba∞O
似0c000000)
蜘efinevocto巧b鹤e0 (o)
托ndif
艳ndif
这样,修改完内核源码后再按照2.3.2节中第三步开始,从新配置编译,然后生成uCLinux
版本就可以在44Box上正确运行了。
15
东南大学硕士学位论文
i n第三章uCLux源码及程序的开发
3.1 ucLinux源码结构
目前。uCLinux往往基于两个1inux内核版本,2.0.38是一个比较成熟的版本,2.4.x是最新的 版本。一般ucLinux的内核大小在500k左右,如果加上一些基本的应用,也就在900k左右。
3.1.1源码功能模块的介绍
uCLinux架构如图3.1所示:
图3.1
uCLinux架构
下面是一些重要的模块的描述:
elector初 (1)(启动过程)Bootstrap:B00tstrap负责用来起动ucLinIl】【内核,包括chip s始化,系统堆栈的初始化,把压缩的Linux映像从Flash中解压到R删中,并把控制权交给内核的 初始化例程。这部分工作是与你的硬件高度相关的,所以这部分的代码要尽量精简。
(2)内核初始化(Kernel Initialization):内核初始化的入口地址是:start_kernel(在 init/main.c中), 它初始化内核的其它部分,包括异常(trap)、中断(IRQ)、内存页(Page)、 调度(Scheduling)、驱动程序等等。并启动“init”进程进入多任务环境。
一(3)系统调用处理/异常处理:当“init”程序运行后,内核对整个系统的运行不再进行直接 控制,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,例如:程序错误,硬
件中断等。用户程序如果想得到系统资源,必须通过系统调用。当用户进程发生中断后.内核获得控
制权,取得系统调用的参数,并调用相应的处理程序,而用户一直被挂起,直到内核完成处理并返 回。在A脚中.系统调用采用趼i指令所产生的软件异常来实现。
(4)驱动程序(Device Driver):驱动程序是整个ucLinux内核的主要组成部分,它们控制着 操作系统和外部设备的交互。例如,串口驱动程序处理由外部uART发生中断。Lin“的驱动程序是 可选的, 但是典型的系统应该包括一个控制台(console),一个通用串口驱动程序.一个块设备驱 动程序(用来存放根文件系统)。当Linux内核起动的时候,需要一个输出调试信息的设备。这个设 备往往通过串口来实现。这个调试终端可以通过Mgister-cons01e这个函数来创建。而所有的调
16