位置:51电子网 » 技术资料 » 嵌入式系统

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

发布时间:2008/5/27 0:00:00 访问次数:398

引言

目前,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修改的基本知识仅作一般介绍。

引言

目前,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修改的基本知识仅作一般介绍。

相关IC型号
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!