摘 要:本文描述了将Clinux移植到基于MIPS R3K处理器的目标板上的方法和过程,说明了如何搭建移植环境,并着重讨论了移植中需要注意的问题。
关键词:Clinux;MIPS;移植;ROMFS;BootLoader
引言
Clinux是标准Linux的一个分支www.cechina.cn,它继承了Linux的大部分优点,并能够实现对没有MMU的处理器的支持,所以被广泛地应用于嵌入式领域。本文将其移植到了基于MIPS R3K处理器的目标板上,处理器的工作频率为100MHz。目标板上的其它主要资源还包括:2个串口(16550A),波特率9600;网卡(RTL8019AS);512K ROM(AM29F040),以及64M SDRAM。开发板与主机的连接如图1所示。
图1 开发板与主机的连接示意图
Clinux的移植
交叉编译环境的建立
嵌入式开发环境一般由宿主PC和目标系统构成。宿主PC上先要建立开发编译工具,如binutils、gcc、glibc等。目
BootLoader的设计
BootLoader的作用类似于PC中的BIOS,它在系统启动时对硬件进行初始化操作,负责与宿主PC建立连接并引导操作系统启动。它必须被固化在目标板上,当系统启动时, MIPS处理器的CPU会从0xbfc0 0000中取出第一条指令执行,而虚拟地址0xbfc0 0000对应的物理地址就是ROM的起始地址00000,所以只需要把BootLoader程序烧写在ROM上就可以了。
在BootLoader中,首先要设置CPU的工作状态www.cechina.cn,包括Little Endian方式、使用CPU的ICache(16KB, 32/line)、DCache(8KB, 16/line)等,并设置异常及中断向量表。针对CPU的BEV位,异常有不同的入口地址。BEV=0主要用于当CPU的Cache、SDRAM初始化后,如果系统发生异常和中断时,其异常、中断入口地址可以通过Cache来访问,这样就加快了响应时间。在Clinux中操作系统的异常和中断处理的入口地址也要遵循这样的方式。
memcpy((void *)(KSEG0 + 0x80), &except_vec1_generic, 0x80);
memcpy((void *)(KSEG0 + 0x100), &except_vec2_generic, 0x80);
memcpy((void *)(KSEG0 + 0x180), &except_vec3_generic, 0x80);
其次控制工程网版权所有,因为C代码中的变量(register类型除外)在调用函数时使用的堆栈指针SP等都需要使用可读写的存储介质SDRAM,因此需要对SDRAM进行初始化。在初始化SDRAM之前的代码都必须用汇编语言编写,初始化完成之后,就可以使用C语言来编写目标板上其他设备的相应初始化程序了。
最后,对串口、网络控制芯片进行初始化,然后等待宿主PC上发出命令进行相应的操作。
宿主PC编译好内核代码后,即会通过串口发出命令通知目标板准备接收www.cechina.cn,目标板在收到命令后就准备接收主机发送的数据,并将接收到的数据放到SDRAM相应的位置上。数据通过网络传输,传输协议使用的是TFTP协议。宿主PC上通过串口发送命令tftp 192.168.1.231 PUT d: \uClinux\linux,其中的192.168.1.231是目标板的IP地址,linux是编译生成的二进制文件。
内核代码的修改
由于不同的目标板上使用的CPU不同,所具有的板上设备也不同,因此,内核代码需要作一定的修改CONTROL ENGINEERING China版权所有,改动主要集中在对异常、中断号,及其入口地址及设备地址的修改上。
首先,建立针对自己目标板的目录:D:\uc-linux\linux-2.4.19\arch\mipsnommu\r3k、
D:\uc-linux\linux-2.4.19\include\asm-mipsnommu\r3k,并放入目标板的相应代码。同时要修改
Makefile,将这两个目录里的文件编译进内核,去掉不必要的针对其他目标板、处理器目录的编译。
在D:\uc-linux\lin