APP下载

嵌入式设备的Linux内核移植研究

2016-08-11韩占伟

淮北职业技术学院学报 2016年4期

韩占伟

(淮北职业技术学院 计算机科学技术系,安徽 淮北 235000)



嵌入式设备的Linux内核移植研究

韩占伟

(淮北职业技术学院 计算机科学技术系,安徽 淮北235000)

摘要:嵌入式设备在生活中扮演者越来越重要的角色,而Linux内核是Linux操作系统的核心。Linux操作系统能够提供丰富的应用功能和丰富网络功能都是在Linux内核提供的基础功能上实现的。在Linux操作系统的支持下,嵌入式设备的应用开发更加的丰富和完善。Linux内核移植的需求分析、环境搭建、详细设计等内容是嵌入式开发重要环节。

关键词:Linux内核;嵌入式设备;Linux操作系统

Linux 内核是Linux 操作系统的核心部分,包含了操作系统的文件管理、进程管理、内存管理等,并且还加入了对许多外部设备的驱动支持。Linux 内核主要有5个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。[1]Linux内核的移植是嵌入式应用开发过程必不可少的环节。对于各种类型的嵌入式设备,这里的Linux 内核却可以通过丰富的驱动和丰富的库函数来支持不同类型的嵌入式设备。

一、Linux内核移植设计分析

(一)需求分析

Linux内核介于设备硬件驱动和系统调用接口之间,对Linux操作系统提供了最核心的功能支持。[2]Linux内核对x86、arm等很多的主流硬件架构都提供了支持,并且在内核的drivers目录里包含了很多的设备驱动代码文件。以上的优势让Linux操作系统逐渐成为嵌入式应用开发中使用较多的操作系统。Linux内核在移植过程中需要实现对嵌入式CPU的支持、对板卡的支持和对各种外设的支持。下面通过对Linux目录的分析来说明Linux内核在移植过程中需要处理的相关内容。

图1 Linux操作系统结构图

(二)Linux内核的目录及编译过程

Linux内核的移植是一个复杂的工作,要对内核的目录和编译过程有深入的了解。Linux内核实现了对许多类型架构cpu和主板的支持。在Linux内核目录里面有很多的子目录,每一个子目录里面有很多的代码相关文件和下一级子目录,要进行移植的话就要对Linux内核的目录结构熟悉。Linux内核具体的目录包括:

arch目录:Linux内核对硬件体系架构的支持代码,对于支持的每个架构的cpu都有一个对应的子目录。

Block目录:块设备的通用函数,是所有块设备的通用功能函数的封装,具体细节功能的实现在drivers目录里有相应的设备驱动代码。

crypto目录:对操作系统需要的一些压缩和CRC校验算法的实现和支持。

drivers目录:内核所有支持类型设备的驱动目录,每一个子目录里对应一类接口或类型设备,每一个子目录里又包含了很多同一类型的不同功能类型的设备,比如usb目录里面包含了usb接口的摄像头设备、存储设备、打印设备,等等。

fs目录:Linux支持的文件系统的代码,是Linux能够识别和使用各种类型文件系统的实现代码。

include目录:配置内核需要的头文件。该目录里包含了各种体系相关的头文件、各种类型设备的驱动或功能部件的头文件。

init目录:内核的初始化代码。[3]

ipc目录:进程间通信的实现代码,通过它可以实现对Linux进程之间进行通信的功能。

Kernel目录:内核管理的核心代码。

lib目录:内核用到的一些库函数代码。

mm目录:通用的内存管理代码。

net目录:包含内核对网络功能支持的实现代码,每个子目录里对应网络的一个方面。

security目录:系统安全和密钥的相关代码文件。

sound目录:音频设备的驱动程序。

usr目录:制作initrd镜像的代码文件,它的作用是内核在引导时提供临时的根文件系统的作用。

Documentation目录:内核相关的帮助文档文件,包含了内核功能相关的说明文件。

Scripts目录:用于配置、编译内核的脚本文件。

Linux内核的编译过程:

Linux内核目录里面包含了很多的Makefile文件和配置文件.config。配置文件.config在配置内核时生成。所有Makefile文件(包括顶层目录及各级子目录)都是根据.config来决定使用那些文件。顶层目录的Makefile文件是所有Makefile文件的核心,从总体上控制着内核的编译和连接。而很多对应的cpu类型的目录和各种类型的外设子目录等里面都包含有Makefile文件。子目录的Makefile文件主要是对当前目录内的相关代码文件和头文件编译过程的控制,它决定所在目录下哪些文件将被编译进内核,哪些文件将被编译成模块。编译的内容最终组成一个针对这种特定硬件组合的Linux内核。

(三) Linux内核移植的交叉编译技术环境的搭建

由于Linux内核对应于不同的设备生成的内核映像文件是不同的。尤其是嵌入式设备由于自身硬件架构的不同、外部设备类型的多样性以及Linux内核的可裁剪性使得生成的Linux内核映像文件与PC上的Linux内核映像文件相差很大。需要使用专门针对于对于嵌入式设备开发的编译工具来完成,但是嵌入式设备一般不使用键盘和鼠标作为输入输出设备,造成了在嵌入式设备上对Linux内核代码文件进行修改和Linux内核的编译非常困难。于是通过直观便利的PC技术结合交叉编译的工具来实现对嵌入式设备Linux内核的修改和编译。基于windows界面的交叉编译工具相对来讲价格较高并且配置比较麻烦,本文使用基于Linux操作系统的交叉编译工具,这种方式不需要支付额外的开发工具购买的成本、配置比较简单,运行也更加高效。Linux内部的编译工具效率很高,但是对于习惯使用图形界面工具的人们来说很不习惯。

常用的办法是使用一台台式机,在台式机上安装windows操作系统,并在windows操作系统的基础上通过虚拟平台软件虚拟出一台具有Linux操作系统的虚拟机器。让安装windows操作系统和虚拟机中的Linux操作系统能够通过网络传输工具实现文件的传输。嵌入式设备通过JTAG接口、usb接口、网卡接口等方式与电脑相连。这样就构成了主机和目标机连接的交叉开发模式。

(四)Linux内核移植的详细设计

Linux内核的移植一般分为四个部分:对CPU Core(CPU核心)的支持、CPU的支持、对SOC片上系统的支持(类似于电脑的主板)、外围设备驱动程序开发。

首先要从Linux内核的官方网站http://www.kernel.org/下载需要进行移植的Linux内核并进行解压。

$ cd /path/to/ destination (内核存放目录)

$ tar xjf linux-2.6.22.6.tar.bz2(解压内核文件)

$ cd /path/to/ destination/ linux-2.6.22.6

内核移植的具体步骤如下:

(1) 对嵌入式设备硬件系统进行熟悉了解

进行移植时要先对嵌入式硬件相应的内容进行熟悉,包括电路图和要移植嵌入式设备的CPU和各种外设的芯片手册、CPU体系结构及汇编语言的使用方式,了解板卡的地址空间分布情况,掌握CPU的通用寄存器和集成在微控制器内的外设寄存器、了解硬件的原理图等内容。对各个外设的控制寄存器的功能,尤其是对控制寄存器各个二进制位的作用和取值情况进行对应,对芯片工作的时序图能够理解。

(2) 建立交叉编译环境

可以根据需要使用的GCC编译器版本和GNU发布的libc库的版本下载已经制作好的,也可以从网上下载源码进行制作。例如:

$ cd /path/to/ destination (工具链存放目录)

$ tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2

然后在环境变量PATH中增加它的路径,以后就可以直接使用里面的编译工具对程序进行编译了。

$export PATH=$PATH:/work/tools/ gcc-3.4.5-glibc-2.3.6/bin

(3) 编写Bootloader

Bootloader的主要作用是:

第一,对嵌入式硬件系统进行基本的初始化,包括关闭看门狗,关闭中断,设置CPU的工作频率,RAM内存的初始化等;第二,获得硬件的参数保存下来并把它传递给内核,包括ip地址、串口波特率、要传递给内核的命令行参数等;第三,准备好内核运行的软件环境并引导Linux内核,主要包括把内核镜像和根文件系统映像从FLASH上读入RAM中,设置好堆栈空间等。

(4) 对Linux内核的裁剪

Linux内核的特点就是可以进行裁剪,可以根据需要修改内核的配置文件,进行对内核中多余的内容进行去除,只保留内核最基本的功能。从而实现内核的简洁和高效,根据嵌入式开发板对应的CPU型号、板卡型号、各种外设型号等等进行修改配置文件,通过命令的方式进行编译出适合对应开发板的内核。

$ cd /path/to/linux-2.6.22/ (进入内核主目录)

$ cp config_ok .config(config_ok为修改好的配置文件)

$ make uImage (生成uImage文件,为嵌入式设备使用的内核映像文件)

(5) 建立根文件系统

Linux内核运行时需要挂载临时的根文件系统,但是Linux内核中没有硬盘设备的驱动(种类太多,驱动会大大增加内核的大小),于是在内存中使用软件技术虚拟出临时的根文件系统(initrd RAM磁盘),里面包含了各种可执行程序和驱动程序,通过虚拟的临时根文件系统的驱动识别块设备后,就会将initrd RAM磁盘卸载,并释放内存。

对于嵌入式设备一般使用NAND Flash作为大容量存储设备。NAND Flash设备由于自身的一些缺陷问题,比如字反转等问题的存在,需要使用专用的文件系统来进行管理。YAFFS就是一种类似与JFFS/JFFS2、专门为NAND Flash设计的嵌入式文件系统。我们要对YAFFS文件系统进行移植。

操作步骤:

从http://www.alep1.co.uk/cgi-bin/viewcvs.cgi/获得源代码文件。进行解压保存。

$ cd /path/to/ yaffs (进入保存YAFFS源代码的目录)

在yaffs目录下有一个脚本文件patch-ker.sh来给内核打补丁。

$ . /patch-ker.sh c /work/system/linux-2.6.22.6

(6) 驱动开发

这里主要是一些外设的驱动,可以参照在Linux内核目录中同类型的设备驱动进行修改。对于一些新型的外部设备或系统没有实现支持的设备类型需要自己参考外部设备的芯片手册和SOC系统的电路图进行编写,内容比较繁琐和复杂,这里不做讨论和研究。

二、 结论

Linux内核移植是一个复杂的过程,即使是同一块开发板,同一型号的CPU由于外部设备的不同也不能够进行直接的移植,也要进行相应的修改。尤其对于一些未实现支持的CPU类型来说就更加的困难,需要对CPU内部的寄存器及电路连接情况有深入的了解。本文阐述了常规的Linux内核的移植过程,以期让读者对Linux内核的移植步骤、内核的目录及编译过程有所了解。

参考文献:

[1]赵炯.Linux内核完全注释[M].北京:机械工业出版社,2004.

[2]陈莉君.Linux操作系统内核分析[M].北京:人民邮电出版社,2000.

[3]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.

责任编辑:净草

收稿日期:2016-06-05

基金项目:本文系安徽省高等学校省级质量工程项目“计算机应用技术专业综合改革试点”(编号:2013zy110) 、淮北职业技术学院质量工程项目“软件技术教学团队”(编号:2014jxtd-02)和淮北职业技术学院质量工程项目“技能型信息人才实践教育基地”(编号:2014jyjd-01)阶段性研究成果。

作者简介:韩占伟(1980-),男,安徽淮北人,助教,研究方向为嵌入式技术。

中图分类号:TP368.1

文献标识码:A

文章编号:1671-8275(2016)04-0131-03