嵌入式内核文件系统编译裁剪应用程序项目文档.docx
《嵌入式内核文件系统编译裁剪应用程序项目文档.docx》由会员分享,可在线阅读,更多相关《嵌入式内核文件系统编译裁剪应用程序项目文档.docx(61页珍藏版)》请在冰豆网上搜索。
![嵌入式内核文件系统编译裁剪应用程序项目文档.docx](https://file1.bdocx.com/fileroot1/2022-12/12/8514f645-bb68-4bc0-9056-c5ac709e4679/8514f645-bb68-4bc0-9056-c5ac709e46791.gif)
嵌入式内核文件系统编译裁剪应用程序项目文档
嵌入式系统与应用
基于PXA270平台动态变更CPU工作频率
指导教师:
李晓宁陈立文
小组成员:
林宇06382363
林锐圳06382362
黄智寿06382354
第一学期
2009.1
项目报告目录
1.项目总体方案与设计概述
1.1方案概述
本实验项目将在PXA270的实验平台上完成。
项目根据要求与实际的需要实现最小系统,裁剪linux内核,制作文件系统,生成BOOTLOADER并初始化最小硬件系统。
同时,本项目还将在这个实现的最小系统的基础上实现动态变更CPU工作频率方案:
加载驱动程序模块实现操作CPU时钟寄存器的功能,通过修改PLL(Phased-lockedloop)寄存器来设置新的运行速率。
而应用软件则向用户提供修改寄存器的接口,方便用户对CPU的运行速度以及运行模式的修改。
1.2功能模块:
本项目具备以下功能模块:
(1)平台构建模块:
a)裁剪生成Linux内核眏象。
b)生成Linux根文件系统。
c)生成BOOTLOADER并初始化最小硬件系统。
(2)设计开发模块
a)操作CPU时钟寄存器的驱动程序。
b)查询、修改CPU频率以及模式的应用程序。
1.3任务概述
1.3.1目标和原则
在PXA270实验板上构建项目平台,根据要求开发驱动程序,并且开发相应的应用程序,为用户提供查询CPU速率,修改CPU速率,修改CPU时钟的功能,本系统的主要服务人员角色有系统设计者和一般用户。
要求达到一下原则:
●良好的安全性。
本系统要具备一定的安全性机制,避免烧坏目标板。
此外,还要保证各种操作的合法性。
●简单性。
本系统应该简单易用,交互性好,符合一般用户的使用习惯
●实时性好,响应速度快。
本系统属于嵌入式系统,应该具备嵌入式系统应有的实时性,响应度要高。
1.3.2假定和约束
(1)假定:
本系统开发期限约为11天
交付期限为2009-2-24
(2)约束:
A.软硬件约束:
开发平台:
PXA270
操作系统:
Linux操作系统
编程语言:
C语言、汇编语言
开发工具:
GCC编译器,VI编辑器
B.系统质量约束:
正确性:
系统必须被正确执行
健壮性:
系统必须被长时间运行,而且能被多次执行
易用性:
系统运行的界面要交互性好
1.4需求规定
1.4.1功能规定
根据老师给出的要求,组员之间经过多次沟通,本系统设计小组确定了本项目的功能需求规定。
我们吸取了面向对象的分析建模方法,按照系统的实际需求生成下面一下用例,下面的描述统一用UML语言描述。
1.4.2场景与用例图
a.用例1-编译Bootloader
场景1
编译Bootloader
参与执行者
系统设计人员
前置条件
安装Linux系统,具备完整的Bootloader源程序
主流事件
1.用tar解压源程序包
2.用makeclean清除旧镜像
3.用Jflashmm烧写boot
辅助事件
1.配置以太网MAC地址
后置条件
目标板就绪
b.用例2-linux内核裁剪
场景2
Linux内核裁剪
参与执行者
系统设计人员
前置条件
版本为Linux2.6.9的内核
主流事件
1.解压内核包
2.进入解压后的目录
3.在终端输入makemenuconfig
4.在配置界面根据具体要求配置
5.在终端输入makezImage编译内核
6.使用Jflashmm烧录内核到目标板
辅助事件
无
后置条件
目标板就绪
c.
用例3-制作根文件系统
场景3
制作根文件系统
参与执行者
系统设计人员
前置条件
已安装linux系统,已安装创建程序mkfs.jffs2
主流事件
1.选择要制作的根文件系统为JFFS2
2.将创建程序mkfs.jffs2复制到用户目录下
3.编写r.sh的脚本来创建JFFS2文件系统映像
4.把文件系统镜像烧到目标板
5.测试文件系统
辅助事件
无
后置条件
目标板就绪
d.用例4-驱动设计
场景4
驱动设计
参与执行者
系统设计人员
前置条件
开发板已加载了boot和文件系统
主流事件
1.编写加载和卸载模块
2.编写打开文件设备的模块
3.编写CPU操作模块
3.1读取CPU时钟寄存器
3.2对CPU寄存器的读取值进行运算,得出CPU频率
3.3修改CPU时钟寄存器
3.4修改CPU的运行模式
4.编写释放文件设备的模块
辅助事件
无
后置条件
目标板就绪
e.用例5-操作CPU速率
场景5
操作CPU速率
参与执行者
用户
前置条件
应用程序已经烧到目标板上
主流事件
1.显示界面选择菜单
2.选择查询CPU速率
3.选择修改CPU速率
4.选择修改CPU模式
辅助事件
无
后置条件
目标板就绪
1.5性能规定
1.5.1精度
本系统涉及的数据类型包括:
int型,long型。
1.5.2时间特性要求
本系统属于嵌入式系统,在时间特性上有严格的要求,本系统的实时性要高,这体现在对用户的输入,要即时做出响应,平均响应时间不能超过1秒。
1.5.3灵活性
说明对该系统的灵活性的要求,即当需求发生某些变化时,该软件对这些变化的适应能力:
A.操作方式上的变化:
当发生非法操作时,系统弄够识别,拒绝执行
B.运行环境的变化:
无
C.同其他软件的接口的变化:
无;
D.精度和有效时限的变化:
对文档的修改,系统应该有一定的日志文件,在一定的时效内,可以根据日志文件进行恢复;
E.计划的变化或改进:
能根据不同的要求调整开发计划
1.5.4输入输出要求
本系统涉及到的输入输出数据类型只有字符串,整型。
本系统与用户的交互主要通过命令行菜单来传递消息。
1.6运行环境设定
1.6.1设备
列出运行该系统所需要的硬设备。
说明其中的新型设备及其专门功能,包括:
PC机:
装有linux操作系统
ARM开发板:
PXA270,网线,串口。
2.项目开发计划
本项目以理解嵌入式系统硬件、设备驱动、内核、文件系统及应用程序的构建与开发为主要目的。
项目开发全过程参考嵌入式系统与应用课程以往做过的实验,并在以往实验的基础上加上适合本项目的步骤以及代码。
严格遵守PXA系列的开发手册(IntelPXA27xProcessorFamilyDeveloper'sManual)上的指引以及说明进行开发制作。
在项目开发的过程中,不仅尽力完成李晓宁老师在“嵌入式系统与应用PROJECT设计要求及成绩计算方法”对本项目的最基本的功能要求(即查询与修改CPU运行速率),而且还在此基础上增加自己设想与上述成体系的功能(查询修改CPU运行模式),使应用程序的功能更加完善。
在项目开发前期,我们小组对项目做了一系列的开发准备,其中包括寻找相关资料,召开会议确定需求,对系统进行方案设计,完成系统功能模块的初步设计等工作,为项目的展开提供了必要的基础支持。
同时,小组各成员利用寒假的时间熟读IntelPXA27xProcessorFamilyDeveloper'sManual用户手册,特别是其中ClocksandPowerManager(79页开始)一章节的内容,该章节详细讲述了PXA27x处理器所支持的时钟与电源管理单元以及寄存器,特别是CCCR寄存器,CCSR寄存器以及CLKCFG寄存器的使用说明的章节中,其内容更是对本项目的开发有巨大的帮助。
本项目的开发计划表如下所示:
阶段
时间
内容
第一阶段
2009-2-9~2009-2-10
收集资料,召开会议
确定项目需求
第二阶段
2009-2-11~2009-2-12
Linux内核裁剪,生成内核映像
制作根文件系统
第三阶段
2009-2-13~2009-2-14
编写生成BOOTLOADER
始化最小硬件系统
第四阶段
2009-2-14~2009-2-16
编写驱动程序
第五阶段
2009-2-17
编写测试程序,编写应用程序
第六阶段
2009-2-18
设计测试用例,对系统进行测试
第七阶段
2009-2-19~2009-2-20
编写文档
预计本项目完成之后,将产生以下文件,源代码以及文档:
1)经过裁剪的linux内核文件;
2)经过剪裁的根文件系统;
3)重新设计的BOOTLOADER引导程序;
4)操作CPU时钟寄存器的驱动程序源代码
5)查询、修改CPU运行速率以及运行模式的应用程序源代码;
6)项目设计报告书。
本项目将于2009年2月20日星期五完成全部开发,并向老师提交以上文档,供老师验收评分。
3.项目平台构建
3.1编译Bootloader
通常PC机上常见的BIOS不会用在嵌入式系统中,Bootloader实现了这样的功能。
Bootloader初始化硬件如CPU、SDRAM、FLASH、UART、GPIO等等,并为用户提供系统引导等功能。
Bootloader的功能
初始化硬件
初始化CPUclock、Memorytimimg、interrupt、GPIO和UART。
启动Linux
这是Bootloader最重要的功能。
它将内核映像复制到SDRAM中并跳转到内核入口地指处。
下载Image
下载内核和文件镜像到SDRAM中。
下载只能通过以太网。
Flash存储器管理
用write,erase,lock,andunlock等命令管理Flash存储器。
实验室所使用的EELIOD开发板附带的Bootloader程序占用空间小,并且具备初始化硬件、启动Linux、下载内核和文件镜像的基本功能,所以我们使用该Bootloader程序来引导并初始化构建的最小化硬件系统。
将Bootloader的源程序复制到用户目录文件夹下,使用tar命令解压,进入到解压后的文件夹目录下,使用makeclean清楚之前编译生成的boot镜像,使用make重新编译生成新的boot镜像文件。
kuke@kuke-laptop:
~$tarzxvfBoot-XSBase270-2.6.tar.gz
kuke@kuke-laptop:
~$cdBoot-XSBase270
kuke@kuke-laptop:
~/Boot-XSBase270$makeclean
kuke@kuke-laptop:
~/Boot-XSBase270$make
要将Bootloader程序下载到目标开发板中,需要使用到JTAG。
EELIOD开发板也附带了JTAG所需的源程序。
用编译生成Bootloader程序的方法同样生成JTAG程序。
接下来要将Bootloader烧写到目标开发板中。
为了方便起见,将boot镜像复制到jflashmm所在的目录下,将目标开发板与主机相连,使用编译生成的jflashmm将Bootloader烧写到Flash存储器。
烧写成功后,关闭开发板的电源,在终端运行minicom,再打开开发板电源,若通过minicom能检测到开发板并显示开发板初始化界面,则说明Bootloader已正确烧写到开发板中并运行正常。
成功烧写Bootloader到目标开发板后,还要为开发板中的以太网芯片设置MAC地址,该地址必须与/etc/bootptab的字段相同。
这样才能通过bootp命令得到主机分配给开发板的IP地址,为以后使用tftp下载内核和文件系统做好准备。
具体操作步骤如下:
1)开发板上电后,敲主机键盘任意键停止Bootloader运行。
2)输入数字“0”,让Bootloader进入命令行模式。
3)输入以下命令设置以太网MAC地址
setmyhaddr12:
34:
56:
78:
9a:
00
4)输入“bootp”,让主机分配IP地址给开发板,同时也验证主机与开发板的连接是否正常,若分配不到IP地址,需要检查主机与开发板的连接线以及主机上bootp和xinetd的配置是否正确。
5)输入“quit”,回到菜单模式。
3.2Linux内核配置、编译和移植
内核是所有嵌入式Liunx系统的核心软件,内核移植是一个比较复杂的任务,也是嵌入式开发中非常重要的一个过程。
移植内核首先要确保准备好编译内核的工具,Linux内核归根结底也是一个程序,所以它必须通过编译器编译后才能在硬件上执行,由于我们的目标开发板是基于ARM结构体系的PXA27X处理器,所以需要能够编译出在ARM处理器上可以运行的程序,这时就需要交叉编译链工具了,实验室的主机上都已经预先构建了交叉编译工具链,因此我们可以省略这一步,直接进行内核的移植工作。
为了尽可能保持最大的兼容性,我们将要移植的内核源代码是实验室使用的EEliod开发板附带的EEliod_Linux_2.6.9,可以看出它的内核版本为Linux2.6.9,符合我们的项目需求。
内核移植一般包括内核配置、内核编译和内核下载3大部分,下面将分别概述内核移植的每一个步骤。
3.2.1内核配置
配置内核是构建一个嵌入式Linux系统内核的第一步,有好几种配置内核的方式,同时有很多内核的配置选项,由于我们使用的是开发板附带的内核源码,所以可以直接使用开发板的配置文件,再在此基础上针对本次项目所要构建的最小化系统的实际情况配置内核。
操作如下:
#cdEEliod_Linux_2.6.9
#makexsbase270edr_defconfig
#makeoldconfig
#makemenuconfig
Linux内核配置选项菜单界面
具体配置情况如下:
Codematurityleveloptions--->
Generalsetup--->默认
Loadablemodulesupport--->
需要开启动态模块加载功能和自动加载动态模块功能
SystemType--->
由于开发板使用的是PXA270处理器,所以在ARMsystemtype中选择PXA2xx-based
在Selecttargetboard中选择EELIOD开发平台
Generalsetup--->默认
Parallelportsupport--->不选择
MemoryTechnologyDevices(MTD)--->
需要选择MTD设备支持来支持FLASH等MTD设备
根据开发板选择正确的FLASH设备支持:
PlugandPlaysupport--->不选择
Blockdevices--->不选择
Multi-devicesupport(RAIDandLVM)--->不选择
Networkingsupport--->不选择
ATA/ATAPI/MFM/RLLsupport--->默认
SCSIdevicesupport--->不选择
FusionMPTdevicesupport--->默认
IEEE1394(FireWire)support--->默认
I2Odevicesupport--->默认
ISDNsubsystem--->默认
Inputdevicesupport--->默认
Characterdevices--->默认
I2Csupport--->默认
Multimediadevices--->不选择
Filesystems--->
去掉对ext2文件系统的支持以及DOS/FAT/NT文件系统的支持
设置对JFFS2的支持
Profilingsupport--->默认
Graphicssupport--->
去掉系统启动的logo文件
Sound--->不选择
Miscdevices--->默认
USBsupport--->不选择
MMC/SDCardsupport--->默认
Kernelhacking--->不选择
Securityoptions--->默认
Cryptographicoptions--->默认
Libraryroutines--->默认
3.2.2内核编译
配置好内核选项后保存配置文件,然后使用makezImage命令生成压缩的Linux内核映像文件。
若编译通过,将会生成Linux内核映像文件,由于我们要用的是能在ARM结构体系的处理器上运行的内核,所以应该使用/EEliod-Linux-2.6.9/arch/arm/下的zImage内核映像文件。
经过配置裁减后最终生成的内核映像文件大小为668.7KB。
3.2.3内核下载
下载内核需要用到bootp和tftp,实验室的主机上也已预先配置好了bootp和tftp,在下载内核前需要先确定bootp和tftp是否正常运行,若能正常进行,则可以继续以下步骤:
1)设置需要下载的镜像名:
在菜单模式下,选择“a”,按提示输入内核镜像名zImage,因暂时还不需要设置文件系统镜像名,所以可以不修改文件系统镜像名,将前面编译生成的内核镜像文件放到/tftpboot目录下。
2)下载内核镜像:
在菜单模式下,选择“3”,此时,内核镜像通过以太网下载到开发板的SDRAM上,若传输超时或失败,可以重新执行此选项。
3)烧写到Flash:
在菜单模式,选择“4”,将刚下载的内核镜像烧到Flash上
以上步骤正常结束后,内核镜像已烧入目标开发板的Flash中。
3.3创建Linux根文件系统
根文件系统是Linux系统启动的一个重要组成部分,也是操作系统正常工作是的必要组成部分,在启动内核时需要根文件系统来挂载。
在现代Linux操作系统中,内核代码映像文件保存在根文件系统中,系统引导启动程序会从这个根文件系统设备上把内核执行代码加载到内存中去运行。
3.3.1文件系统的基本目录结构
在根文件系统的最顶层目录中,每一个目录都有其具体的目的和用途,一般是根据FHS(FilesystemHierarchyStandard)定义建立一个正式的文件系统结构的。
FHS即文件系统结构标准,它在UNIX/Linux操作系统的文件系统中是用于确定在何处存储何种文件的标准。
FHS定义的根文件系统顶层目录如下
目录名内容
bin提供基本的用户命令库
boot用于Bootloader的静态文件
dev设备或其他的特殊文件
etc系统配置文件,包括启动文件
home多个用户的主目录
lib基本的系统库,例如C库、内核模块等
mnt用于临时挂载的文件系统
opt可选择的软件包
proc内核虚拟文件系统和进程信息
root根用户的主目录
sbin基本的系统管理二进制库
tmp临时文件
usr它的二级目录里包含许多应用程序和许多有用的文档
var一些变化的实例和工具等
由于我们构建的是基于Linux的嵌入式系统,所以并不需要以上所有的目录,但通常目录/bin、/dev、/etc、/lib、/proc、/sbin、/usr是必须有的。
3.3.2选择根文件系统
选择一个文件系统用于根文件系统是一个取舍的过程,最后的决定往往是对一个文件系统性能和目标用途的折中。
通常选择一个文件系统需要注意以下几个特点。
可写是否该文件系统能被写数据。
只有当一个文件系统发现有更新的数据时需要可写的文件系统,通常嵌入式根文件系统并不需要可写的东西。
可保存是否该文件系统再重启后能保存修改后的东西,一般是在有可写功能的基础上才会有该功能。
可压缩是否挂载的文件系统内容可被压缩。
通常情况下该功能对于嵌入式系统非常有用,因为它可以节省宝贵的存储空间。
存在RAM是否可以在挂在之前将该文件系统的内容第一次从存储设备解压到RAM中,通常许多文件系统被直接从存储设备挂载。
文件系统挂载在RAM磁盘必须首先从外存储设备解压缩到RAM中,然后执行挂载。
可恢复当突然断电时能否恢复对文件系统的修改。
根据以上特点结合我们的项目需求,我们最终选择了JFFS2文件系统作为我们构建的最小化系统的根文件系统。
JFFS2文件系统是日志结构化的,是专门为类似闪存芯片这样的嵌入式设备创建的文件系统,具有可写、可保存、可恢复和可压缩的特点。
我们使用的是EELIOD开发板附带的文件系统。
但是该文件系统占用空间太大,还附带了许多无关的程序,所以我们在该文件系统的基础上进行了适当的精简,删除了大部分与实验无关的文件,最终将其精简到11.5M左右。
原始的文件系统目录结构及大小
精简后的文件系统目录结构及大小
3.3.3创建JFFS2文件系统映像
创建JFFS2文件系统映像需要用到JFFS2文件系统映像创建程序mkfs.jffs2。
将程序复制到用户目录下。
并用sudochmod777mkfs.jffs2修改权限。
由于实验需要,我们需要反复创建JFFS2文件系统映像,为了节省时间,我们写了个文件名为r.sh的脚本来创建JFFS2文件系统映像,脚本内容如下:
#!
/bin/sh
./mkfs.jffs2-orootfs270.img-e0x40000-rrootfs270-p–l
其中rootfs270.img是要生成的映像文件的文件名,rootfs270是文件系统所在的文件夹。
使用chmod+xr.sh使脚本可以执行。
最终生成的映像文件大小为5.8M。
3.3.4文件系统下载
下载文件系统同下载内核的步骤相似,有以下步骤:
1)设置需要下载的镜像名:
在菜单模式下,选择“a”,按提示输入文件系统镜像名,将前面编译生成的文件系统镜像文件放到/tftpboot目录下。
2)下载文件系统镜像:
在菜单模式下,选择“5”,此时,文件系统镜像通过以太网下载到开发板的SDRAM上,若传输超时或失败,可以重新执行此选项。
3)烧写到Flash:
在菜单模式,选择“6”,将刚下载的文件系统镜像烧到Flash上
以上步骤正常结束后,文件系统镜像已烧入目标开发板的Flash中。
3.4项目平台搭建总体测试
至此,最小化系统已基本上搭建完成。
重启目标板,观察是否能正常启动linux并能正确运行测试程序,若可以,则说明最小化系统已成功搭建。
开发板启动时,minicom中显示的详细信息如下所示:
Welcometouse51BoardBootloaderforXSBase270board
Copyright(C)2002-200651BoardCo,.Ltd.
Support:
http:
//www.51B
Version:
01.00.03
flash:
base=0x00000000,size=0x02000000
Ethportcanaccess,thebaseaddressis