基于MIPS32平台的Linux操作系统移植

发布者:breakthrough3最新更新时间:2011-07-11 关键字:MIPS32平台  Linux  操作系统移植 手机看文章 扫描二维码
随时随地手机看文章

  引 言

  目前,Linux作为仅次于微软Windows的操作系统已经在PC和嵌入式领域得到了广泛应用。尤其是在嵌入式开发领域,由于Linux操作系统具有成本低、可靠性高,源码开放等显著的优点,已经成为受众多嵌入式开发者青睐的操作系统之一。目前,Linux操作系统所支持的包括X86、ARM、MIPS、MIPS64、Sun SPARC、POWER PC、MOtorola 68k、IBM S/390、A1pha、IA64、cris、parisc、sh等主要的体系结构。本文以实际项目中一个MIPS32构架的CPU和板级系统为例,阐述如何将Linux操作系统移植到目标平台上。

  1 目标平台概述

  本文所讨论的开发平台采用的CPU是同济大学微电子中心自主开发的BC320处理器,采用MIPS 4KC的体系结构,带MMU、无浮点协处理器、标准5段流水线,指令及数据Cache的大小各为4 KB。寻址空间为4GB,其中0x00000000~0X7fffffff为用户空间,0x80000000~0xffffffff为核心空间。板级系统采用了PMC的PM8172芯片组,支持最高128 MB的SDRAM。BOOT ROM的地址空问是0xlfc00000~0xlfffffff。

  2 Linux交叉编译环境的建立及内核配置和编译

  在进行实际的Linux操作系统移植之前,需要在宿主机上建立图1所示的MIPS的交叉编译环境,以便能在普通PC机上通过交叉编译工具来调试运行在目标开发板上的程序。

  建立MIPS交叉编译环境的主要工具有binutils、GCC、glibc以及作为调试器的gdb等。其中binutils为二进制文件的处理工具,它主要包括一些辅助开发工具。例如:readelf可显示elf文件信息及段信息;nm可列出程序的符号表;strip将不必要的代码去掉以减小可执行文件;objdump可用来显示反汇编代码等。GCC是GNU提供的支持多种输入高级语言与多种输出机器码的编译器,是Linux操作系统的配套编译器,支持Linux所采用的扩展C语言。glibc是链接和运行库,由于此链接和运行库须运行在目标开发板上,所以必须用先前建立的交叉编译器对其进行编译。如对内核大小要求较为苛刻,还可以使用uclibc等其他链接和运行库作为g1ibc的替代品。此外,若不是从硬盘启动,则还须为Linux制作ramdisk。在ramdisk上,除了要安放/dev(放置Linux操作系统所需要的设备文件)、/etc(放置Linux系统配置文件)、/lib(放置交叉编译后生成的库文件)等目录及其下的文件外,还需要在/bin和/sbin下放置备种系统必需的命令程序,如shell、init、vi等。为此需要busybox或者tinylogin等专为Linux操作系统提供的标准工具程序。凡此种种,都可以在GNU旗下的网站下载并自由修改其源代码。

基于MIPS32平台的Linux操作系统移植

  由于Linux操作系统的内核源代码支持各种不同的体系结构和不同的应用需要,所以在使用交叉编译器编译前还需要进行内核的配置工作,包括选择处理器的体系结构、文件系统的种类、板级支持、对设备驱动的支持以及是否使用ramdisk等。配置工具包括make config、makemenuconfig、make xconfig,推荐使用操作界面更为良好的make menuconfig及make xconfig。在内核配置工作完成后即可进行内核编译工作。Linux源代码提供的强大的makefile功能,使得复杂的编译过程操作起来并不困难。[page]

  关于Linux交叉编译环境的建立及内核配置和编译的详细流程,在《Building Embedded Linux Systems》(KarimYaghmour著)内有详细的论述,本文对此不再赘述。

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

  随着软件可移植性问题在整个软件方法学中重要性的日益增长,各种大型软件无不把提高自身的跨平台性作为软件设计的主要目标之一,为此.Linux提供了对应用领域内各大主流体系结构的支持。仅以MIPS体系结构为例,Linux操作系统2.4.26版本的内核就支持几乎所有32位和64位不同版本的MIPS架构,为操作系统的移植工作提供了巨大的便利。然而,出于种种原因(诸如专利保护或特殊应用),有相当一部分采用MIPS体系结构的芯片产品只提供了标准MIPS指令集的一个子集。一旦内核代码在编译完成后生成了不属于实际指令集的指令,CPU将发生保留指令例外。可以说,当体系结构问的差异不再成为最主要的移植工作时,如何逻辑等效地消除实际指令集和标准指令集问的差异成了Linux移植工作中最重要的一环。由于MIPS的专利保护,相当多MIPS兼容芯片的开发者并末对指令集中的4条非对齐存取指令(1wl、1wr、swl、swr)加以实现,如Rcaltek RTL8181”Wireless LAN Access Point/Gateway Controller”等。下文将以同济大学自主开发的BC320芯片为例,从修改内核源代码、修改编译器及汇编器这两个方面出发,讨论如何解决4条非对齐存取指令未被实现的问题。由于编译器及汇编器的修改涉及编译原理方面的知识,不在本文范围之内,所以将把重点放在讨论修改内核源代码的方法上,对GCC和GAS修改的基本知识仅作一般介绍。

  3.1 修改内核源代码中的保留指令例外处理程序

  当CPU执行到未被实现的机器码时,将会发生

  reserved instruction exception,然后根据例外的种类跳转到相应的例外处理程序入口处。借助于编写对应的例外处理程序,可以为未被实际指令集实现但又属于标准指令集的指令(以1wl、1wr、swl、swr为例)提供逻辑等效的替换方法。在Linux内核源(以2.4.26版本为例)代码的目录树下进入.\arch\mips\kernal目录,打开traps.c文件,并添加simulate_lxRI函数,代码如下:

基于MIPS32平台的Linux操作系统移植

  其中:_OP_为宏操作,可取出32位机器码中的操作码以判断操作类型;Ox22对应于1wl指令、0x26对应于1wr指令,0x2A对应于swl指令,而0x2E则对应于swr指令。程序将根据不同的操作码进入不同的替代程序。va和byte变量则计算出4条非对齐指令的偏移量。

  完成代码后将此函数添加到同一文件的do_ri函数中去,此函数即负责处理Linux操作系统的保留指令例外。添加的代码为:

基于MIPS32平台的Linux操作系统移植

  即当simulate——lxRI正确处理完非对齐存取指令并返回1后,系统将通过compute_returrn_epc函数把epc寄存器的值放回pc寄存器并返回;否则,继续处理do_ri中其他的例外处理程序。

  这一方法工作量小,容易保证修改后的等效性,对大多数熟悉C语肓的程序员来说都是易于掌握的。在软硬件协同开发的系统设计前期具有很大的实际使用价值。系统设计师可快速建立原型机跑通操作系统,以验证软硬件的正确性。但由于其采用的是例外处理的方式,若频繁发生例外则将影响系统性能,所以对memcpy(此函数代码在Linux源代码的arch\mips\lib目录下的memcpy.s文件中)这样使用频繁的汇编程序应手工修改其代码。再加上编译器一般不会生成4条非对齐指令(仅当C程序中的结构体有非字对齐等少数情况下会出现),所以此修改方法可保证能大致接近原性能。[page]

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

  尽管利用cxception handlcr来解决保留指令例外问题方便、快捷,但其效率终究是低于直接修改GCC编译器或GAS汇编器的。此外,修改exception handler的方法在smp的情况下有可能带来冲突;所以,直接修改GCC或GAS的方法是有其实用价值的。

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

基于MIPS32平台的Linux操作系统移植

  其中负责指令生成的部分在后端,涉及的源代码文件包括inst-emit.c、ilast-flags.h、inst-config.h、inst-code.h、inst-extrax.h、inst-opinit.c、inst-output.c等。此外,作为机器描述的machine.h、maclline.md、machine.h文件也必须加以考虑,相当一部分以inst开头的文件是由GCC提供的一组gcn*工具根据这3个机器描述文件自动生成的。

  修改GAS相对简单,只须修改GAS源代码中的tc-mips.c文件,但效率相对低于修改GCC源代码。

  直接修改GCC编译器的效率高且一劳永逸,但由于编译器的实现原理和操作系统大相径庭,所以此方法难度较大,可能会拖延移植工作进度;而编译器修改后其本身的测试工作由于要和Linux操作系统的移植工作混合在一起进行,对软件Debug来说也是相当复杂的。所以,在系统开发早期推荐使用修改保留指令例外处理程序的方法,当软硬件都能保证相当的正确性时再使用修改GCC编译器的方法。

  结 语

  本文根据一个特定的开发平台,介绍了如何将Linux操作系统移植到MIPS体系结构系统上的大致流程和主要技术;就移植过程中所遇到的实际问题,以4条非对齐指令为例,具体讨论了如何解决实际实现的指令集未能完全覆盖标准指令集而产生保留指令例外的问题。文中详细介绍了修改保留指令例外处理程序的方法,简述了修改GCC或GAS的方法。掌握这些移植流程和修改技术,对于开发嵌入式系统有相当的实用价值,对于由其他体系结构实现的开发平台也具有相当的参考意义。

 

关键字:MIPS32平台  Linux  操作系统移植 引用地址:基于MIPS32平台的Linux操作系统移植

上一篇:基于ARM LPC2132的智能电动机保护器设计
下一篇:便携式远程心电监护仪的原理与设计实例

推荐阅读最新更新时间:2024-03-16 12:38

Linux下ColdFire片内SRAM的应用程序优化设计
  本文以MP3解码器为例,介绍了一种在嵌入式Linux系统下配置使用处理器片内SRAM的应用方案,有效提高了代码的解码效率,降低了执行功耗。该方案不论在性能还是成本上都得到了很大改善。    1 硬件平台和软件架构   硬件平台采用Freescale公司的MCF5329EVB开发板。终端硬件包括ColdFire5329处理器、32 KB的片内SRAM、1 800×600矩阵LCD显示屏、9×3阵列矩阵键盘、I2S音频解码芯片、64 MB的SDRAM、10/100M以太网接口,以及3个UART接口。软件构架如图1所示,主要包括MP3解码器、音频驱动、键盘驱动和用户图形界面(GUI)等模块。采用μClinux作为操作系统。μ
[嵌入式]
基于ARM的嵌入式Linux应用程序开发研究
  1 背景与价值一减少用户“阶段0”的开发   随着嵌入式行业的发展,嵌入式的功能越来越复杂,嵌入式硬件从最初的SCU(Single Chip Microcomputer,只含CPU,无RAM、ROM),MCU(Micro Controller Unit)到现在广泛应用的SoC系统,嵌入式硬件经历了几次比较大的变革。伴随着嵌入式硬件性能的提升,嵌入式软件也由最初的前后台程序发展到使用小型操作系统(如RTX51、μC/OS—II等);再到现在,各种大型操作系统在嵌入式系统中的应用随处可见,像Linux、WinCE、Vx—works等。然而要开发一个大型操作系统下的嵌入式系统,首先要对操作系统进行移植,而对于现在的一些大型操作系统
[单片机]
基于ARM的嵌入式<font color='red'>Linux</font>应用程序开发研究
在TQ2440实验板上进行linux+qtopia++ov9650+opencv的图像处理系统
项目关键的地方主要是能够在ARM9(TQ2440)上根据所采集(OV9650)的图像和我预先给的模板,来判断图像中是否有我给的模板的内容在,有的话框出来。其实这个我在Windows下,最常用的就是两个函数:cvMatchShapes(速度慢)和cvMatchTemplate(速度快)。但是由于这次的项目小车是运动的,所以目标相对小车,它的大小是变化的,但是形状不会变。还有我们使用两个摄像头(这也是我们项目的创新点),对目标进行多角度的匹配。使用Opencv的函数来进行模式识别,在Windows平台上基本基本没有什么值得考虑的地方,但是在嵌入式平台上,一定的考虑处理器的速度问题。像现在我们arm9的频率在500M左右,我以前在Win
[单片机]
在TQ2440实验板上进行<font color='red'>linux</font>+qtopia++ov9650+opencv的图像处理系统
linux-2.6.38到tiny6410的移植手册(连载2)__网卡&NFS
上次的nand flash移植 linux-2.6.38到tiny6410的移植手册(连载1)见 http://www.arm9home.net/read.php?tid-14196.html 今天做的是dm9000网卡移植,和nfs文件系统的搭建 1、vi include/linux/dm9000.h 28行增加 unsigned char param_addr ; 2、vi arch/arm/mach-s3c64xx/mach-mini6410.c 为方便起见,将他的网卡结构体注释掉 #if 0 static struct resource mini6410_dm9k_resource = { = {
[单片机]
<font color='red'>linux</font>-2.6.38到tiny6410的移植手册(连载2)__网卡&NFS
嵌入式Linux操作系统的驱动程序开发要点
在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。 字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。 每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是
[嵌入式]
C语言中##的用法
今天看linux操作系统源码是有这么一段: #define _syscall0(type,name) \ type name(void) \ { \ long __res; \ __asm__ volatile ( int $0x80 \ // 调用系统中断0x80。 : =a (__res) \ // 返回值??eax(__res)。 :
[单片机]
基于Linux的动态电源管理:使嵌入式设备更节能
  为了在产品众多、竞争激烈的市场上使产品与众不同,手持设备的制造商们往往把电池寿命和电源管理作为手机、PDA、多媒体播放器、游戏机、其它便携式消费类设备等产品的关键卖点来考虑。用户是从电池寿命这方面来看待电源管理的成效,其实它是多种因素共同作用的结果,这些因素包括 CPU 功能、系统软件、中间件,以及使用户可以在更长的充电或更换电池的间隔时间内享用各自设备的策略。    电源管理范围   任何拥有笔记本电脑的人都会感觉到,他们的这种便携式设备依靠电池运行时,与依靠交流电(主电源)运行对比,行为表现不一样,屏幕变暗了,处理器时钟变慢了,并且系统只要有可能,就会转入待机或睡眠状态。   另外,PDA 的拥有者们还发现,在设备停用一
[电源管理]
基于<font color='red'>Linux</font>的动态电源管理:使嵌入式设备更节能
现场总线的开关量I/O模块设计:操作系统移植与驱动开发
5.1常用的嵌入式操作系统 当前常见的嵌入式操作系统主要有嵌入式Linux、Windows CE及VxWorks,在各个领域得到广泛应用,具有各自的特性与优势: ①从系统性能比较 Linux是一个成熟而稳定的网络操作系统,为嵌入式操作系统提供了一个极有吸引力的选择,它是个和Unix相似、以核心为基础的、完全内存保护、多任务、多进程的操作系统,支持广泛的计算机硬件,包括X86 ,Alpha、MIPS、PPC、ARM、NEC、MOTOROLA等现有的大部分芯片,可以定制,其系统内核最小只有约134K B,在信息家电、工控等领域有广泛应用。 WinCE是一个软实时系统,具有模块化、结构化和基于Win32应用程序接口和与处
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved