综合资讯 在线阅读 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

嵌入式系统  单片机  D S P  EDA/PLD  接口电路  存储技术  显示光电  电源技术
传感/控制  模拟技术  通信网络  无线通信  电测仪表  消费电子  汽车电子

所在的位置:首页技术文章消费电子正文
 
Clinux在MIPS上的移植
发布日期:2005-12-12 作者:马草飞 来源:电子设计应用

摘    要:本文描述了将Clinux移植到基于MIPS R3K处理器的目标板上的方法和过程,说明了如何搭建移植环境,并着重讨论了移植中需要注意的问题。
关键词:Clinux;MIPS;移植;ROMFS;BootLoader
引言
Clinux是标准Linux的一个分支,它继承了Linux的大部分优点,并能够实现对没有MMU的处理器的支持,所以被广泛地应用于嵌入式领域。本文将其移植到了基于MIPS R3K处理器的目标板上,处理器的工作频率为100MHz。目标板上的其它主要资源还包括:2个串口(16550A),波特率9600;网卡(RTL8019AS);512K ROM(AM29F040),以及64M SDRAM。开发板与主机的连接如图1所示。


图1  开发板与主机的连接示意图

Clinux的移植
交叉编译环境的建立
嵌入式开发环境一般由宿主PC和目标系统构成。宿主PC上先要建立开发编译工具,如binutils、gcc、glibc等。目标板是运行和调试的平台。宿主PC和目标板利用网络和串口建立连接,系统在目标板上运行时通过串口来反馈信息,并在宿主PC的超级终端上显示出来。
BootLoader的设计
BootLoader的作用类似于PC中的BIOS,它在系统启动时对硬件进行初始化操作,负责与宿主PC建立连接并引导操作系统启动。它必须被固化在目标板上,当系统启动时, MIPS处理器的CPU会从0xbfc0 0000中取出第一条指令执行,而虚拟地址0xbfc0 0000对应的物理地址就是ROM的起始地址00000,所以只需要把BootLoader程序烧写在ROM上就可以了。
在BootLoader中,首先要设置CPU的工作状态,包括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编译好内核代码后,即会通过串口发出命令通知目标板准备接收,目标板在收到命令后就准备接收主机发送的数据,并将接收到的数据放到SDRAM相应的位置上。数据通过网络传输,传输协议使用的是TFTP协议。宿主PC上通过串口发送命令tftp 192.168.1.231 PUT d: \uClinux\linux,其中的192.168.1.231是目标板的IP地址,linux是编译生成的二进制文件。
内核代码的修改
由于不同的目标板上使用的CPU不同,所具有的板上设备也不同,因此,内核代码需要作一定的修改,改动主要集中在对异常、中断号,及其入口地址及设备地址的修改上。
首先,建立针对自己目标板的目录: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\linux-2.4.19\arch\mipsnommu\r3k目录下,创建两个子文件夹comm和osprey。在r3k\comm目录下,主要存放以下文件:
int_handler.S、irq.c:针对MIP R3K处理器进行中断初始化和检测操作;
serial.c:针对目标板串口进行波特率设置,中断号及地址分配;
time.c:针对目标板的RTC进行初始化设置。
在r3k\osprey目录下主要存放以下文件:
prom.c,setup.c:进行目标板的初始化设置,包括串口、时间系统的一些初始化工作。
在D:\uc-linux\linux-2.4.19\include\asm-mipsnommu\r3k目录下主要有两个头文件:
irq.h:包括CPU的一些中断号的宏定义;
r3k.h:包括目标板上一些设备的中断号的宏定义,例如串口。
其次,要小心地修改操作系统的时钟中断(Timer Interrupt),否则移植的系统可能会永远停止在BogusMIPS calibration阶段,这是因为操作系统的“脉搏”jiffies的更新是在时钟中断里进行的。时钟中断的产生方式可以根据不同的目标系统而变化。对于MIPS R3K处理器,直接使用它的内部定时器,在CP0的STATUS寄存器中设置中断号,为IP7,需要修改的寄存器包括CP0的COMPARE和COUNT。此外也可以使用RTC来获得时钟中断,其中断号及中断允许位的设置根据目标板而异。涉及到的代码包括:D:\uc-linux\linux-2.4.19\arch\mipsnommu\r3k\common\ int_handler.S、D:\uc-linux\linux-2.4.19\arch\mipsnommu\r3k\common\ time.c、D:\uc-linux\linux-2.4.19\arch\mipsnommu\kernel\time.c。
然后,完成对串口的修改。串口在操作系统的移植在系统调试的过程中扮演了比较重要的角色。在系统运行的初期,它主要用于反馈调试信息。在作为控制台初始化后,它又起着和操作系统交互通信的作用。可是,在对控制台进行初始化以前,打印的调试信息都不能显示出来,这样不便于调试控制台初始化以前的程序。
要解决这个问题有几种方法,例如可以在D:\uc-linux\linux-2.4.19\kernel\printk.c中的printk()函数中添加目标板上串口的打印函数。另外,由于使用的目标板有两个串口,所以可以用串口1与操作系统通信,而串口2作为专用的调试信息输出口。这样的好处还包括可以将调试信息与操作系统的信息分开显示,避免超级终端显示混乱。要注意的是在利用串口显示调试信息时,串口工作在查询方式;而操作系统使用串口作为控制台工作时,串口工作在中断方式。串口工作在中断方式时,需要在CPU的STATUS寄存器和其他中断控制机制中打开相应的中断允许位,否则CPU不能接收到串口发出的中断请求信息。如果不能调试好串口的驱动程序,最后在超级终端上就看不到操作系统给出的信息。相关代码主要在D:\uc-linux\linux-2.4.19\ drivers\char\serial.c中。
最后,由于使用的是ROMFS文件系统,并已将内核代码和文件系统镜像编译到一个二进制文件中,因此,在操作系统运行后,需要告诉操作系统文件系统的地址,否则就会出现不能加载文件系统的错误。文件系统地址可以在D:\uc-linux\linux-2.4.19\arch\mipsnommu\ kernel的setup.c文件里直接指定。

编译内核
在完成对Makefile的少量修改后就可以编译内核了,主要步骤包括:
Make menuconfig:其中包括选择使用的CPU及目标板,串口的使用等;
Make dep:检查代码的完整性和依存关系;
Make:包括编译内核,生成ROMFS镜像文件。
  
下载二进制镜像文件
在宿主PC上发出TFTP命令,在目标板上利用BootLoader接收数据,并将代码和ROMFS文件系统依次放置到相应的地址。BootLoader在完成这些工作后会将控制权交给Clinux系统,然后操作系统开始启动。在完成对目标板设备的初始化、中断的建立以及文件系统的加载后,系统执行/bin/init,最后出现一个等待输入命令的提示符#。这样,也就完成了对Clinux的移植工作。

结语
本文讨论了Clinux在MIPS R3K处理器上的移植过程和关键技术,并简要介绍了BootLoader的设计,以及串口在移植中的运用。■

参考文献
1 毛德操,胡希明. Linux内核源代码情景分析[M]. 杭州:浙江大学出版社, 2001
2 陈莉君. Linux操作系统内核分析[M]. 北京:人民邮电出版社, 2000
3 赵炯. Linux内核完全注释. 北京:机械工业出版社, 2004
4 Gerry Kane, Joe Heinrich. MIPS RISC ARCHITECTURE [M]. Prientice Hall PTR, 2000


 (全文结束)

信息发布:   转引自: 【 】 【打印】 【关闭
 相 关 文 章
基于NIOS 软核处理器的uClinux的移植 (10-22)
μClinux在S3C4510B上的移植 (08-17)
U-BOOT的启动流程及移植 (12-23)
64位MIPS指令处理器的流水线设计 (09-11)
ARM系统设计及其USB主机扩展方案 (07-08)
嵌入式数字存储示波器 (07-08)
AVR和TMS320VC5402的HPI接口通信设计 (12-22)
Blob在S3C44B0上的移植 (11-26)
核数据采集系统中的100Mbps以太网控制模块 (01-22)
利用Flash实现DSP对多个程序有选择的加载 (01-04)
用U-BOOT构建嵌入式系统的引导装载程序 (02-25)
NIOS软核处理器的Linux引导程序U-boot设计 (03-24)
基于ARM的嵌入式系统Bootloader启动流程分析 (11-21)
在PIC18单片机中使用BootLoader (11-11)
基于ARM-μCLinux嵌入式系统启动引导的实现 (08-23)
μClinux下实时任务的一种实现方法 (09-02)
基于UCL INUX的嵌入工式系统设计 (11-16)
嵌入式OS-uClinux软件开发环境的建立及应用程序开发模式 (11-03)
ARM嵌入式系统软件实时时钟的设计 (11-21)
uClinux 平台下的Flash存储技术 (11-30)
μC/OS的应用和扩展 (12-17)
在嵌入式Linux上实现JFFS文件系统 (11-03)
基于uCLinux的嵌入式通讯的设计 (10-31)
μClinux下基于MiniGUI的监控终端的实现 (10-11)
WLAN协议测试与网络监测系统 (09-18)
基于ARM的μCLinux启动引导实现的分析 (10-16)
嵌入式uCLinux内核启动过程分析与设计 (10-17)
基于嵌入式Linux的图形界面显示系统的设计 (10-23)
基于ARM与μClinux的RTU设计 (04-03)
关于我们 ┋ 友情链接


深圳市福田区海滨广场恒福花园恒华阁11F
电话:0755-88305872 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号