linux系统移植(精选十篇)
linux系统移植 篇1
当今社会,嵌入式系统已经广泛渗透到人们工作、生活的各个领域。嵌入式Linux操作系统在嵌入式领域中蓬勃发展,它不仅继承了Linux的源码开放、内核稳定高效的特点,同时还具有支持多种处理器架构、空间小、成本低廉等优势。嵌入式Linux是一个高起点的技术领域,需要开发人员精通计算机体系架构和操作系统原理,并具有一定的硬件知识。本文通过探讨基于SEP4020处理器的嵌入式Linux系统移植,描述了移植Linux操作系统的关键技术。
1 软硬件平台
1.1 SEP4020嵌入式处理器
本文所述系统移植基于SEP4020嵌入式微处理器,SEP4020是由东南大学国家专用集成电路系统工程技术研究中心设计的一款处理器,采用0.18μm标准CMOS的工艺设计,内嵌ASIX CORE(32位RISC内核,兼容ARM720T,带8 kB指令数据Cache和全功能MMU)。SEP4020芯片中集成各种功能,包括:
·8/16位SRAM/NOR FALSH接口,16位SDRAM接口
·硬件NAND FLASH控制器,支持NAND FLASH自启动
·10M/100M自适应以太网MAC,支持RMII接口
·64k Byte高速片上SRAM
·支持IIS音频接口
·支持MMC/SD卡
·LCD控制器,支持TFT彩屏和STN黑白、灰度屏
·RTC,支持日历功能/WatchDog,支持后备电源
·10通道TIMER,支持捕获、外部时钟驱动和MATCH OUT
·4通道PWM,支持高速GPIO
·4通道UART,均支持红外
·USB1.1 Device,全速11Mb/s
·2通道SSI,支持SPI和Microwire协议
·2通道SmartCard接口,兼容ISO7816协议
·支持最多91个GPIO,14个外部中断
·支持外部DMA传输
·片上DPLL,支持多种功耗模式,IDLE、SLOW、NORMAL、SLEEP
1.2 Linux操作系统概述
Linux操作系统是一套免费使用和自由传播的类Unix操作系统。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。Linux的出现,最早开始于一位名叫Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。他的目的是想设计一个代替Minix(是由一位名叫Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,因而开始了Linux雏形的设计。绝大多数基于Linux内核的的操作系统使用了大量的GNU软件,包括了shell程序、工具、程序库、编译器及工具,还有许多其他程序,例如Emacs。正因为如此,GNU计划的开创者理查德o马修o斯托曼博士提议将Linux操作系统改名为GNU/Linux。但有些人只把操作系统叫做"Linux"。
1.3 嵌入式Linux操作系统
软件平台采用Linux,版本号为2.6.26。Linux是当今最流行的操作系统之一,由于其源码开放性,现代操作系统设计的新思想和新技术能够不断运用于其中,是一个非常好的学习平台。其次,Linux操作系统占用资源较少,对处理器要求低,可运行于大多数含MMU的处理器上,并且特别适合嵌入式领域。SEP4020处理器运行频率为88MHz,拥有MMU单元,因此我们选择Linux操作系统作为其软件平台。此外,Linux平台具有完善的设备框架,基于设备框架编写相应的驱动程序可以大幅简化开发难度,缩短开发时间。
2 SEP4020 Linux核心驱动设计
2.1 linux2.6.26文件组织结构
·arch:arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录,PC机一般都基于此目录。
·include:include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,与intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录。
·init:这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。
·mm:这个目录包括所有独立于cpu体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c。
·kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中。
·drivers:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block。
2.2 SEP4020处理器核心驱动
arch目录下的mach-sep4020子目录中包含了SEP4020处理器运行Linux操作系统的一些核心驱动代码,组织如下:
·Irq.c:中断操作函数,包括开中断、关中断、中断初始化,并将中断注册到系统中去,使用了一个结构体irqchip。
·mm.c:将Linux移植到目标电路板的过程中,通常会建立外设I/O内存物理地址到虚拟地址的静态映射,这个映射通过在电路板对应的map_desc结构体数组中添加新的成员来完成。此后,在设备驱动中访问经过map_desc数组映射后的I/O内存时,直接在map_desc中该段的虚拟地址上加上相应的偏移。
·timer.c:是对系统的定时器进行一些配置,如timer来中断后的中断处理函数,timer的初始化,再把这些函数注册到结构体sys_timer。
·4020.c:主要是对板子的信息进行配置,包括物理IO地址,io偏移,mach_type,并将timer,mm中的io映射函数,irq注册进内核。由于SEP4020芯片的UART设计是兼容8250的,因此在这里并没有在drivers中单独写串口驱动,而是利用内核自带的8250串口底层驱动文件,通过配置uart的一些信息,注册进去即可。
2.3 SEP4020处理器组织架构
include目录下主要包含了一些SEP4020处理器的硬件架构定义文件:
·Hardware.h:SEP4020所有寄存器的定义和说明(包括物理地址和虚拟地址)。
·Irqs.h:SEP4020的所有中断源。
·Memory.h:是对io虚拟地址到物理地址,虚拟地址到page frame的一些实现函数。
·Entry-macro.s:这个文件中的宏查询ISPR(IRQ待定中断服务寄存器,当有需要处理的中断时,这个寄存器的相应位会置位,任意时刻,最多一个位会置位),计算出的中断号放在irqnr指定的寄存器中;这个宏在不同的ARM芯片上是不一样的。
3 SEP4020 Linux外设驱动设计
3.1 Linux外设驱动开发简介
在操作系统里,对用户而言,设备驱动程序隐藏了设备的具体细节。对于各种不同的设备,如调制解调器,USB扫描仪,打印机等,从用户的角度看,它们都是特殊化的文件,以同样的Read,Write等操作,完成对不同设备的访问。而驱动程序在特殊的设备和一般的用户间起了桥梁作用。用户进程的下层是设备无关的软件,在Linux中设备无关软件的大部分功能,由文件系统去完成,执行适用于所有设备的常用I/O功能,向用户进程提供一个统一的接口。当用户进程发出I/O请求时,Linux把请求的处理权限放在文件系统,文件系统通过设备驱动程序提供的接口再把任务下放到驱动程序,驱动程序根据需要对设备控制器进行操作,设备控制器再去控制设备自身。这样通过逐层隔离,Linux对用户进程基本上屏蔽掉了设备的各种硬件特性。
在Linux中,设备驱动程序应完成的主要功能为:
·对设备进行初始化;
·设备使用完成后对设备进行相应清理工作;
·从设备接收数据并将之送回内核;
·将数据从内核传送至设备;
·检测和处理设备出现的错误。
通常Linux驱动程序接口分为如下四层:
·应用程序进程与内核的接口;
·内核与文件系统的接口;
·文件系统与设备驱动程序的接口;
·设备驱动程序与硬件设备的接口。
3.2 SEP4020硬件驱动列表
目前已经完成开发的SEP4020外设驱动名称及对应文件路径见表1。
下载地址:source.armfans.net
4 总结
本文介绍了针对SEP4020的嵌入式Linux2.6.26操作系统移植。移植Linux操作系统主要包括两个部分,处理器核心驱动和周边外设驱动,本文对这两方面都做了探讨。一个移植好的嵌入式Linux操作系统应具有完善的网络、多媒体、工业控制等诸多功能。经过实践证明,运行在SEP4020处理器上的嵌入式Linux操作系统功能丰富,完全可以满足用户所提出的各种应用需求。
摘要:本文论述了Linux操作系统在SEP4020处理器上的移植过程。Linux操作系统是一个源代码开放、精简和高效的操作系统,适合在嵌入式处理器上进行移植和运行。整个移植过程可以分为SEP4020处理器核心驱动设计和硬件周边设备驱动设计,本文分两节分别论述了这两个部分,并最终实现了SEP4020处理器在Linux2.6.26平台的移植。
关键词:Linux 2.6.26,SEP4020
参考文献
[1]冯国进.嵌入式Linux驱动程序设计从入门到精通[M].北京:清华大学出版社,2008,3.
[2]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008,8.
[3]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008,2.
linux系统移植 篇2
你想要从Windows转换到Linux上去吗? 好的, 就像其他已经走过这一步的用户和企业一样,你可能也是出于Linux的稳定性和开源标准的可靠性而转换系统。 现在你所要做的一切就是仔细地准备好这次转换。
在这里,仔细准备不仅仅意味着在你的系统上装上Linux-不管是你现有的还是一台全新的电脑-它也包括了你的文件、书签、参数和系统设置等。并且在某些情况下需要去找到一款和你以前所使用的Windows应用所相当的开源应用。
Linux安装过程的本身会因发行版本的不同而各有差异,因此你如果事先没有掌握一定的知识,那就先放下这篇文章,先去熟悉一下安装流程再说。 尽管现在的安装流程要比以前简便很多,但尽可能的去熟悉它对你总会有所帮助。 这个方法能够让你就如何移植你的数据和用户设置做出最佳计划,并且防止意外情况的发生。
数据移植的三种方法
有三种基本方法可以将你的用户设置和数据从Windows移植到Linux中:
让Ubuntu Linux替你去做。Ubuntu是目前市面上最为流行的一个Linux发行套件,也是在安装过程中唯一带有内建移植工具的发行套件。
使用第三方应用。
自己动手。
很明显,第三种方法对专业知识的要求是三个方法中最高的,但是它也可以提供给你最大程度上的灵活性,因为你是在自行建立和定制你的系统。
说到灵活性最大化,相比在你现有的电脑上改换操作系统,在一台已装有Linux的新电脑上进行移植将会来的更容易些。 在有一台新电脑的情况下,你可以将那些不确定的东西原封不动的留在旧电脑的系统里。 如果你不得不在你目前装有Windows的电脑上安装运行Linux,那么切记要在移植前备份好你所有的数据。
首先,做备份
不管你采用的是哪一种方法,在移植之前最最首要的事情就是将你无法恢复的所有数据做一个完整的备份。 如果你选择将文件移植成新的格式,那么你要保留好原来的那些文件-如果有某个文件在目前无法被正确转换,你始终有原文件在手里。
尽可能将你的备份做成一个与平台无关的格式,并且将它拷贝到一个在任何平台上都可以读取的设备中。 这样一来,不管你今后是否要在Windows还是Linux中恢复一些数据,你不会碰到任何的意外情况。
最简单的方法就是将所有的文件拷贝到另外一个可以在Linux下读取的磁碟中。 大部分的Linux发行套件本身都可以读取FAT32和NTFS格式的磁碟,所以你可以将你的文件拷贝到另外一个格式化成上述两种Windows格式的硬盘中,这样的话你就可以在Linux下方便的读取那些数据了。 由于FAT32不支持大于4GB的个人文件,因此我推荐你使用NTFS的分区格式。
方法之一是将原始数据压缩成.tgz或.zip格式,大部分普通的压缩软件都可以做到这一点。 在Windows系统上,7-zip压缩软件暂时是我的最佳选择,因为它既是开源软件,又是免费软件。 如果你也想使用这款软件,那么在压缩时选择.zip或.gzip/.tar文件格式,而不是它默认的.7z压缩格式,
该软件在Linux下的格式为p7zip,不过既然市面上的每一个Linux发行套件都通用.zip和.gzip的格式,那么就用它们吧。
顺便说一下,你从一个平台迁移到另一个平台上的东西越多,你就越需要去重新考虑如何安排和分配储存。 如果你想要将文件移植到一个全新的操作系统中的话,那么你最好现在就重新规划一下你的储存结构。 现在的硬盘已经很便宜了,因此将数据存储到第二个硬盘上不再是一个奢侈的空谈,而且从长远来看它能为你省下很多的工作。 (以我自己来说,我就把我的个人文件存放在第二个硬盘上,和操作系统所在的硬盘分隔开来,而第三个硬盘上全是我的音乐图书馆。)
让UBUNTU替你去做
Ubuntu Linux能尽可能的将移植到Linux上的工作做到简单化,它能够让你从现有的Windows系统上将用户文件甚至一些系统定制的用户设置自动移植到Linux中。
目前,Ubuntu似乎是市面上唯一的一个在安装流程中带有此类工具的主流Linux发行套件,尽管这种情况会随着Linux的成长和普及而改变。 如果你现在就想转换到Linux上,并且你希望你的发行套件可以在移植过程中助你一臂之力,那么Ubuntu是目前最好的选择。
当你开始安装Ubuntu时,它会扫描现有系统里的硬件并查看是否装有Windows系统。 如果它找到一个,它就会列出该Windows系统中的所有用户来让你选择移植哪个用户以及拷贝哪种类型的数据到Ubuntu上。 这些选项并不是十分细节化和具体化的-你无法精确的选择到某个具体的文件,而是文件的大致类别-但这个功能却很实用。 比方说,你可以选择你的Internet Explorer收藏夹,或者你目前正在使用的壁纸,你的头像,以及我的文件,我的音乐和我的图片夹中的内容。
Ubuntu升级器的另一个好处是: 它可以不管数据的来源和目的地。 如果在你的某个分区或者硬盘中装有Windows,而你现在想要在Windows所在的位置之外安装Ubuntu,那么升级器就会替你拷贝它所发现到的任何Windows设置和文件(并且/或者让它搬移你所指定的文件)。
这样一来,升级就完全没有破坏性了-这意味着原始文件将纹丝不动。 Ubuntu目前还不支持在Windows界面下转换到Ubuntu-也就是在常规的启动并进入Windows后,插入一张Ubuntu CD然后开始系统转换。目前要转换成Ubuntu系统就必须用Ubuntu的CD来直接启动。
如果你觉得好奇,你可以在Ubuntu发行套件的wiki上阅读一下关于将来Ubuntu移植特性的指南。 举个例子,比方说Mozilla Thunderbird就是其中一个Ubuntu的开发员想要在未来从中移植设置和数据的第三方程序。 在它的规划蓝图上也包括了在Windows界面下转换成Ubuntu的功能。
使用第三方应用
如果你所使用的Linux发行套件并没有自带移植工具,并且你不喜欢自己动手来移植所有东西,那么有不少第三方的工具可以帮你减轻负担。 不管如何,在这里要预先提醒一下,这些工具原本是为企业用户而不是个人用户开发的-它们最适合帮助系统管理员来进行大批量的移植。
linux系统移植 篇3
关键词:PowerPC;linux;设备树
Bootloader除了引导系统之外,另一个重要的作用就是给内核传递硬件信息。在服务器和桌面系统bootloader与内核之间传递硬件信息,为了达到标准化和兼容性的目的,都各自有标准Firmware(一种嵌入到硬件设备中的程序,用于提供软件和硬件之间的接口)。如x86平台的有BIOS。PowerPC 和Sparc 系统均采用Open-Firmware标准。但是嵌入式PowerPC平台并没有这样标准的Fireware接口,但是在嵌入式领域,早期的uboot使用include/asm-ppc/ppcboot.h中的静态数据结构struct bd_info来保存bootloader给内核传递的信息。但是bd_info并不能为内核提供当前具体是哪个平台的信息。这种没有标准接口所以带来的问题就是,每当我们更换bd_info的布局的时候我们都必须重新定制和烧录bootloader和内核镜像。例如我们可能需要修改kernel,syslib,platforms目录下的很多的内核文件。
目前为了适应内核的发展和嵌入式平台PowerPC平台的变化,ePAPR(embedded Poower Architecture Platform Requirements)吸收Open Firmware中设备树(Device tree)。通过设备树来将硬件信息传递给内核,64位PowerPC平台最先支持OF(Open Firmware)结构。随着内核发展,内核开发人员打算利用合并PPC32(arch/ppc32)和PPC64(arch/ppc64)的内核代码这个机会,将清理PPC32中的firmware接口。让所有的PowerPC平台都统一提供对OF(Open Firmware)结构的支持。
1 Linux内核中PowerPC 软件结构
为了理解PowerPC 内核初始化过程,下面对设备树和机器描述结构(ppc_md 结构)。
1.1 设备树
设备树是一种描述硬件配置的树形数据结构,每一个设备树都包含唯一的根节点/。设备树结构由设备节点组成,这些设备节点又可以由多个子节点组成。这些节点只有包括设备或者总线。每个节点包含属性。设备树的源代码存放在arch/powerpc/boot/dts目录下。这里的每个文件都描述着各自的平台的硬件信息。以mpc8313erdb平台为例,其文件名为mpc8313erdb.dts。一个基本的设备树必须包含一个cpu节点、一个memory节点两个节点信息。对于需要为平台添加新的网卡设备,我们必须修改mpc8313erdb.dts文件。dts文件时文本文件,而linux系统引导的时候,所使用的并不是这样的文本文件,而是二进制文件(dtb)。所以需要使用dtc工具将dts文件编译成dtb的二进制文件。
dtb文件由boot_param_header,device_tree结构和device tree string三大部分组成。dtb组成如图1所示。
(1)boot_param_header结构
头主要描述设备树的基本信息,如设备树魔数标志(0xd00dfeed)、设备树块大小、结构块的偏移地址。这个结构中的值都是以大端模式表示,并且偏移地址是相对设备树头的起始地址计算。boot_param_header结构定义在arch/powerpc/boot/flatdevtree.h文件中,用来保存设备树的头部信息。
(2)Device tree结构
设备树结构块是线性化的树形结构,和字符块一起组成了设备树的主体,以节点形式保存目标板的设备信息。在结构块中,节点起始标示为常量宏OF_DT_BEGIN_NODE,节点结束标志位宏OF_DT_END_NODE;子节点在节点结束标志前。一个节点可以概括以OF_DT_BEGIN_NODE开始,包括节点路径、属性列表、子节点列表,最后以OF_DT_END_NODE结束的序列,每个子节点自身也是类似的结构。
(3)Device tree string结构
为了节约空间,将一些属性名,尤其是那些重复冗余出现的属性名,提取出来单独存放到字符块。这个块中包含了很多有结束标志的属性名字符串。在设备树的结构块中存储了这些字符串的偏移地址,这样可以很容易地查找到属性名字符串。字符串块的引入节省了嵌入式的存储空间。
1.2 ppc_md 结构
全局变量ppc_md定义在arch/powerpc/kernel/setup-common.c。数据结构定义在include/asm-powerpc/machdep.h中。其中主要包括像setup_arch,init,init_IRQ,probe等。Linux PowerPC中probe_machine函数从machine.desc段中读取数据来填充ppc_md数据结构。Linux PowerPC首先通过宏define_machine,将各类PowerPC内核的ppc_md结构加入到machine.desc段中。图2描述了ppc_md的结构。
2 PowerPC linux初始化过程
即从BootLoader加载内核到执行/sbin/init程序之间的代码。
U-boot传递linux两个参数:r3指向OF Tree 结构的物理地址 r4指向Linux内核所在的物理地址。
2.1 跳入内核入口地址_start出,此处arch/powerpc/kernel/head_32.S
* bl machine_int
> early_init_devtree()解析dtb获取当前处理器系统的硬件信息。
> probe_machine()读取machine_desc段,调用其中.probe()钩子函数。每个.probe钩子函数回去检查设备树中描述平台信息是否被平台代码支持。通常,probe函数回去查看root节点的compatile属性。如mpc8313erdb平台判断root属性是否是MPC8313ERDB字符串。
2.2 调用start_kernel。
* setup_arch(&command_line)。对内存系统进行基本初始化,调用ppc_md->setup_arch对当前处理器进行一些基本的初始化。以mpc8313erdb为例,调用mpc8313_probe函数
* init_IRQ。调用ppc_md->init_IRQ。即mpc8313_rdb_init_IRQ()
* time_init。其中调用ppc_md->time_init。即mpc83xx_time_init。使能e300 time base unit。
* reset_init 将创建init线程。调用do_basic_setup完成linux系统其他模块初始化
* do_initcalls。执行.initcall.init段中注册的初始化函数。
3 添加网卡芯片
下面以为了使linux支持mpc8313erdb新添加ks8851网卡芯片为例,说明需要修改相关部分。
(1)由于bootloader传递给内核所需要的硬件信息是dtb文件,而dtb文件时通过dts文 件编译生成的。所以为给内核传递新添加的网卡硬件信息,所以需要修改过mpc8313erdb平台对应的dts文件。该文件为arch/powerpc/boot/dts/mpc8313erdb.dts,添加网卡硬件信息到dts文件中,网卡节点作为根节点的子节点,具体硬件属性信息如下:
ethernet0@17c00000 {
device_type = "network";
compatible = "ks8851";
model = "micrel";
reg = <17c00000 2 17c00002 2>;
local-mac-address = [ 00 00 00 00 00 00 ];
interrupts = <30 8>;
interrupt-parent = <&ipic>;
};
注:具体修改含义值参见[2]
(2)添加初始化函数ks8851_of_init。
* 通过设备树中网卡属性of_find_compatible_node找到ks8851的硬件信息的设备节点。
* 获取网卡寄存器地址以及中断号。使用内核提供相关接口of_address_to_resource和of_irq_to_resource。
* 注册平台设备。
* 使用宏arch_initcall(ks8851_of_init)。将初始化函数放入.initcall.init段。
4 结束语
本文介绍了PowerPC linux的发展过程,并且讲述了PowerPC linux启动流程,最后以为mpc8313erdb平台添加网卡设备为例,介绍了powerpc linux为例支持新添加的硬件设备,所需要添加的相关代码。
参考文献
[1] 刘邦运. PowerPC Linux 设备树 DTS移植,2009.
[2] Benjamin Herrenschmidt,Becky Bruce,MontaVista Software. Booting the Linux/ppc kernel without Open Firmware.
linux系统移植 篇4
Linux内核具有内核稳定等特点,并且十分方便定制,这个内核具有完善健全的网络通信和进行文件管理的模式和机制,使其成为计算机领域的一种新型的软件。在一些职能手机中都有相当大量的运用。然而,在嵌入式发展的领域,各种硬件系统的结构都不尽相同,大多都是具有种类繁多的特点。本文中我们主要研究如何使linux快速的移植到新的硬件平台上,成为了当前必须要解决的一个问题。
1 linux 操作系统
操作系统是计算机系统中的一个系统软件,这个系统管理与控制计算机中的硬件设施和那软件设施。还对整台计算机的工作流程进行的组织与合理的把握,组织这些流程方便我们对计算机资源进行更有效的整合利用,从而方便信息的集中,为浙西额计算机用户们提供起来一个功能更加强大的。更加方便快捷高效的工作环境。Linux是逐渐在互联网被大众所熟知的,摒弃而这个内核系统也在一天天的不断完善,具有很多优势,高效稳定广泛适用于各种各样的信息平台。操作系统是存活在在计算机中的一个最为基本的系统,这个系统负责计算机中的所有测资源,包括硬件与软件组织,操作系统也是唯一一个能够直接的与计算机的硬件系统打交道的软件,同时还为计算机用户提供了良好的界面,因此操作系统是协调计算机的各组成分之间关系的重要的软件系统。在我们国家随着操作系统的出现和问世以来,我们对操作系统的使用,也促进了操作系统的发展,这些是自从计算机问世以来,就在这个领域内取得了一个重大的进展。操作系统具体指的就是一种系统软件,操作系统的功能有:管理系统资源、控制一定的程序的执行、提供各种类型的个性服务,从而为用户高效能有效充分的使用来提供一个最优化最合理的运行环境。
Linux内核采用的个体的内核结构,并且还与一些具体的与之有关的硬件平台保持的有密切的关系。如果我们要把linux内核往新的硬件平台上移植,就需要克服种种不易于解决的难关。我们只有仔仔细细的对linux内核移植的理论进行深刻的研究,充分的分析linux内部的体系和结构构造,还要尽量的保证系统内核中的硬件结构的体系的结构与之无关的部分要区分开来,我们才能从根本上保证好Linux内核的真正高效准确的移植。Linux从90年代才问世,发展到21世纪的今天,已经成为一项功能强大并且设计勾结都很完善的操作系统之一,在各种商业操作系统中站稳了脚跟。在一些新兴的嵌入式的领域之中也取得了长远的发展,又因为硬件产品的更新换代快,种类繁复多样。为了使linux能够快速适应这些新的硬件产品,广泛的拓展这个linux的使用的范围,我们就需要对Linux的内核代码进行必要的移植和调试。Linux在自己的pc上,自行设计了操作系统并且开发了真正属于他自己的一个程序。
2 linux 操作系统的内核移植
Linux内核移植的难点:这种linux内核具有效率高、结构单一等特点。但是这种内核的移植比微内核的移植要相对的差一些。Linux设计是以实用为最主要的目的,实用也是其设计理念。所以对linux系统来说,它的设计和开发最注重的是整个系统的效率,甚至在设计中不惜牺牲部分来促进整个移植系统的效率。Linux采用单体形成内核的结构,降低了内核的可移植性。微内核作为一种新型的操作系统,也是十分先进的,微内核的出现标志着我国计算机的长远发展,也是一种潮流和趋势。但是目前微内核的发展状况并不是很好,这个系统的通信效率不高。通信效率的降低直接影响到了整个操作系统的性能,导致性能的降低。但是linux没有使用微内核结构,而是采用了最为简单快捷的单内核来进行运行。采用的是单体内核的结构模式,这个单体内核的各个部分的关系都十分的紧密,虽然我们要进行的移植工作大部分都集中在计算机的硬件部分。但是由于这个操作系统的各个部分都是密切的相连的,即使是对其中的一个部分做了修改,就会立即牵连到奇他的部分,其他部分的性能立即会受到影响。这些都增加了移植工作的难度。又由于linux的设计是以实用并且高效率为最主要的目标,所以我们一定要根据这些硬件的特性来对系统内核进行一定的优化。但是在这个内核中的很多的硬件特性都是在固定的硬件中才会存在的。如果说把其他一些的硬件平台去,若是对这个内核部分进行大幅度的修改,就会普遍增加内核进行移植的难度。
Linux内核对尽情移植提供了有效的支持,虽然linux内核采用的并不是一种相对灵活便捷的单体内核机制,但这些并没有真正的影响到linux内核平台的无关性。我们是想一下,linux之所以能够成为目前来说,最广泛的支持硬件平台的一种操作系统。除了拥有一大批优秀高质量的开发团队以外,最主要的是在计算机领域拥有自己的先进的思想,在这些思想的引领下,从而提出来更多先进的结构。Linux用来提高内核可移植性的三种最主要的方法。
经过这么多年的发展,嵌入式的系统已经逐渐的渗透到人们的工作生活与学习中。嵌入式
系统现如今得到了广泛的应用。我们平常生活中用到的mp3等数码工具,这些产品中用到的都是嵌入式系统,这种系统在某种程度上改变了我们的生活方式。让我们的生活变得更加的智能与电子化。到目前为止,我国嵌入式正处在蓬勃发展中。在嵌入式开发系统的软件开发的环境设计中,主要涉及的内容有Linux移植,尽管嵌入式系统有很宽广的市场和大量的需求,但是嵌入式系统的发展仍然是一个无比痛苦和缓慢的过程。除了这些系统引导的程序以外,一个完全嵌入式的linux系统还需要一个包括linux内核以及必须要有的设备驱动程序、以及必不可缺少的文件系统,这些都是嵌入式linux系统移植的工作的主体部分。掌握了这些基本的内核结构之后,接下来就要在目标板上进行实际中的移植工作。相关的内核文件可以从网站上直接下载,进行移植工作我们首先要做的工作就是实现这些内核对不同的设备的设置。在进行移植的过程中我们要注意我们需要掌握linux内核的移植的技术,充分的利用linux开放源代码的各种优势,使linux真正的为我们的科研工作和商业服务。
我们需要介绍linux内核的主要工作由:系统介绍操作系统的一般理论,研究linux内核进行移植的基本原理。并且还要详细介绍linux内核移植的困难之处,并且还要对linux系统中增加系统的可移植性进行比较与分析,进一步介绍linux移植工作的主要内容和方法。Linux在国内的推广比在国外晚了好多年,近些年来有更多的软件爱好者来学习linux的应用与开发。与此同时,很多专业的高校都把这些作为实验课的内容,推广了linux技术的同时也为其发展奠定了基础。随着linux核心技术的不断成熟与发展,它的各种性能都在逐步趋向稳定,安装起来也具有方便快捷等特点,支持多种语言的发行版本。并且linux也得到了广大厂商的大力支持,这一切都使linux这个年轻有活力的系统充满了新的希望和活力。Linux可以说是完全是一个互联网时代的产物,因为它诞生于互联网,发展于互联网,并且在互联网中不断的壮大起来。
3 结语
linux系统移植 篇5
一、如何查看Linux系统的发行版本信息
代码如下复制代码
#[root@hsnoklox lnmp0.9]# cat /etc/issue
CentOS release 5.3 (Final)
Kernel r on an m
# lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.4 (Final)
Release: 5.4
Codename: Final
这个命令适用于所有的linux,包括Redhat、SuSE、Debian等发行版,
二、如何查看Linux系统的内核版本信息呢?
查看Linux内核版本的命令
方法一:
命令: uname -a
作用: 查看系统内核版本号及系统名称
方法二:
命令: cat /proc/version
作用: 查看目录“/proc”下version的信息,也可以得到当前系统的内核版本号及系统名称
补充说明:
/proc文件系统,它不是普通的文件系统,而是系统内核的映像,也就是说,该目录中的文件是存放在系统内存之中的,它以文件系统的方式为访问系统内核数据的操作提供接口。而我们使用命令“uname -a“的信息就是从该文件获取的,当然用方法二的命令直接查看它的内容也可以达到同等效果.另外,加上参数”a"是获得详细信息,如果不加参数为查看系统名称。
例1
代码如下复制代码
root@MyMail ~ # uname
Linux
root@MyMail ~ # uname -r
Linux的日志文件系统简要剖析 篇6
定义日志文件系统的方法有很多种,但是让我们抓住要点。日志文件系统就是专为那些厌倦了一直盯着启动时 fsck(即文件系统一致性检查)的人而设计的(日志文件系统同样适用于希望文件系统具有故障恢复能力的群体)。如果系统采用传统的未提供日志功能的文件系统,那么操作系统在检测到系统为非正常关机时,会使用 fsck 应用程序执行一致性检验。该应用程序会扫描文件系统(这要花费很长的时间),并修复任何可安全修复的问题。而在某些情况下,当文件系统损坏严重时,操作系统会启动到单用户模式,由用户进行进一步的修复。
那么现在您应该清楚日志文件系统针对的是哪类人群了,但是他们是如何取缔 fsck 的呢?笼统地说,日志文件系统就是通过维护一份日志来防止文件系统崩溃。所谓日志就是一种特殊的文件,它会在一个循环的缓冲区内记录文件系统的修改,然后 将其定期提交到文件系统。一旦系统发生崩溃,日志文件就会起到一个检查点的作用,用于恢复未保存的信息,防止损坏文件系统元数据。
总 之,日志文件系统就是一种具有故障恢复能力的文件系统,它利用日志来记录尚未提交到文件系统的修改,以防止元数据破坏(请参见图 1)。但是如众多其他 Linux 解决方案一样,日志文件系统有多种方案供您选择。下面就让我们一起简短回顾一下日志文件系统的历史,然后再看一看现行的几种文件系统,看看它们之间有什么 区别。
Linux 日志文件系统的历史
最 早的日志文件系统是 IBM? Journaled File System(JFS)。JFS 于 1990 年首次发行,而当前 Linux 支持的版本是后期开发的 JFS2。1994 年,Silicon Graphics 为 IRIX 操作系统引进了高性能的 XFS。XFS 于 2001 年被植入 Linux 系统中。1998 年开发的智能文件系统(SFS)起初是为 Amiga 开发的,但之后却在 GNU Lesser General Public License(LGPL)下发行,并于 2005 年获得了 Linux 的支持。最常用的日志文件系统 ext3fs (third extended file system)是 ext2 的扩展,它增加了记录日志的功能。从 2001 年起,Linux 系统中就开始支持 ext3fs。最终,ReiserFS 日志文件系统在其被引入之后,力压群雄,被广泛使用。但由于其原开发者的一些法律纠纷,ReiserFS 日志文件系统未能得到进一步的发展。
日志的几种变体
日志文件系统是使用日志来缓冲文件系统的修改(同时也可以应用于紧急故障恢复)的,但可以根据记录的时间与内容采取不同的策略。其中,三种常见的策略为:回写(writeback)、预定(ordered)和数据(data)。
在回写模式 中,仅有元数据被记录到日志,数据块则被直接写入到磁盘位置上。这样可以保存文件系统结构,防止崩溃,但却有可能发生数据崩溃(比如:在元数据记录到日志后,数据块写入磁盘前,系统崩溃)。要想解决这个问题,您可以使用预定模式。预定模式 只将元数据记录到日志,但是在此之前将数据写入到磁盘。这样就可以保证系统恢复后数据和文件系统的一致性。最后一种模式将数据也记录到了日志中。在数据模式 中,元数据和数据都被记录到日志中。这种模式可以最大限度地防止文件系统崩溃与数据丢失,但由于全部数据都写入了两次(先写入日志,再写入磁盘),系统性能可能会降低。
日志的提交也有很多种不同的策略。比如,是在日志将满时,还是在超时后?
日志文件系统的现状
如今,有几种日志文件系统应用非常广泛。每一种都有其自己的优缺点。下面介绍现存最普遍的四种日志文件系统。
JFS2
JFS2(又称 enhanced journaled file system)是最早期的日志文件系统,在植入 Linux 之前已被应用于 IBM AIX? 操作系统多年。它是 64 位的文件系统,虽然它是在原来的 JFS 的基础上开发的,但却较之有所改进,即:JFS2 具有更优的扩展性能,而且支持多处理器架构。
JFS2 支持预定的日志记录方式,可以提高较高的性能,并实现亚秒级文件系统恢复。JFS2 同时为提高性能提供了基于分区的文件分配(Extent-based allocation)。基于分区的分配 是指对一组连续的块而非单一的块进行分配。由于这些块在磁盘上是连续的,其读取和写入的性能就会更好。这种分配的另外一个优势就是可以将元数据管理最小化。按块分配磁盘空间就意味着要逐块更新元数据。而使用分区,元数据则仅需按照分区(可以代表多个块)更新。
JFS2 还使用了 B+ 树,以便更快地查找目录和管理分区描述符。JFS2 没有内部日志提交策略,而是在 kupdate 守护进程超时时提交。
XFS
XFS 是 Silicon Graphicsis 于 1995 年为 IRIX 操作系统开发的其他早期日志文件系统之一。它于 2001 年就已经被植入 Linux,因此,它已经成熟而且可靠。
XFS 支持 64 位全地址寻址,并以 B+ 树为目录和文件分配提供高性能。XFS 同样使用了基于分区的分配,支持可变的块大小(从 512 字节到 64KB )。除分区外,XFS 还采用延时分配,即等到块将被写入磁盘时,再为其分配磁盘空间。这样所需磁盘空间总数就一目了然,因此这个功能提高了分配连续磁盘块的可能性。
XFS 还有一些其他的有趣特性,它可以保证 rate 输入输出(I/O — 通过为文件系统用户保留带宽)和直接 I/O。其中,数据是直接在磁盘和用户空间缓冲区间拷贝的(而不是从多个缓冲区进入)。XFS 采用回写日志策略。
第三扩展文件系统(ext3fs)
第 三扩展文件系统(third extended file system,ext3fs)是最流行的日志文件系统,是由 ext2 文件系统演化而来。实际上,Ext3fs 可以与 ext2fs 兼容,这是因为 ext3fs 使用的结构与 ext2fs 相同,仅仅多了一个日志而已。我们甚至可以把 ext3fs 的一部分当作 ext2 文件系统挂载,或者将 ext2 文件系统转换成 ext3 文件系统(使用 tune2fs 实用程序)。
Ext3fs 允许用三种方式记录日志(回写,预定和数据),但预定模式为默认模式。日志提交策略也是可配置的,但是默认在日志填满 1/4 时或其中一个提交计时器超时时,提交日志。
ext3fs 主要的弊端之一就是它最初不是作为日志文件系统而设计的。它是在 ext2fs 的基础上开发的,因此缺少一些其他日志文件系统所具备的高级特性(例如分区)。它在性能方面较之 ReiserFS、JFS 以及 XFS 也尤为逊色,但它所需要的 CPU 和内存要比同类解决方案少。
ReiserFS
ReiserFS 是从一开始就按照记录日志的意图而开发的日志文件系统。ReiserFS 于 2001 年被引进到主流 2.4 内核(Linux 采用的第一个日志文件系统)。其默认的日志记录方法为预定,且支持以在线调整大小的方式扩展文件系统。ReiserFS 同时还具有 tail packing 功能,显着减少了磁盘碎片。在处理较小文件方面,ReiserFS 的速度要比 ext3f 快(当 tail packing 可用时)。
ReiserFS(又称 ReiserFS v3)具有很多先进的功能,如 B+ 树。该文件系统的基础格式建立在单一的 B+ 树的基础之上,这使得搜索的效率和可伸缩性增强。提交策略则取决于日志的大小,但是要以待提交的块的数量为基础。
ReiserFS 也遇到了几个问题 — 大多是最近出现的,这与其开发者遇到了一些法律纠纷有直接原因。
日志文件系统的未来
现在您已经了解了现行的(和过去的)日志文件系统,下面就让我们看一看它的发展趋势。
Reiser4
在成功地将 ReiserFS 合并到 Linux 内核,并被很多的 Linux 发行版采用之后,Namesys(开发 ReiserFS 的公司)便开始致力于新的日志文件系统的开发。Reiser4 被设计成为全新的日志文件系统,它拥有很多先进的功能。
Resier4 拟定通过 wandering 日志和延迟分配块直至日志提交(像在 XFS 中一样)的方式来实现更优秀的日志记录。Reiser4 还设计有灵活的插件架构(以支持诸如压缩和加密之类的功能),但是被 Linux 社区拒绝了,因为这些在虚拟文件系统(virtual file system,VFS)被当作是最好的功能。
由于 Namesys 的所有者的坚持,所有关于 Reiser4 的商业活动都停止了。
第四扩展文件系统
第 四扩展日志文件系统(fourth extended journaling file system,ext4fs)是由 ext3fs 演化而来。Ext4 文件系统被设计为具有向前和向后兼容性,但它具有许多新的高级特性(其中的一些特性破坏了兼容性)。这就意味着您可以将 ext4fs 的一部分作为 ext3fs 挂载,反之亦然。
首先,ext4fs 是 64 位文件系统,并被设计为可以支持很大的容量(1 exabyte)。它还可以使用分区,但是这样做将失去与 ext3fs 的兼容性。像 XFS 和 Reiser4 一样,ext4fs 还支持在必要时采取延时分配方式分配块(这样可以减少磁盘碎片)。日志的内容也已经执行过检查和(checksum),使日志更加可靠。ext4fs 并没有采用标准的 B+ 或者 B* 树,取而代之的是 B 树的一种变体,叫做 H 树,它支持更大的子目录(ext3 的上限为 32KB )。
虽然延时分配的方法可以减少磁盘碎片,但时间久了,一个大的文件系统可能会成为碎片。为解决这个问题,开发了在线磁盘碎片整理工具(e4defrag)。您可以使用这个工具来整理单个的文件或者整个文件系统。
ext3fs 与 ext4fs 间的另一个有趣的区别就在于文件的日期分辨率。在 ext3 中,时间戳的最小分辨率为 1 秒。而 Ext4fs 是面向未来的:那时处理器和接口的速度会持续加快,需要更高的分辨率。因此,ext4 中时间戳的最小分辨率为 1 纳秒。
Ext4fs 已被合并到自 2.6.19 以后的 Linux 内核中,但它还是不够稳定。下一代系统的开发将继续致力于此;辅之以上一代的优势, 它就会是下一代的 Linux 日志文件系统。
结束语
linux系统移植 篇7
随着信息科技和微电子技术的迅速发展,嵌入式系统已经越来越广泛被用于社会、经济的各个领域,从复杂的工业设备、精密的医疗仪器,到随处可见的手机、PDA,嵌入式系统已经与我们现代化的生活息息相关。嵌入式系统发展初期任务较少,功能单一,所以并不需要操作系统的支持。但是,随着其承担的功能的增多且日趋复杂,对系统的要求也越来越高,在这种情况下,像普通计算机一样将操作系统引入到处理器中已成为大势所趋[1]。操作系统的引入,可以尽可能有效利用处理器的有限资源,实现CPU在各个进程之间的最优化切换,必会将嵌入式系统引入到一个前景更加广阔的领域。
2 软硬件平台结构
一般来说,嵌入式系统由硬件和软件两部分组成,硬件包括CPU及其各种外设的接口,软件则包括嵌入式操作系统和相关的嵌入式应用软件。
嵌入式系统的设计开发首先涉及到的即是处理器(CPU)的选择,这是嵌入式系统的基础。目前,市场上的CPU种类繁多,包括X86系列、ARM系列及其他一些专用的CPU。本文所用到的CPU为S3C2410,是SAMSUNG公司生产的ARM9系列芯片。S3C2410主频为203 MHz,带有MMU(内存管理单元),支持Linux系统的移植嵌入。除此之外,该处理器拥有:独立的16 KB的指令Cache和16 KB数据Cache、支持TFT的LCD控制器、NAND闪存控制器、三路UART、四路DMA、四路带PWM的Timer、I/O口、RTC、Touchscreen接口、两个USB主机、一个USB设备、SD主机和MMC接口、两路SPIO[1]。
操作系统也是嵌入式系统的重要组成部分。当今的嵌入式操作系统各种各样,有VxWorks、QNX、Palm OS、Windows CE、Linux、μClinux、μC/OS-II、Nuclues等,每种操作系统都有其与众不同之处。本文选用的将要移植的嵌入式操作系统为如今在各领域中广泛应用的Linux。Linux是以Unix为基础而发展起来的操作系统,其最大优点是源代码公开,可以任意剪裁和修改后将其移植入自己的硬件平台上,因此可以说是嵌入式操作系统的最佳选择。
3 移植过程分析
嵌入式Linux系统的开发是一个庞大的工程,在硬件搭建完毕之后,主要是下面几个基本的步骤:①系统引导程序BootLoader编写(用于设备加电后的系统定位引导);②Linux微内核的编译(内存管理、程序管理);③进程的初始化。除此之外,如果要成为完整的操作系统并继续保持小型化还必须加上硬件驱动程序、硬件接口程序和应用程序等。可见,嵌入式Linux操作系统开发具有一定的层次性,应按其结构自下而上逐层进行,如图1所示。
Boot Loader(引导装载器)是嵌入式系统移植的第一个环节。Boot Loader是操作系统内核启动前运行的一段小程序,其主要任务为初始化目标板硬件,给嵌入式系统提供板上的硬件资源信息,并进一步装载、引导嵌入式系统的固件,其作用相当于我们普通电脑中的BIOS[2]。因此,嵌入式系统移植的第一步就是要移植一个适合硬件系统的Boot Loader。实验中所使用到的Boot Loader为Vivi。Vivi是韩国Mizi公司开发的一种针对ARM9处理器的Boot Loader。
在进行移植以前,必须先对Linux的启动过程加以了解,通常Linux的启动过程为:一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码,加载程序的工作就完成了。此后Linux将自己的剩余部分全部加载到内存,并初始化所有设备,在内存中建立好自己所需的数据结构(有关进程、设备、内存等)。内核加载设备并启动init守护进程,init守护进程会根据配置文件加载文件系统,配置网络、服务进程、终端等。初始化完成以后,系统启动,就可以看到系统的欢迎界面了。简而言之,内核部分初始化并控制大部分硬件,为内存管理、进程管理设备读写等工作做好一切准备;系统部分加载必须的设备,配置各种环境以便用户可以使用整个系统。可见,Linux移植过程的关键是其内核的移植,内核移植出现问题的话,后面的工作就将无法展开,Linux内核启动就是通过调用一系列的内核函数来实现的,其启动流程图如图2所示。
由以上的分析可知,Linux的内核是Linux的心脏,是操作系统的内部核心程序,因此,移植过程中的主要内容就是对Linux内核的修改和编译。
4 移植过程实现
4.1 交叉开发环境的建立
移植前应当确保在宿主机上已经正确安装了Linux操作系统和GCC交叉工具编译链,目标板上的USB接口、串口和JTAG已经连接好并且驱动程序安装成功。本实验中宿主机上安装RedHat9.0版本的Linux操作系统,交叉编译工具为arm-linux-gcc3.4.1。
4.2 引导程序的移植
Vivi已经直接提供了对S3C2410的板级支持和对ARM920T内核的支持,对移植的工作量来说减轻了不少。在移植时,首先应修改Vivi的工程管理文件makefile文件中有关编译时要用到的函数库和交叉工具编译链的选项,主要是CROSS_CMPILE 、LINUX_INCLUDE_DIR、ARM_GCC_LIBS这三个文件,其中CROSS_CMPILE和LINUX_INCLUDE_DIR的路径要改为其在交叉工具编译链中对应的目录;LINUX_INCLUDE_DIR的路径要设置为/home/kernel/include[3]。
在对Vivi进行必要的修改和重新配置后,就可以对其执行“make”命令进行编译,编译通过后,用JTAG将编译好的Vivi烧写至Flash中。
4.3 内核的移植
移植前,首先在Linux的/home下建立存放内核源码的文件夹,实验中为/home/jesfei/Linux-2.6.12。在宿主机Linux系统下把要移植的内核源码解压至目标文件夹,采用的Linux内核版本为2.6.12。在Linux内核移植的初始阶段,应尽量构造一个最小内核,使嵌入式的Linux系统保持小型化和开发、应用所需要的基本功能即可,这样内核支持的选项尽可能少,可以减少移植过程的工作量和避免出现开发后期某些功能无法实现的问题。在确保己经进行的内核移植操作正确后,即可逐步地添加相应的硬件支持和功能支持。
移植过程中,首先要进行的也是最主要的工作是修改Linux操作系统中和CPU体系结构相关的代码,这些代码主要存储在Linux内核目录中的/arch目录下,其中绝大部分与ARM相关的代码存储在/arch/arm中,它所需要的头文件存储在/include/asm-arm中,所以,移植过程的重点也就集中在此文件夹中,移植过程中需要修改和添加的文件大致如表1所示[3]。
这些文件的具体功能为:
/makefile指定系统框架和交叉工具编译链,组织内核的各个模块,记录各个模块的相互联系;
/arch/arm/config.in对系统平台的选项以及处理器进行配置;
/arch/arm/makefile定义系统平台编译选项和内容;
/arch/arm/mm对内存页表内存管理映射进行初始化;
/arch/arm/match-s3c2410添加s3c2410平台的初始化函数;
/include/asm-arm/arch-s3c2410添加s3c2410寄存器和板子的定义;
/arch/arm/kernel/makefile添加对s3c2410处理器的支持;
/arch/arm/kernel/debug-armv.s定义串口打印函数;
/arch/arm/kernel/entry-armv.s定义中断处理子程序;
/arch/arm/kernel/head-armv.s定义内核代码入口;
/arch/arm/tools/match-types定义系统号;
/arch/arm/boot/compressed/head-s3c2410.s添加引导代码;
/arch/arm/boot/compressed/makefile添加编译选项;
/arch/arm/boot/makefile添加内核映像生成选项。
例如根目录下的makefile文件中需要修改ARCH:=(shell uname-m/sed-e s/i.86/…)为ARCH:=arm,修改CROSS_COMPILE=为CROSS_COMPILE=arm-linux,这表示Linux所基于的硬件平台为ARM,因为make是用来自动编译、链接程序的实用工具,make命令将根据makefile文件的规则来决定如何编译和连接程序。makefile文件描述程序之间的依赖关系,以及提供更新文件的命令。makefile文件贯穿内核代码目录,所有makefile中的cross_compile关键字用于指定要进行交叉编译工具链。将系统的框架定义为arm结构,将系统的交叉工具编译链修改为arm-linux,将/arch/arm/mm/mm-armv.c中的init_maps→bufferable=0修改为 init_maps→bufferable=1,表示修改掉init_maps的缓冲器状态,使其可用。将/arch/arm/boot/compressed/makefile中添加以下语句:
ifeq($(CONFIG_ARCH_S3C2410),y)
obj+=head-s3c2410.o
endif
语句中的head-s3c2410.o是由head-s3c2410.s文件经过编译产生的,主要用来初始化处理器。
在/arch/arm/match-s3c2410/devs.c中还应当添加Flash分区的信息,目标板中的Flash采用NAND Flash,存储空间为64 M,划分为四个分区,分区1存放Boot Loader本身,占用1 M空间;分区2存放Linux kernel,占用3 M存储空间;分区3存放roofs文件系统,占用40 M空间;分区4存放用户程序,占用剩余的20 M空间[4]。所以应该添加函数:
其中:size表示分区的大小,offset表示分区的起始地址。
将Linux内核修改之后接着就要对已修改好的内核进行配置,配置内核的命令有以下几种:make xconfig(用于X Window下的配置,将配置选项以图形菜单的形式显示出来。);make menuconfig(用于菜单方式);make config(用于文本方式),一般来说,图形方式和文本方式配置方法较为常用。配置过程中,选择Linux运行的选项时应当保证其与S3C2410开发板的配置一样才行,实验中采用的是文本方式。
内核配置完之后,接着要通过make或者make zImage进行编译选项的配置,经过“make dep” 建立内核依赖关系,“make zImage”建立内核镜像文件,“make module”创建内核模块这三个步骤,内核编译即可完成。 最后,将编译好的内核代码通过已经移植好的BootLoader下载到开发板上,Linux系统就成功的移植到了ARM处理器中。接下来就可以在此基础上进行驱动程序和应用程序的开发了。
5 结束语
嵌入式系统中引入操作系统是目前嵌入式设计与应用的一个热点,嵌入式操作系统在优化系统设计、提高系统设计效率、减少系统设计中重复劳动和提高移植性的方面起到了非常积极的作用。嵌入式操作系统中的引导、加载和启动是其中最基本也是最重要的一个步骤。本文结合嵌入式Linux系统和相应的硬件平台,研究和实践了Linux操作系统向S3C2410平台上移植的过程,为后续的驱动程序和应用程序的开发奠定了基础。
参考文献
[1]于明,范书瑞,曾祥烨.ARM9嵌入式系统设计与开发教程[M].北京:电子工业出版社,2006:108-116.
[2]李亚峰.ARM嵌入式linux设备驱动实例开发[M].北京:中国电力出版社,2008:150-171.
[3]潘伟森,邓胡滨.嵌入式Linux在S3C2410上的移植分析[J].仪器仪表用户,2008,15(2):121-122.
linux系统移植 篇8
嵌入式系统是以应用为中心, 以计算机技术为基础, 软硬件可配置, 对功能、可靠性、成本、体积、功耗有严格约束的专用系统[1]。S3C2440是SAMSUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器, 专门为PDA、INTERNET设备、手持设备等开发, S3C2440和它的前身S3C2410相比, 除了具有宽温的特性和两倍的运行速度以外, 还具备了AC97编码器、摄像模块 (标准CCD或CMOS) 接口、驱动强度控制等功能, 它是真正的工业级芯片, 配合14 mm×14 mm的小体积, 可以适合多数嵌入式场合使用[2]。嵌入式Linux是在标准Linux的基础上针对嵌入式系统进行内核裁减和优化后形成的一种小型操作系统, 一般只有几百KB左右, 即使加上其它必要的模块和应用程序, 所需的存储空间也很小, 非常适合于移植到嵌入式系统中去[3]。一个完整的嵌入式系统的构建过程大体可以分为四个步骤:交叉编译环境的搭建、BootLoader移植、Linux内核的配置编译及移植、根文件系统的制作及移植。本文将以SUMSANG公司的S3C2440处理器为目标平台, 介绍嵌入式Linux系统的构建过程。
2 交叉编译环境的建立
宿主PC机的编译环境可以是Linux操作系统或者是在Windows系统下Vmware +Linux形式, 还可以是Windows操作系统+cygwin软件的方式。本文的实验环境是在Windows XP系统下使用Vmware虚拟机运行RedHat9操作系统, 宿主PC机与目标板的连接主要是通过串口、并口、USB口、以太网口建立联系的。
交叉编译指利用运行在机器上的编译器编译某个源程序, 生成能在另一台机器上运行的目标代码的过程。交叉编译主要用到的开发工具包括三个部分:binutils、gcc、glibc。其中binutils是二进制文件的处理工具;gcc是编译工具;glibc是链接和运行库, 当中最重要的是gcc交叉编译器[4]。
构建交叉编译工具链有三种方法:
(1) 利用binutils、gcc、glibc工具分步编译。 安装交叉编译工具链所需要的库和源代码, 最终生成交叉编译工具链。
(2) 通过Crosstool脚本工具来实现一次编译生成交叉编译工具链。
(3) 直接通过网上下载已经制作好的交叉编译工具链[5]。
这三种工具都可以从http://ftp.gnu.org/获得。这里选用方法 (3) , 下载交叉编译工具arm-linux-3.4.1, 将交叉编译器解压到相应的目录下, 相应的命令为[root@localhost root]#tar jxvf arm-linux-3.4.1.tar.bz2, 注意解压后的路径。
3 BootLoader引导程序及移植
引导加载程序是系统加电后运行的第一段软件代码。它包括固化在固件 (firmware) 中的boot代码 (可选) 和BootLoader两大部分。PC机中BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中, 然后跳转到内核的入口点去运行, 也即开始启动操作系统。在嵌入式系统中, 整个系统的加载启动任务就完全由BootLoader来完成。由于BootLoader 的实现依赖于CPU的体系结构, 因此, 在嵌入式领域里建立一个通用的BootLoader几乎是不可能的。
大多数BootLoader 都分为stage1和 stage2两大部分。依赖于 CPU 体系结构的代码, 比如设备初始化代码等, 通常都放在 stage1 中, 而且通常都用汇编语言来实现, 以达到短小精悍的目的。而 stage2 则通常用C语言来实现, 这样可以实现更复杂的功能, 而且代码会具有更好的可读性和可移植性。
BootLoade的stage1 上电启动后通常按以下步骤执行: 首先对硬件设备初始化。包括屏蔽所有中断, 设置CPU的速度和频率, RAM初始化, 初始化LED, 关闭CPU的内部指令/数据Cache等。接下来的工作是为加载BootLoader的stage2准备RAM空间, 然后拷贝 BootLoader的stage2到RAM空间中。接着设置好堆栈。最后跳转到stage2的C入口点。
BootLoader的stage2 通常按以下步骤执行:初始化本阶段要使用到的硬件设备, 然后检测系统内存映射 (memory map) , 将 Kernel 映像和根文件系统映像从 Flash 上读到 RAM 空间中, 接着为内核设置启动参数, 最后调用内核。至此整个BootLoader的启动引导过程结束。
Vivi是韩国Mizi公司开发的一款针对ARM9处理器的BootLoader[6]。实验中使用的BootLoader是2440bootV5-Vivi的改版。它的运行原理与Vivi一样, 由于目标板的硬件配置不同, 进行了相应的修改。在对Vivi进行了必要的修改和重新配置后, 执行“make”命令进行编译, 编译通过后[6], 将BootLoader烧写到开发板NAND Flash分区。烧写方法有两种, 一种是用sjf2440.exe通过JTAG烧写, 另一种方法是用AXD通过JTAG或者JLINK用USB烧写。选用第一种方法, 过程如下:
(1) 将开发板JTAG接口与调试板JTAG相连, 调试板有两个接口, 这里连接JTAG口, 再把调试板连接到PC机的并口上。
(2) 将sjf2440.exe拷贝到C:下, 进入Windows命令行模式下, 执行命令sjf2440 /f:2440boot.bin (假设2440boot.bin在f:, 如果正常, 将报告检测到CPU, 接下来出现四个选项:
0:K9S1208 prog 1:K9S1G08 prog 2:28F128J3A prog 3:EXIT
选1, 之后的选项都选0, 可以看到烧写开始, 烧写完成后选择2退出程序, 如图1所示。
4 内核的配置编译及移植
4.1 准备工作
在 http://www.kernel.org/下载Linux2.6.28.7内核源码包, 下载关于ARM平台的补丁包patch-2.6.28gz, 还需要在http://www.aleph1.co.uk/cgi-bin/ ... fs2.tar.gz?view=tar下载最新的yaffs2文件系统驱动。在虚拟机RedHatLinux9下对内核源码包解压, 给Linux2.6.28.7打补丁, 使用命令:zcat ../patch-2.6.28.gz|patch -p1 。解压yaffs2文件系统补丁包, 进入该解压后的文件目录, 给内核打补丁:./patch-ker.sh c/ linux-2.6.28.7内核绝对路径。
4.2 配置内核文件
4.2.1 修改Makefile文件
编辑内核根目录下的Makefile文件, 目的是设置目标平台和指定交叉编译器。找到ARCH和CROSS_COMPILE, 修改ARCH = arm;CROSS_COMPILE = /交叉编译工具路径/arm-linux- , 保存退出。
4.2.2 设置分区信息
修改arch/arm/plat-s3c24xx/common-smdk.c文件。分区信息一定要与BootLoader一致, 以实验中目标板为例, 文件系统fs_yaffs必须在第4个分区, 即索引号为3。其他一些分区信息可以不要。修改如下:
4.2.3 修改Nand Flash驱动, 支持K9F1G08的Nand Flash
修改文件:drivers/mtd/nand/nand_bbt.c, 对以下两个部分进行修改:
4.2.4 把S3C2410的默认配置写入config文件
4.2.5 指定启动时初始化
修改arch/arm/mach-s3c2440/mach-smdk2440.c文件, 找到如下函数添加语句:
4.2.6 禁止Flash ECC校验
内核是通过Vivi写数据到Nand Flash的, Vivi通过ECC算法产生ECC校验码, 内核中的ECC码由S3C2440中Nand Flash控制器产生, 二者的ECC校验码不同, 所以, 禁止内核ECC校验。修改drivers/mtd/nand/s3c2410.c 文件:找到s3c2410_nand_init_chip () 函数, 将语句“chip->ecc.mode= NAND_ECC_SOFT;”改为“chip->eccmode=NAND_ECC_NONE;”。
4.2.7 支持启动时挂载devfs
为了使内核支持devfs, 以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。修改fs/Kconfig文件, 找到menu “seudo filesystems”, 添加如下语句:
4.2.8 修改晶振频率
修改晶振频率的目的是为了解决打印信息乱码问题。修改文件arch/arm/mach-s3c2440/mach-smdk2440.c 。将语句“:s3c24xx_init_clocks (16934400) ;”修改为“:s3c24xx_init_clocks (12000000) ;”。
至此, 需要修改的内核配置文件基本已完成, 其他配置文件的修改, 如DM9000网卡支持, SD卡支持, 声卡设备支持和LCD支持等都可根据目标板硬件实际情况进行相应的文件修改配置。接下来进行内核的配置编译工作。
4.3 内核的配置和编译
配置内核的命令有以下几种:make xconfig (用于X Window下的配置, 配置选项以图形的形式显示出来) ;make menuconfig (配置选项以文本菜单的图形界面显示) ;make config (配置选项以文本方式显示) , 一般来说, 文本菜单方式和文本方式配置方法较为常用[6]。首先拷贝默认配置文件cp arch/arm/configs/s3c2410_defconfig .config。然后输入命令make menuconfig, 配置信息的选择是根据自己目标板的硬件情况和项目开发需要决定的, 需要注意的是:
(1) 启动项设置 (这里以实验中使用的目标板为例) 。
|---Boot options| |---Default kernel command string: [root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0, 115200 devfs=mount mem=64m]
(2) CPU选项配置。
(3) yaffs2选项配置。
输入命令make zImage, 编译内核, 编译通过后, 在目录arch/arm/boot下生成zImage内核映像文件。上述步骤完成后, 就完成了对Linux内核的配置编译工作。最后将内核映像zImage下载到开发板Flash中的Kernel分区中。
5 根文件系统
文件系统 (File System) 指贮存在计算机上的文件和目录。传统PC机上根文件系统的挂载主要通过Ramdisk 加载或者直接挂载 HD (Harddisk, 硬盘) 来实现。嵌入式系统与通用PC机不同, 嵌入式系统从 Flash 启动。一种方法是将根文件系统加载到 RAM的Ramdisk。Ramdisk在开机时把一部分的内存虚拟成块设备, 并且把之前所准备好的文件系统映像解压到该Ramdisk环境中。另一种方法是MTD (Memory Technology Device) 驱动。JFFS2、Cramfs、YAFFS等文件系统都可以被安装成MTD块设备。MTD包含特定Flash芯片的驱动程序。Flash芯片驱动向上层提供读、写、擦除等基本的操作, MTD对这些操作进行封装后向用户层提供MTD char和MTD block类型的设备。 MTD char类型的设备提供对Flash原始字符的访问。MTD block类型的设备将Flash模拟成块设备, 这样可以在这些模拟的块设备上创建像Cramfs、JFFS2、YAFFS等格式的文件系统。
实验中所使用的根文件系统是YAFFS2, YAFFS2是YAFFS的另一个版本, 它与YAFFS最主要的区别是YAFFS2 能够更好地支持大容量的NAND FLASH芯片。 用BusyBox1.6.0制作根文件系统, BusyBox以很小的体积集成了最常用的Linux命令和应用程序, 大大简化了制作Linux根文件系统的过程。使用mkyaffs2image工具把根文件目录制作成映像文件qte.yaffs , 输入命令./mkyaffs2image qte_yaffs qte.yaffs, 最后把制作好的qte.yaffs下载到Nand Flash的根文件系统分区中。
整个过程完成后, 重新启动引导Linux系统, 通过SUMSANG公司开发的终端仿真程序DNW v0.50A可以看到移植完成后, 系统正常启动, 初始启动的部分信息如图2所示。经观察移植后的系统正常稳定运行。
6 结束语
本文系统地阐述了以S3C2440的ARM9处理器为硬件平台的嵌入式Linux系统的构建过程。构建嵌入式Linux系统是个复杂的课题, 其系统的实时性、安全性、稳定性、精简化等方面都需要开发人员在设计中进一步考虑。这里仅为开发者在ARM9平台下构建嵌入式系统提供方法参考, 也为后续嵌入式应用开发和驱动程序开发提供基础。
摘要:主要描述了在以ARM9处理器为硬件平台的基础上构建嵌入式Linux系统的过程和方法。ARM9选用的是三星公司的S3C2440, Linux内核版本号为2.6.28.7。文章首先从构建交叉编译环境入手, 接着介绍了BootLoader引导程序及移植, 然后详述了Linux2.6.28.7内核的移植过程, 最后说明了根文件系统。移植后的Linux在嵌入式系统中运行稳定。
关键词:ARM9,嵌入式,Linux,BootLoader,移植,根文件系统
参考文献
[1]桑楠, 雷航, 崔金钟, 等.嵌入式系统原理及应用开发技术[M].第2版.北京:高等教育出版社, 2008.
[2]Samsung Electronics Co Ltd.S3C2440A32-Bit RISC Micropro-cessor USER’S MANUAL[K/CD].Revision 1.Yongin-City:Samsung Electronics Co Ltd, 2004.
[3]BOVETD, CESATI M.深入理解Linux内核[M].陈莉君, 冯锐, 牛欣源, 译.北京:中国电力出版社, 2004.
[4]赵敏, 杨恢先, 汤安平.基于S3C2440的嵌入式Linux系统移植的研究与实现[J].电子器件, 2008, 31 (6) :1948.
[5]李亚锋, 欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京:清华大学出版社, 2007.
linux系统移植 篇9
嵌入式Linux系统移植的工作能否正常进行以及移植后系统能否正常运行, 与移植过程的几个小环节是分不开的。其实我们用于做嵌入式开发的ARM开发板, 它们也是一台简单的电脑来的, 也具备计算机系统的绝大部分接口。但是, 嵌入式开发板上一般都没有提供类似个人电脑 (PC机) 在主板上的BIOS程序段, 那么我们又怎样能使它们的部件运转起来呢?这只能靠我们用户自己去做一个类似BIOS的硬件启动程序, 该程序我们称作Boot Loader程序;另外就是即便是我们启动了硬件, 如何让我们的开发板能够更好地发挥它的功能呢, 那就是需要一个类似操作系统的大管家, 而嵌入式系统一般来说, 在硬件上是比较简单的 (考虑到成本) , 所以, 它不会象个人电脑那样有硬盘、光驱、软驱等之类的东西, 甚至内存都是比较小的, 因此, 我们在定制嵌入式操作系统的时候, 一般以“够用”为原则, 不需要浪费太多的存储空间而节省生产成本, 因此就需要对Linux操作系统的内核进行压缩映像, 这就是我们说的Linux内核的映像文件。那么在Linux嵌入式系统的移植过程中涉及到三个文件, 这三个文件分为:处于最底层的Boot Loader引导程序、Linux内核的映像文件、另外就支持用户操作使用的根文件系统。所以, 本文从这三个文件的制作过程中谈论我们要注意的关键环节。
2 Boot Loader引导程序uboot制作的关键环节
bootloader的两大功能:一是下载功能, 既通过网口、串口或者USB口下载文件到RAM中;一是对flash芯片的读写功能。具体来说:当用户输入启动Linux的命令的时候, u-boot会将kernel映像 (z Image) 和从nand flash上读到RAM空间中, 为内核设置启动参数, 调用内核, 从而启动Linux。
Uboot是严重依依赖于硬件的体系结构的, 而我们从网上下载的u-boot源代码只是提供了一种框架结构, 如果要制作适合我们自己的开发板的引导程序uboot, 必需在它的基础上进行修改。下面介绍uboot制作过程中的关键步骤:
1) 建立适合自己开发板的board平台目录
可以参照board/smdk2410目录, 在源码的board下建立自己的平台目录比如:gxy (这是开发板的名称起名叫gxy, 可以依自己的喜好随意起) , 并将board/smdk2410目录中的所有文件拷贝到gxy目录下, 将smdk2410.c更名为gxy.c。
2) 用vi修改u-boot顶层目录下的Makefile文件
在u-boot顶层目录下的Makefile文件中找到:
smdk2410_config:unconfig
@./mkconfig$ (@:_config=) arm arm920t smdk2410 NULL s3c24x0
在其后面添加:
gxy_config:unconfig
@./mkconfig$ (@:_config=) arm arm920t gxy NULL s3c24x0
各项的意思为:arm:CPU的架构 (ARCH) ;arm920t:CPU的类型 (CPU) , 其对应于cpu/arm920t子目录;gxy:开发板的型号 (BOARD) , 对应于board/gec2410目录;NULL:开发者/或经销商 (vender) ;s3c24x0:片上系统 (SOC) 。
3) 修改board/gxy/Makefile文件
将OBJS:=smdk2410.o flash.o改为OBJS:=gxy.o flash.o
4) 以include/configs/smdk2410.h文件为蓝本复制一个include/configs/gxy.h文件。
Cp include/configs/smdk2410.h include/configs/gxy.h
5) 修改cpu/arm920t/config.mk文件。
将PLATFORM_CPPFLAGS+=$ (call cc-option, -mapcs-32, -mabi=apcs-gnu)
改为PLATFORM_CPPFLAGS+=$ (call cc-option, -mapcs-32, $ (call cc-option, -mabi=apcs-gnu) )
6) 在uboot顶层目录中设置交叉编译环境变量后直行编译, 执行下列语句:
export PATH=/usr/local/arm/2.95.3/bin:$PATH;make gxy_config;make all ARCH=arm
编译过程如果不出现错误, 则可正常生成u-boot.bin了。
3 Linux内核的映像文件z Image制作的关键环节
当把Linux内核文件下载后, 制作Linux内核的映像文件z Image需要经过以下几个环节: (假设用的内核版本为Linux2.6.8.1, 编译器为ross-3.3.2)
3.1 修改Linux内核顶层下的Makefile文件
修改内核目录树根下的的Makefile, 指明体系结构是arm, 交叉编译工具是arm-Linux-。找到ARCH和CROSS_COMPILE, 修改为:
ARCH?=arm
CROSS_COMPILE?=arm-Linux-
3.2 设置flash分区
在arch/arm目录中建立一个mach-gxy的文件夹, 并将arch/arm/mach-s3c2410目录下的所有文件及文件夹复制到mach-gxy目录下, 并将相应的文件名进行修改。再修改下面三个文件的相关信息:
arch/arm/mach-gxy/devs.c;指明分区信息
arch/arm/mach-gxy/mach-smdk2410.c;指定启动时初始化
drivers/mtd/nand/gxy.c;禁止Flash ECC校验
3.2.1 内存分区信息
内存分区信息如上图, 则修改结构体partition_info[]为如下内容:
在结构体nandset中添加Nand Flash分区信息:
struct s3c2410_nand_set nandset={
nr_partitions:4, /*指明partition_info中定义的分区数目*/
partitions:partition_info, /*分区信息表*/}};
在结构体superlpplatform中提供Nand Flash芯片支持,
在结构体s3c_device_nand中添加Nand Flash芯片支持到Nand Flash驱动对dev成员的赋值
3.2.2 指定启动时依据我们对内存的分区设置进行初始化配置
修改arch/arm/mach-gxy/mach-smdk2410.c文件中的smdk2410_devices[].指明初始化时包括我们在前面所设置的flash分区信息
static struct platform_device*smdk2410_devices[]__initdata={&s3c_device_usb,
&s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, /*添加后面的语句即可*/&s3c_device_nand, };
3.2.3 禁止Flash ECC校验
我们的内核都是通过UBOOT写到Nand Flash的, UBOOT通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由gxy中Nand Flash控制器产生的。所以, 我们在这里选择禁止内核ECC校验。修改drivers/mtd/nand/gxy c文件中s3c2410_nand_init_chip () 函数, 在该函数体最后加上一条下面的语句即可。
3.3 支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统, 在fs/Kconfig文件中找到menu"Pseudo filesystems", 添加如下语句:
3.4 配置编译内核
复制arch/arm/configs/目录下的smdk2410_defconfig为当前目录下的.config文件;
执行make smdk2410_defconfig;
再执行make menuconfig;
在smdk2410_defconfig基础上, 增加一些相应的内核配置选项如:
保存退出, 产生.config文件。再执行make编译完成后会在arch/arm/boot/目录下生产z Image内核映象, 这就是我们要移植到开发板上的内核映象文件。
4 根文件系统rootfs制作的关键环节
4.1 建立工作目录 (根目录)
设定根目录为/root/build_rootfs/, 下载busybox到该目录, 该目录就是我们要移植到目标板上的目录, 对于嵌入式的文件系统, 根目录下必要的目录包括bin, dev, etc, usr, lib, sbin, 并在各目录中复制相应的文件。
4.2 交叉编译busybox
首先, 添加交叉工具链:export PATH=/usr/local/arm/3.3.2/bin:$PATH;
其次, 配置busybox, 执行:make defconfig, make menuconfig进行相应项的配置比如:
Busybox setting->builds options->[*]build busybox as a static binary;
Busybox setting->installitation options->[*]don’t use/usr等根据自己的需要进行选项配置。
最后, 编译安装, 执行:make ARCH=arm CROSS_COMPILE=arm-Linux-CONFIG_PREFIX=/root/build_rootfs/rootfs all install语句,
其中:ARCH指定平台, CROSS_COMPILE指定交叉编译, CONFIG_PRRFIX指定安装的路径。
4.3 copy C库
交叉应用程序的开发需要用到交叉编译的链接库, 交叉编译的链接库是在交叉工具链的lib目录下;我们在移植应用程序到我们的目标板的时候, 需要把交叉编译的链接库也一起移植到目标板上, 应从/usr/local/arm/3.3.2/lib目录来拷贝库, 此目录下有四种类型的文件。实际的共享链接库如:libc-2.3.2.so;主修订版本的符合链接如:libc.so.6;与版本无关的符合链接 (链接到主修订版本的符合链接) 如:libc.so;静态链接库包文件如:libc.a。以上四种类型的文件, 我们可以只需要两种:实际的共享链接库;主修订版本的符合链接, 还有动态连接器及其符号链接。拷贝交叉链接库, 我们最好是写一个.sh文件来完成, 如在/usr/local/arm/3.3.2/lib目录下编写:cp.sh文件, 内容如下:
保存退出, 执行:source cp.sh命令, 这样就把链接库复制过来了。当然如果需要把刚复制过来的体积缩小, 可执行:arm-Linuxstrip–s/root/build_rootfs/rootfs/lib/lib*语句来完成。
4.4 建立配置文件
内核启动的最后, 会执行sbin/init程序, init程序在启动的最后会执行/bin/sh, sh在启动的时候会读取/etc/profile文件。可以在etc/profile文件里设定PATH, LD_RARYLIB_PATH环境变量, 目的是配置用户程序运行的环境, 配置该文件内容如下:
保存退出
4.5 制作cramfs映像
制作cramfs映像, 需要用到mkcramfs工具, 把它复制到“/root/build_rootfs”目录下。执行:./mkcramfs rootfs rootfs.cramfs命令, rootfs.cramfs就是我们要烧写到目标板的映像文件。
5 烧写到开发板上
至此, 三个文件算全部制作好, 接下来就是把这三个文件烧写 (下载) 到开发板上了。
首先, 可以用DNW工具将uboot下载到开发板上, 先选择0或者1, 按”N”;再选择2则可将uboot烧锅写到开发板上。
其次, 用TFTP烧写内核, 可执行下列语句完成:
tftp 0x30008000 z Image
nand erase 0x40000 0x1c0000
nand write 0x30008000 0x40000 0x1c0000
第三, 烧写根文件, 可执行下列语句完成:
tftp ox30008000 rootfs.cramfs
nand erase 0x200000 0x1e00000
nand write 30008000 0x200000 0x1e00000
第四, 设置自动运行:
SETENV BOOTCMD NAND READ 30008000 0x40000 0x1c0000
go 30008000
Saveenv
第五, 重启开发板, 则整个Linux在gxy开发板上的移植工作完成。
6 结束语
本文对Linux在嵌入开发板移植的实际制作过程中必不可缺少的重要环节作了详细的介绍, 使得让从事嵌入式研究与开发人员少走不必要的弯路。我坚信, 在不久的将来, 会有越来越多的人从事嵌入式的行业里来, 本篇对从事嵌入式Linux系统的移植有很好的启发作用。
参考文献
[1]Linux内核源代码包 (版本2.6.8.1) .
[2]DANIEL P.BOVET&MARCO CESATI.UNDERSTANDING THE Linux KERNEL.
[3]基于Linux嵌入式系统的研究与实现[J].计算机系统应用, 2004.
[4]基于Linux的嵌入式系统的启动设计[J].电子科, 2004.
linux系统移植 篇10
关键词:嵌入式视频处理平台,ARM,Linux,移植
0引言
嵌入式系统开发已经进入32位时代,在当前数字信息技术和网络技术高速发展的后PC时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术等各个方面。
嵌入式系统通常由硬件和软件两个大部分组成。其硬件部分的核心部件就是各类嵌入式微处理器,并配置存储器、I/O设备、通信模块等必要的外设。目前市场上主流销售的32位嵌入式处理器有Motorola、MIPS、ARM等系列,其中ARM以其体积小、成本低、功耗低、性能高等特点成为嵌入式系统设计的首选。
软件部分一般由嵌入式操作系统和应用软件组成。嵌入式操作系统是一种支持嵌入式应用的操作系统软件,它负责全部软硬件资源的分配和调度、控制协调等活动。从20世纪80年代末开始,陆续出现了很多典型的嵌入式操作系统,如Linux、μC/OS、Windows CE等,其中使用最广泛、最受欢迎的是Linux,这是由于其源代码公开、可移植性好等优点[1]。
1嵌入式视频处理平台和Linux系统移植
本文开发的嵌入式视频处理平台在达芬奇 (DaVinci)数字媒体技术平台TMS320DM6446上进行的。此平台是以嵌入式处理器ARM为中心,由存储器、I/O设备、通信模块以及电源等必要的辅助接口组成。它的工作流程如图1所示。摄像头将视频信号传输进来后,再通过视频采集卡转换成数字信号然后送入TMS320DM6446,经过处理后通过视频输出接口在LCD(液晶显示器)上显示,在此过程中可以由USB口上所接的操纵杆进行控制,以及与存储设备进行存取操作。
此嵌入式视频处理平台主要应用于视频和图像的处理,如进行视频跟踪、图像的编解码等。
本文详细阐述如何在TMS320DM6446平台上进行Linux系统移植,形成了一个完整的Linux移植体系,为后续在此平台上的开发搭建了一个良好的平台,其移植流程如图2所示。
2交叉编译环境的建立
开发一个嵌入式Linux系统,首先要建立良好的交叉编译环境。所谓交叉编译环境,是由编译器、连接器和解释器组成的综合开发环境。交叉编译是嵌入式系统开发过程中的一项重要技术,它的主要特征是某机器中执行的程序代码不是在本机编译生成,而是由另一台机器编译生成。一般把前者称为目标机(target),后者称为宿主机(host)。在宿主机上编译好适合目标机运行的代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试,其交叉编译开发模型如图3所示。
建立ARM的交叉编译环境主要用到的开发工具有:binutils、gcc、glibc。其中binutils是二进制文件的处理工具,它主要包含了一些辅助开发工具,例如objdump显示反汇编码、nm列出符号表、readelf显示elf文件信息及段信息等。这些工具在嵌入式开发初期,尤其是移植调试操作系统时非常有用;gcc是用来编译内核代码的工具,可以编译汇编语言和C语言的程序,生成ARM的代码;glibc是一个提供系统调用和基本函数的C语言库,所有动态链接的程序都要用到它。将这些开发工具包下载到宿主机上进行编译、安装,即可创建ARM的交叉编译环境[2]。
3BootLoader的设计
BootLoader即引导加载程序,是在操作系统内核运行之前运行的一段程序。它建立起操作系统运行的环境,包括初始化硬件、建立存储空间映射和传递给操作系统一些基本的配置参数等。因此,Bootloader是非常重要的组成部分,它独立于操作系统,必须由用户自己设计,而且其实现高度依赖于硬件。在系统存储的空间分配结构中BootLoader、内核启动参数、内核映像和根文件系统映像的关系如图4所示。
BootLoader的作用是正确地调用内核来执行。系统开机后,执行的第1条指令是从Flash的0x00地址开始的,BootLoader程序就是放在此。由于它是直接操作硬件且依据硬件环境不同而代码不同,所以适合用汇编语言写,以达到短小精悍执行效率高的目的;内核从Flash复制到SDRAM时,采用C语言实现,能实现较复杂的功能,因此BootLoader的设计分为两个阶段。用汇编语言实现的放在第1阶段,主要完成硬件初始化,设置SDRAM,然后把Boot-Loader从Flash复制到SDRAM的起始地址,即2M处,最后内存重映射,Flash地址从0x00-0x1ff映射成0x1000000-0x11fff,SDRAM地址0x200000-0x1lfff映射成0x00-0xfff,至此控制权交给了用C语言实现的loaderkernel( )函数,就进入了第2阶段。第2阶段是用C语言实现的,它主要完成内核从Flash到SDRAM的复制,然后控制权交给Kernel,流程如图5所示。这样设计代码会具有很好的可读性和可移植性[3]。
本系统BootLoader的第1阶段设计包括:
a)关闭看门狗程序,屏蔽所有中断;
b)设置处理器时钟和工作频率,TMS320-DM6446中ARM9的工作频率为300 MHz;
c)初始化外部寄存器;
d)初始化堆栈指针;
e)复制BootLoader的第2阶段到RAM空间中,使用一条跳转语句跳转到第2阶段的C程序如入口处。
第2阶段用C语言编写,具体步骤如下:
a)设置通用I/O口参数;
b)初始化内存映射和内存管理单元;
c)初始化mtd设备;
d)复制Flash中的Kernel映像和根文件系统映像到RAM空间中;
e)跳转到内核的第1条指令处,跳转时需要满足这些条件:R0=0,R1=机器类型ID,R2=启动参数,同时禁止中断(IRQ和FIQ),CPU设置为保护模式,关闭MMU和数据Cache。
这样,本系统的BootLoader就设计完成了,下面就可以进行Linux内核移植。
4Linux内核移植
Linux内核主要由5个子系统构成:
a)进程调度(Process Scheduler):负责控制进程对CPU的使用。
b)内存管理(Memory Manager):标准Linux的内存管理支持虚拟内存,进程代码、数据和堆栈的总量可以超过实际内存的大小。
c)虚拟文件系统(Virtual File System):隐藏了不同硬件的具体细节,为所有设备提供统一的接口。
d)网络接口(Network Interface):负责支持标准的网络通信协议和各种网络硬件设备。
e)进程间通信(Inter-Process Communica-tion):支持进程间各种通信机制。
根据嵌入式系统的特点,要使嵌入式Linux系统具备一定的功能且保持小型化,应包括启动加载程序、内核、初始化进程,以及硬件驱动程序、文件系统、必要的应用程序等。
不管是哪一款嵌入式处理器,完成移植工作就要修改所有与体系结构有关的代码,主要指内核入口、处理器初始化、I/O口映射等。具体操作如下[1]:
(1)修改配置文件
a) 打开根目录下的Makefile文件,指定目标平台ARCH=arm;指定交叉编译器CROSS_COMPILE=arm-linux-gcc;
b) 打开/arch/arm目录下的Makefile文件,添加内核起始运行地址,即image.ram应下载的位置,该位置一般在RAM区起始地址偏移0x8000处;
c) 打开/arch/arm/boot目录下的Makefile文件,指定Bootloader的压缩内核解压后数据的输出地址。
(2)编译Linux内核
在完成上述工作后,开始编译Linux内核,生成目标代码。在内核源代码目录下依次键入以下命令:
a) make clean:清除以前构造内核时生成的所有目标文件、模块和临时文件;
b) make dep:搜索Linux输出与源代码之间的依赖关系,并以此生成依赖文件;
c) make menuconfig:调用菜单式的配置内核界面,内核配置的选项非常多,根据自己系统的具体情况选择合理的配置,在内核配置时选上相应型号的硬件;
d) make zImage:编译内核,生成压缩的Linux内核目标代码zImage文件;
e) make modules:编译块模块驱动程序,凡是在menuconfig中被选为
至此,已编译好能在本系统上运行的Linux内核。
(3)创建JFFS2文件系统
文件系统是Linux系统的重要组成部分。本系统使用mkfs.jffs2工具创建JFFS2文件系统。首先建立
/bin、/sbin等目录,然后复制命令工具到/bin文件夹,复制系统控制程序到/sbin目录下,复制应用程序运行时所需的库到/lib,库文件可从PC机的交叉编译工具安装目录下复制。最后键入命令:mkfs.jffs2 -o jffs2 root.jffs2,生成JFFS2根文件系统。
上述工作完成后,将BootLoader、Linux内核、文件系统烧写到TMS320DM6446的Flash中,这样就能运行Linux系统了。
5设备驱动程序开发
5.1Linux设备驱动程序开发步骤
Linux系统设备分为字符设备、块设备和网络设备3种。其设备驱动的开发主要包括:
a)在驱动程序源文件中定义file_opera-tions结构,并编写出设备需要的各个操作函数,对于设备不需要的操作函数用NULL初始化,这些操作函数将被注册到内核中。
b)定义一个初始化函数,在Linux初始化时会调用此函数。此函数包含:初始化驱动程序要用到的硬件寄存器;初始化与设备相关的参数;注册设备;注册设备使用的中断和函数;其他一些初始化工作。
c)对于驱动程序的使用,可以进行静态编译,也可以进行动态编译。静态编译是指将设备驱动程序添加到内核中,动态编译是指将设备驱动程序编译成驱动模块。
本嵌入式系统主要用于视频处理,涉及到的外设主要是显示设备和输入设备。这里采用的显示设备是LCD,而输入设备是通过USB接口与系统相连的。
5.2LCD显示驱动程序开发
LCD的设备驱动程序属于字符设备的驱动,应按照字符设备的规则编写。在Linux下进行LCD显示用Framebuffer技术,这是提取图形的设备,是用户进入图形界面很好的接口。Linux内核根据硬件描述抽象出Framebuffer设备,供用户态的进程直接进行写屏。可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,写操作立即反应在屏幕上。Framebuffer的设备文件一般存放在/dev这个目录下,对此设备文件进行操作即可实现图像的显示[5]。
LCD显示驱动程序主要包括:
a)LCD驱动的文件结构:包括打开设备文件、设备文件其它操作、关闭设备文件等;
b)LCD的打开:LCD设备以读写的方式打开;
c)LCD设备的硬件初始化:包括注册LCD设备、卸载LCD设备等;
d)LCD相关结构的设置:以获取显存起始地址、分别率、色深等;
e)映射内存区的操作:包括初始化显存清零等,将摄像头采集到的图像数据读至显存处,以显示图像;
f)LCD控制输出:包括得到命令、画水平线、画垂直线、画圆等;
g)LCD的关闭。
将上面的内容用程序实现,进行动态编译。通过后,将LCD驱动模块进行移植加载,一个完整的LCD驱动就开发完毕了。
5.3USB驱动程序开发
与LCD设备不同,USB既不属于字符设备,也不属于块设备,而是一个新的设备类别,设计框架和流程如下[6]:首先,提供一个“.o”的驱动模块文件,且在一开始就加载运行。USB驱动就会根据其类型向系统注册。注册成功后,系统会反馈一个主设备号,这个主设备号就是其唯一标识。USB驱动就是根据主设备号创建一个放置在/dev目录下的设备文件。要访问此硬件,可用open、read和write等命令访问相应的设备文件,驱动就会接收到相应的read或write函数,根据模块中相对应的函数进行操作。驱动流程见图6。
USB驱动的具体设计过程如下:
a)USB驱动的注册。USB驱动程序在注册时会发送一个命令给函数register_chrdev,通常在驱动程序的初始化函数中。当USB设备插入时,为了使linux-hotplug(Linux中USB等设备热插拔支持)系统自动装载驱动程序,需创建MODULE_DEVICE_TABLE,在此过程中需将USB的主设备号传递给相应的函数。
b)USB设备的打开。打开设备是通过调用file_operations结构中的函数open( )来完成的。其主要完成的任务是:检查设备相关错误,如果是第一次打开,则初始化硬件设备;识别次设备号;使用计数增1。
c)USB设备的释放。释放设备是通过调用file_operations结构中的函数release( )来完成的。它的作用正好与open()相反,通常要完成这样的工作:使用计数减1,如果使用计算为0,则关闭设备。
d)USB设备的控制信息与数据读写。USB设备驱动程序可以通过文件操作结构中的函数向应用程序提供对硬件进行控制的接口,同时读写操作也要通过此函数来完成。
e)USB驱动的注销。当从系统卸载驱动程序时,需要注销USB设备,这样必须编写一个注销函数unregister_chrdev。
6结束语
本文基于TMS320DM6446平台实现了Linux移植,包括创建交叉编译环境、BootLoader的设计、Linux内核移植以及LCD、USB设备驱动程序开发,为实时视频处理应用开发创建了一个良好的嵌入式平台,在此平台上可进一步进行应用程序、GUI及视频处理算法开发与测试。
参考文献
[1]孙天泽,袁文菊,等.嵌入式设计及Linux驱动开发指南:基于ARM9处理器[M].北京:电子工业出版社,2005:1-10,126-137.
[2]尤盈盈,孟利民.构建嵌人式linux交叉编译环境[J].计算机与数字工程,2006,34(6):30-32.
[3]白伟平,包启亮.基于ARM的嵌人式BootLoader浅析[J].微计算机信息,2006,22(4-2):99-100,53.
[4]徐英慧,马忠梅,等.ARM9嵌入式系统设计:基于S3C2410与Linux[M].北京:北京航空航天大学出版社,2007:353-362.
[5]刘峥嵘,张智超,等.嵌入式Linux应用开发详解[M].北京:机械工业出版社,2004.
相关文章:
如何在8位处理器上运行Linux02-27
Linux下查看文件和文件夹大小命令linux操作系统02-27
Linux安装mysql02-27
如何设置一个高容量的Linux POP3服务器服务器教程02-27
解决遗留问题的请示02-27
linux中shell 循环处理每天数据linux操作系统02-27
在Linux中如何恢复被删除的文件02-27
linux中./configure命令参数解析linux操作系统02-27
Linux开发系统02-27
Linux系统管理02-27