(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf_第1页
(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf_第2页
(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf_第3页
(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf_第4页
(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf_第5页
已阅读5页,还剩94页未读 继续免费阅读

(测试计量技术及仪器专业论文)一种基于arm的嵌入式系统软件构建与网络驱动开发.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4 吃j 0 叁 f p q l o c k t i m e = 0 x 罗蜚雾乒歹乒; 洚 c t k 配置m p l l 丰 ,p o w e r m p l l c o n= $ 3 c 2 4 4 0 m p l l 一4 0 0 m h z ; 书读出控制寄存器的值 净a s y n c h r o n o u s 木将修段的值写入控制 - : j j 呵毳周: 觅 乃 1 5 7 1 5 8 1 5 9 1 6 8 1 6 1 1 6 2 1 6 3 1 6 4 1 6 5 1 6 6 1 6 7 1 6 8 1 6 9 1 7 0 1 7 1 c a m d i v = e l k p o w e r 一 c a m d i v n ; 书计算分频比木 s w i t c h ( c t k d i v $ 3 c 2 4 4 0 一c l k d i v n h d i v n m a s k ) 1 c a s e $ 3 c 2 4 4 0 ( l k d i v nh d i v nl : 乳d i v =二: b r e a k ; c a s e $ 3 c 2 4 4 0 c l k d i v n h d i v n 一2 : | 1 d i v = i : b r e a k ; c a s e5 3 c 2 4 4 0c l k d i v nh d i v n48 : h d i v = ( c a m d i v $ 3 c 2 4 4 0 一c a m d i v n h c l k 4 一h a l f ) ? ,:4 ; 第三章l i n u x 系统引导模块的解析与移植 经过以上三个方面的修改,进行命令“m a k ew i s e l y 2 4 4 0 _ c o n f i g 和“m a k e ” 后,编译生成的u b o o t 文件己可以从串口看到相关的信息,不过这只是初步,还 需要后续添加功能才可以完善u b o o t 。修改和编译源代码是项艰巨的任务,建议 每修改一个地方就进行编译一次,这样,如果编译出错可以立刻定位知道是哪里 出了问题,否则进行了所有代码的修改后再编译出错的话,会很难找到问题的所 在。 4 配置n o rf l a s h 型号。 对型号为s s t 3 9 v f l 6 0 1 的n o rf l a s h 芯片而言,配置文件是在w i s e l y 2 4 4 0 h 里面,采用a m d 的l v 8 0 0 型号芯片配置即可从n o rf l a s h 启动。 5 增加对d m 9 0 0 0 网卡的支持。 使用n f s 或t 邱等网络形式传输下载文件,会大大提高工作效率。本文采用 1 6 位的d m 9 0 0 0 网卡,它外接在b a n k 4 上,它使用w a i t 、n b e 这两个信号, 在修改s d r a m 的同一个文件中对b a n k 4 相关内容进行改写,后面的w a i t 和 u b l b 两项是根据其特性决定的,可在d m 9 0 0 0 的数据手册中查到。 还需要对b a n k 4 对应的时序参数进行修改: 进行u b o o t 移植时,开发板上需要用到的硬件都应该在w i s e l y 2 4 4 0 h 这个配 置文件里进行配置,对b a n k 4 的一些时序和d m 9 0 0 0 的特性等做了修改后,就 需要添加u b o o t 对d m 9 0 0 0 的支持: 第7 0 行表示的是网卡在s d r a m 的基地址,根据d m 9 0 0 0 的数据手册,默认 地址需要偏移0 x 3 0 0 。 4 1 电子科技大学硕士学位论文 上面代码是设置基本的网络信息,包括主机与设备各自的i p 地址、物理地址。 在u b o o t 启动后,可以通过“p i n g ”命令来检查网络是否连通。源代码中有 一个d m 9 0 0 0 的驱动程序d m 9 0 0 0 x c ,其有段内容是连接m i i 接口的,但是这里不 会用到这个接口,所以将这段注释掉即可。至此u b o o t 已经可以支持d m 9 0 0 0 网 卡了。 6 添加对n a n d 型号闪存的支持。 u b o o t 源代码里面包含n a n d 的驱动程序,这些d r i v e r s 分为新旧两种代码, 目前的趋势已经是摒弃了旧代码,而新的驱动代码是移植自l i n u x 内核的,所以和 l i n u x 是一起使用起来会更加方便。 同上面讲到的“p i n g ”命令一样,这里也需要在配置文件w i s e l y 2 4 4 0 h 里添加 支持n a n d 的宏命令: 可以看到,第9 9 行增加了支持n a n d 的宏命令。 移植n a n df l a s h 代码,这个在u b o o t 源码里面是没有其它的例子可以参考 的。本设计采用的方法是这时再对源代码进行一次编译,之后会出现很多错误, 再逐个把这些错误解决掉,在配置文件里添加相应的宏定义可以去除上面出现的 众多错误。 经过上面代码的添加后,再次进行编译,就只剩下b o a r dn a n di n i t 函数没有 4 2 第三章l i n u x 系统引导模块的解析与移植 定义这个错误了。因为这个函数是与开发平台相关的,需要自行编写,根据 $ 3 c 2 4 4 0 a 的数据手册,首先定义n a n df l a s h 结构体,这些是关于一些寄存器的 定义。接着仿照$ 3 c 2 4 1 0 的n a n df l a s h 驱动代码来编写$ 3 c 2 4 4 0 的,最后编译 成功后u b o o t 便可烧写文件系统、内核等进n a n df l a s h 里面了。 7 添加u - b o o t 烧写功能。 通常引导代码是没有烧写这个功能的,但可以通过修改代码来是它具备烧写 f l a s h 的功能。本设计采用的是y a f f s 文件系统,下面进行烧写命令的添加和代码 的修改,具体位置在c o m m o r r d c m dn a n d c 文件: 第5 2 0 行添加的读y a f f s 文件系统的命令,5 2 2 行则是写的命令。另外还需 在这些命令的处理函数中添加读写的相应操作,这里不再列举这些代码。 8 设置默认参数。 所谓默认参数,就是一些和启动和相关的参数,例如自启动时间、命令等, 还可以对i p 进行设置,这个已经在网卡里面进行了。需要注意的是,对启动参数 的设置,这关系到系统时候能够启动。首先需要在配置文件里面添加下面这两个 宏: 其它的启动参数已经在上面移植d m 9 0 0 0 代码的基本设置里,其中第1 1 1 行 表示u b o o t 启动的前3 s 内,如果没有任何输入,则启动内核;第1 1 2 行表示进行 修改l i n u x 内核时,本设计把根文件系统放在了m t d 分区( o 【1 】 2 ) 中的 2 ;1 1 8 行表示系统启动时,首先从n a n df l a s h 的0 x 0 0 0 4 0 0 0 0 偏移量开始,读取 0 x 0 0 2 0 0 0 0 0 个字节放到开始为0 x 0 0 0 4 0 0 0 0 的内存中。下面说明为什么会是这几个 地址,因为这个区域是n a n df l a s h 的第二个分区存放内核的位置,而编译出的 u l m a g e 内核映像大小为18 0 6 3 6 4 b y t e s ,大概1 7 m b ,换算成1 6 进制为0 x 0 0 1 8 9 0 1 c , 在0 x 0 0 2 0 0 0 0 0 范围内,最后会从内存的0 x 3 1 0 0 0 0 0 0 位置启动内核。 最后编译,得到的u b o o t b i n 文件下载到n o rf l a s h 和n a n df l a s h 中,并能 够成功从n o rf l a s h 启动内核。以上编译得到的u b o o t 已实现基本功能。 4 3 电子科技大学硕士学位论文 3 3 2 使用u b o o t 命令进行读写 使用n f s 进行挂载,需要把挂载用到的内核映像u l m a g e 以及根文件系统等放 在服务器的n f s 共享目录下。按照3 2 2 节的内容设置好后,开发板上电,u - b o o t 会首先启动,然后进行n f s 挂载,图3 - 6 是串口显示的已经通过n f s 将u l m a g e 映像挂载蓟了内存的0 x 3 0 0 0 0 0 0 0 位置。 图3 - 6n f s 挂载l i n u x 内核映像 从上图可以看出,n f s 的共享目录是h o m e w i s e l y a r m _ d i y f i l e s y s t e m w i s e l y f sm i n i ,目标板的口是1 9 2 1 6 8 1 1 0 0 ,挂载的这个文件大小是1 9 8 1 8 9 6b y e s , 此时,如果输入命令“b o o t m ”,就会从内存的挂载位置开始启动内核。如果要进 行烧写,则写的命令应是自己实际的一些参数或值,例如,下面的这个命令对应 m i n i 2 4 4 0 开发板,h a n d w r i t e d f f s 20 x 3 0 0 0 0 0 0 00 x 0 0 0 4 0 0 0 00 x 0 0 1 8 9 0 1 c ,将内存地 址0 x 3 0 0 0 0 0 0 0 开始的0 x 0 0 1 8 9 0 1 c 大小的数据写入到n a n df l a s h 的0 x 0 0 0 4 0 0 0 0 地址偏移。 通过n f s 的挂载和u b o o t 命令的读写,可以提升文件的烧写速度,同时在烧 写内核和文件系统进f l a s h 之前进行n f s 挂载运行,也可以检查被挂载文件的完 整度和可执行性,提高了效率。 第三章l i n u x 系统引导模块的解析与移植 3 4 总结 本章首先介绍了l i n u x 系统的引导模块b o o t l o a d e r 的基本概念,并分析了其启 动过程。重点讲述了u b o o t 引导程序的结构和相关源代码。最后针对处理器等硬 件进行了移植工作。b o o t l o a d e r 是嵌入式设备的重要组成部分,成功的启动代码会 使后续的开发工作变得更为便捷。 4 5 电子科技大学硕士学位论文 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 同样硬件配置的设备可以使用不同的操作系统,例如目前市场上的笔记本电 脑,在购买时可能会预装w i n d o w sx p 或者u b u n t u 操作系统。与上面的道理一样, 不同硬件的设备也可以使用同一个操作系统,这时就需要对这个操作系统进行移 植。移植的定义是,一个硬件平台的代码经过交叉编译后可运行在另一个硬件平 台。交叉编译指的是用一个平台的编译器对其它平台的代码进行编译的过程,得 到的代码可以运行在编译器所对应的平台上。 本设计采用的操作系统是l i n u x ,它支持多种处理器,并且功能强大、可移植 性强。之所以进行移植,是因为每个硬件平台可能会由于不同的开发者、不同的 需求而采用不同的配置,因此,需要根据具体的硬件设备来进行与它相对应的操 作系统移植。本章的移植工作就是建立在m i n i 2 4 4 0 开发板基础上的。 4 1l i n u x 内核结构 本系统选用l i n u x 的稳定版本l i n u x 2 6 2 9 3 内核作为移植对象。版本号也可 以从内核源代码的顶层m a k e f i l e 文件里面查到。2 6 是它的主版本号,偶数表示的 是稳定版本,奇数的版本比如2 5 是发展中的版本,它会被很快的掠过。后面的 2 9 是此版本号,它与后面的数字3 ( 扩展版本号) 都会随着内核的完善而不停地递 增更新。目前的2 6 内核与之前的2 4 稳定版有着很大的区别,l i n u x 2 6 x 采用新 的进程调度算法、内核可抢占、线程操作速度提高、支持文件系统功能的变化以 及音频、总线等,这些都有着很大的改进【l o 】。 针对a r m 9 的$ 3 c 2 4 4 0 a 处理器,其主要的体系是在a r c h 目录中,a r c h 是 a r c h i t e c t u r e 的缩写,这里表示硬件架构的意思。其中包括了人们最为熟悉的i 3 8 6 架构,以及本文的研究所用到的a r l l l 体系结构,而在a r l l l 子目录下存放的是该内 核版本发布时市面上的几乎全部的采用a n n 构架c p u ,比如这里要用到的$ 3 c 2 4 x x 系列。图4 1 是l i n u x 2 6 2 9 3 内核源码的层次结构,里面标出了与$ 3 c 2 4 4 0 a 处 理器相关的文件。 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 l i n u x 2 6 2 9 3 a r c h - - - - - - - - - - - - - - - - i 3 8 6 l o c k r y p t o i o c u m c n t s r i v e r s - - - - - - - - - - b l o c k - - - - - - - - - - - - - - c h a r m t d - - - - - - - - - - - - - - - - s e r i a l l 一s 3 c 2 4 4 0 c 卜j f f s 2 _ 一y a f f s 2 ( i 刍己添加) e l 一m a i n c b o o t c o i t i m o n k e r n e l 卜一h e a d s 卜一s e t u p c l p l a t - s 3 c 2 4 x x 卜一c p u c l 一d e v s c m a e h - s 3 e 2 4 4 0 卜一m a c h s m d k 2 4 4 0 c l 一s 3 c 2 4 4 0 c i l l n l l 一p r o c a r m 9 2 0 s 图4 1l i n u x - 2 6 2 9 3 内核结构 下面对一些主要的进行说明: 厨c h ,包含了众多硬件架构的代码,例如本文的c p u 是$ 3 c 2 4 4 0 a ,与其对 应的架构是a r c h a r m m a t h s 3 c 2 4 4 0 : d r i v e r s ,从字面意思就可以知道,这个目录是存放各种设备的驱动程序的, 同时它也是整个内核最大的一个目录。后面一直用到的n a n df l a s h 驱动、d m 9 0 0 0 网卡驱动等都在里面,随着内核版本的更新,它支持的设备会越来越多,这个目 录也会越来越大; i s ,f i l e s y s t e m 的缩写,存放着多种文件系统代码,例如j f f s 2 、e x t 2 等,不过 4 7 一 e 一 一 一 一 e 电子科技大学硕士学位论文 这个版本还不支持y s f f s 2 文件系统,需要在该目录中添加代码; i n i t ,整个h e m e l 的初始化代码,也是内核开始工作的地方,里面包括着m a i n c 函数【1 1 1 ; i n c l u d e ,存放着与内核相关的头文件和库文件。与a r m 平台相关的头文件 也是在这个下面; k e r n e l ,内核最主要的代码,这些核心代码也并不都是放在这个目录下,例如 与a r m 体系相关的是放在a r c h a r e a k e r n e l 文件夹里的; m m ,整个内存管理的代码,与核心代码一样,不同处理器会有它自己的内存 管理代码,a r m 体系的位置在a r c h a r m m m 文件夹里。 还有些目录这里没有做介绍,但并不代表它们不重要,比如关于网络的代码 n e t 和库函数的代码l i b 都很重要。后面进行代码移植时会对必要的目录做解释说 明。 4 2 移植l i n u x 内核 4 2 1l i n u x 内核的启动过程 从本节开始,进入l i n u x 内核的移植阶段,经过修改后,最后生成的嵌入式 l i n u x 内核可以支持y a f f s 文件系统等功能。 针对a r m 结构的处理器,首先分析l i n u x 的启动过程。与u b o o t 的启动类 似,l i n u x 也可分成两个启动过程:一个是与a r m 结构相关的引导过程,另一个 是其之后的通用的启动过程。a r m 处理器使用的l i n u x 内核格式是v m l i n u x ,这 个格式的内核不需要进行解压缩,b o o t l o a d e r 启动后,会直接进入内核的启动步骤。 第一个阶段是用汇编语言编写的,它会检查一些与c p u 和开发板相关的设置是否 已经准备就绪,然后调用s t a r tk e r n e l 函数进入第二阶段;与b o o t l o a d e r 一样,内 核启动的第二阶段是用c 编写的,它会进行全部的初始化,之后便会创建整个系 统的第一个进程i n i t t l 2 】。一些与开发板有关的工作也会在这个阶段进行,比如初始 化串口、设置c l o c k 等。 图4 2 是l i n u x 内核的启动过程。 第四章嵌入式l i :u u x 内核的移植与根文件系统的制作 a r c h 一一w k e r n e l h h e a d s s ( 三p a r c h a r m j m p r o c a r m 9 2 0 s l 确定内核是否 1 0 0 k u p _ p r o c e s s o r _ t y p e 支持该架构 确定内核是否 一l o o k u pm a c h i n e _ t y p e 支持该单板 + c r e a t e _ p a g e _ t a b l e s 建立一级页表 + 设置a r m 9 2 0c p u 核 a r m 9 2 0 _ s e t u p 禁止i 。dc a c h e s 等 ,内核引导阶段 + e n a h l e _ m m u 使能m m u + 复制数据段 清除b s s 段 设置栈指针 保, 存- c p ui d 到p r o c e s s o r _ id 变量 保存机器类型i d 到_ _ 眦c h i n e _ a r c h _ t y p e 变量 调用s t a r t _ k e r n e l m m a p _ s w it c h e d i n i t m a i n c 的s t a r tk e r n e l 函数 p r i n t k ( 1 i n u x _ b a n n e r ) 输出l i n u x 版本信息 设置与体系结构 s e t u p _ a r c h 相关的环境 内核启动的 第二阶段 c o n s o l e _ i n i t 初始化控制台 启动i n i t 过程 r o s t _ i n i t 图4 - 2 基于a r m 的l i n u x 内核启动过程 4 2 2 修改内核支持开发平台 不论是l i n u x 内核的源代码还是b o o t l o a d e r 的源代码,解压缩后首先要做的事 4 9 电子科技大学硕士学位论文 情,就是是用合适的编译器先将源码编译一次,一检查代码是否可用,并且每当 修改了部分代码后,就要再进行编译,这样出现问题或错误时才能够快速定位, 加快解决问题的时间。 移植的第一步,按照3 2 3 节的方法安装了交叉编译器a l t l l 1 i n u x - g e e 一3 4 5 后, 进入内核目录l i n u x 2 6 2 9 3 ,修改顶层的m a k e f i l e 文件: 第19 4 行是是用基于a r m 的交叉编译器a i m 1 i n u x g e e ,然后进行内核的配置, 因为只是检测下内核是否能够编译成功,所以这时还不需要对其进行仔细的配置, 使用$ 3 c 2 4 1 0 的配置文件即可,在终端输入下面两行命令: m a k es 3 c 2 4 1 0 _ d e c o n f i g m a k e u l m a g e 执行第一个命令后,整个内核的配置就已经变成了$ 3 c 2 4 1 0 的配置,第二行 命令则是编译内核并生成u i m a g e 格式的内核映像,它可与u b o o t 并存,另外还 会生成上面提到的v m l i n u x 内核映像。如果把第二行命令换成“m a k e ”,就只会生 成v m l i n u x 。 对于m i n i 2 4 4 0 而言,这时生成的镜像文件还是不能在开发板上用的,因为内 核还没有支持$ 3 c 2 4 4 0 处理器,换句话说,开发板的配置与内核支持的配置不完 全一致。因此,需要做一些修改来使其支持m i n i 2 4 4 0 。需要了解内核的启动过程 才能够知道需要修改的文件是哪些。 1 内核引导阶段分析 内核启动时,是从a r c h a r m k e r n e l h e a d s 开始的,该文件开始的指令时移植的 关键: 这几条指令尤为重要,首先第7 9 行的功能是关闭中断,并把c p u 设为管理 模式;第8 2 行和第8 5 行分别是检查内核是否支持正在移植的处理器和嵌入式设 备。一_ l o o k u p _ p r o c e s s o r _ t y p e 会查看c p u 的i d ,如果和当前使用的匹配了,就会 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 返回一个结构体地址,否则返回的值r 5 = 0 。对m i l l i 2 4 4 0 而言,它的处理器d 是 0 x 4 1 1 2 9 2 0 0 ,这个与内核中关于a r m 9 2 0 t 的定义一样,可在a r m 结构目录下的 m a k e f i l e 文件里找到。 对于第8 5 行的函数,其目的是检查开发板是否与当前用的相符。这两个函数 都返回成功的话,系统便会在第一阶段启动的最后调用s t a r tk e r n e l 函数,如图4 2 所示,直刺进入内核启动的第二阶段。 2 内核启动第二阶段 m i n i 2 4 4 0 从上电开始,会经历u b o o t 的启动、内核的启动已经挂载根文件系 统等过程,这些都会在串口中显示,如果中途出现什么问题,系统也就会停在出 现问题的地方,串口显示也会停住不动。一般在开发系统阶段,很有可能出现下 面的问题,就是串口什么都不显示,只知道b o o t l o a d e l 启动了,但是却停住不前, 这个问题是由以下这两个原因引起的:一个就是移植b o o t l o a d e r 时讲的,需要传 递内核的启动参数,这个只要稍微不匹配,内核便不会启动;另一个是图4 2 所示 的第二阶段里的s e t u p函数出的问题。可以看到,进入第二阶段后,首先是arch p r i n t k 的执行,但此时串口还没有初始化,所以没有输出。 a ) 浅析s e t u p函数arch 图4 3 是这个函数的流程图。其第一个函数的作用是处理一些与c p u 相关的 设置,另外,s e t u p _ _ p r o c e s s o r 函数还会调用上一阶段的l o o k u p _ _ p r o c e s s o r t y p e 函数, 来获得c p u 相关的信息结构。第二个运行的函数是s e t u p,从字面意思可machine 看出,它与嵌入式设备的结构有关系,它调用的是上一阶段的l o o k u p _ m a c h i n e _ t y p e 函数,并获得与开发板相关的一些结构信息。然后,确定了u b o o t 传递进内核的 参数地址后,会紧接着把这些地址转成虚拟地址。 对于m i n i 2 4 4 0 而言,内核的启动地址是下面代码的第1 8 0 行,也就是 0 x 3 0 0 0 0 10 0 。 s e t u pa r c h 函数运行到最后会进入一个与m i n i 2 4 4 0 相关的函数,p a g i n g _ i n i t 。 5 l 电子科技大学硕士学位论文 a r c h a r m k e r n e l s e t u p c 开始 s e t u p _ p r o c e s s o r 进行竺萋霍望关! l ? 毗眈衄m n e i 进鬻 p a r s e _ t a g s 处理t a g 列表 阱s 吖m d 剖撵辫 p a g i n g - i n i ti 重新初始化页表 s e t u p _ a r c h 函数 图4 - 3s e t u p _ a r c h 函数流程图 b ) 浅析p 姆n g _ i n i t 函数 这个函数对整个内核移植过程来说,最关键的地方在由它而调用的函数 s m d k 2 4 4 0 _ m a p _ i o ,函数的实现是在r o a c h s m d k 2 4 4 0 c 源文件里: 可以看到第1 6 3 行是设置m i n i 2 4 4 0 的晶振频率,因为这个频率本应是1 2 m h z , 而原来的代码却与之相左,这也是为什么串口不会正确显示的原因了。 c ) 浅析c o n s o l ei n i t 函数 s t a r tk e r n e l 函数运行后会调用c o n s o l ei n i t 函数,其目的是初始化串口,因此 必须用到结构体s 3 c 2 4 x xs e r i a lc o n s o l e ,本设计采用的l i n u x 2 6 2 9 3 内核对其位 置进行了更改,目前是在d r i v e r s s e r i a l s a m s u n g c 中定义的: 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 本文使用的串口时t t y s a c o ,与第1 3 9 3 行的1 ( 可为任意值) 相对应,因此串 口0 便会输出内核的启动信息。 3 针对m i n i 2 4 4 0 开发板修改l i n u x 内核 现在已经知道了内核启动串口为什么不会正常显示的原因了,需要按照开发 板的晶振频率对内核进行设置,具体的修改位置已于p a g i n gi n i t 函数一节给出, 将1 6 3 行的1 6 9 3 4 4 0 0 改为1 2 0 0 0 0 0 0 ,这样只要u b o o t 传递的启动参数正确,串 口就会显示内核启动信息。 对于本系统,u b o o t 传入的机器类型i d 为m a c hn 伊e $ 3 c 2 4 4 0 ,在 a r c h a r m t o o l s m a c h t y p e s 中有很多机器码的定义,将m a c ht y p e $ 3 c 2 4 4 0 的机 器码修改成和u b o o t 的一样,因为b o o t l o a d e r 中设置的是7 8 2 ,所以这里也设置 成7 8 2 。再次执行“m a k eu l m a g e ”命令,生成的u i m a g e 就可以使用了。这里说的 可以使用是说内核基本上没有什么问题了,只是由于还没有进行m t d 分区和增加 对y a f f s 文件系统的支持。 4 2 3 修改m t d 分区 m t d 是m e m o r y t e c h n o l o g y d e v i c e 的缩写,翻译成中文也就是内存技术设备, 可以将它理解成一个设备层,而这个设备层是l i n u x 专门提供给n o rf l a s h 、n a n d f l a s h 、r o m 这些存储设备的。m t d 类似于通常所说的驱动程序,它作为硬件和 软件之间的一个桥梁将它们连接起来,与一般的驱动程序一样,m t d 提供了读写 等操作。m i n i 2 4 4 0 开发板采用了两种f l a s h ,因为需要把内核映像、根文件系统等 都烧写进n a n df l a s h ,因此只用对n a n df l a s h 进行分区即可,同时由于采用了 m t d ,使得分区变得容易起来。 下面讲述了n a n df l a s h 的识别过程,以及如何对它进行分区来满足设备需 求。 a ) 驱动程序识别设备 一般驱动程序是根据下面的两种方法来识别硬件设备的;一个是主机或所用 5 3 电子科技大学硕士学位论文 设备中有相关硬件设备的驱动程序,这样系统加载驱动时会根据其提供的信息来 识别硬件设备;另一中方法是驱动没有相关的设备信息,这种情况一般出现在设 备厂商刚刚推出某种设备,而内核或者驱动还没有来得及跟上,不过对l i n u x 内核 而言,里面的驱动( d r i v e r s 目录) 会更新的很快,因此即便驱动还不能识别这些新 的硬件,但内核里已经有了硬件相关的信息,在系统加载驱动时,会一个一个的 比较这些硬件信息,一旦有匹配的,就会使用与之匹配的驱动程序了。 从上面这两种方法的定义可以看出,第二种是内核经常使用的,因为这种方 法可以把众多的硬件设备统一放在一个地方,当所用到的开发板( 例如m i n i 2 4 4 0 ) 的配置发生变化时,可以很方便的修改代码。l i n u x 内核定义了p l a t f o r m和device p l a t f o r m两个数据结构来表示设备及其驱动程序,前者包含了设备的名称、driver 中断号等信息,后者则包含了进行读写等操作时用到的函数。记录着设备信息的 p l a t f o r m会被组织起来,系统加载驱动程序的后,会与设备_ d e v i c e p l a t f o r md r i v e r 对比查看它们是否匹配。 对于m i n i 2 4 4 0 开发板而言,采用的是s m d k 2 4 4 0 的模板,其定义了以下的设 备: p l a t f o r ma d d _ d e v i c e s 函数会将定义的这些设备注册进内核。 n a n df l a s h 设备驱动包含在d r i v e r s m t d n a n d s 3 c 2 4 10 c 文件中,这个驱动时 通过s 3 c 2 4 1 0 的相关函数注册到内核里面的,下面的代码是本文所用到的n a n d f l a s h 驱动的代码: 可。 有了n a n df l a s h 的驱动后,只需要在c o m m o m s m d k c 源文件中修改分区即 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 b ) 修改m t d 分区 对于本设计的m i i l i 2 4 4 0 开发板,将n a n df l a s h 分成3 个区,前2 5 6 k b y e s 用来存放u - b o o t ,接下来的2 m b y e s 用来存放内核映像,剩下的用来存放y a f f s 文 件系统。如下: 第一个分区存放着u b o o t ,因为本文所用到的u b o o t 编译后文件很小,所以 分给它2 5 6 k b y e s 字节,第1 6 0 行的o f f s e t 表示没有偏移量,从n a n df l a s h 的 0 x 0 0 0 0 0 0 0 0 地址开始;第二个分区存放内核映像,嵌入式l i n u x 内核经过裁剪后, 其大小基本上不会超过2 m b y e s ,所以分给它2 m b y e s 即可,第1 6 4 行的意思是说 这个分区的起始地址是紧跟着上一个分区的;最后一个分区存放着y a f f s 文件系 统,文件系统的大小不定,如果里面含有大量的应用程序或者用户图形界面的话, 文件系统就会有几十兆左右,本文将剩下的n a n df l a s h 空间全部分给文件系统, 第1 7 0 行表示的是分区的大小是剩下的闪存空间的大小。 4 2 4 移植心f s 文件系统 1 y a f f s 文件系统简介 文件系统是包含在操作系统里面的,分为虚拟文件系统v f s 和实际的文件系 统。v f s 从严格意义上来说,只是一个接口层,它会映射实际的文件系统到内存 中,因此,v f s 所处的位置就是内存,系统一旦关闭,它也随之消失【1 3 1 。嵌入式 文件系统的种类很多,从早期的适用于小量f l a s h 的只读压缩文件系统c r a m f s 到适用于n o rf l a s h 的j f f s 2 再到现在用到的y a f f s 文件系统。本文使用的正是 最后一种,y a f f s 。它是一种针对n a n df l a s h 而研发诞生的文件系统,其全称是 5 5 电子科技大学硕士学位论文 y e ta n o t h e r f l a s hf i l es y s t e m 。 基于n a n df l a s h 的y a f f s 文件系统具有众多的优点,其运行速度快、占用 内存少、可移植性高,并具有完整的日志结构。最引人注意的是,它具有n a n df l a s h 驱动,含有a p i ,因此能够直接对f i l e s y s t e m 进行操作而不使用虚拟文件系统和内 存技术设备。在今天,大部分的嵌入式设备都会在n a n d 闪存上采用m t d 和 y a f f s 的组合形式,而在n o r 闪存上则采用j f f s 2 。 本设计使用的是y a f f s 的第二代,y a f f s 2 文件系统,它对n a n df l a s h 有 着更好的支持,并且读写速度和内存消耗都有了更大的改善。 2 移植y a f f s 文件系统 首先,是从网上下载它的源代码压缩包,解压后,使用里面的y a f f s 2 目录进 行下面的移植工作。移植可分成两步: a ) 为l i n u x 内核添加y a f f s 2 的代码 可通过打补丁的形式为内核添加y a f f s 2 的代码,按照本文的文件系统和内核 存放的位置,进入y a f f s 2 的主目录后,使用命令来进行打补丁。 b ) 配置内核支持y a f f s 文件系统 上面打过补丁后,便会发现内核源代码里的f s k c o n f i g 和f s m a k e f i l e 分别多了 关于y a f f s 2 的内容,然后在雁目录下简历y a f f s 2 文件夹,并把下载的y a f f s 2 的相 关文件复制到内核里新建的这个目录下。最后进行在内核配置的菜单里将新加入 的y a f f s 2 文件系统支持选上即可,如下所示,之后进行编译,生成的u i m a g e 就已 经可以支持y a f f s 文件系统了。 4 2 5 裁剪、编译、启动内核 经过本章以上的内容,内核已经可以支持m i n i 2 4 4 0 开发板了,将它烧入n a n d f l a s h 中,再烧入制作好的根文件系统,整个嵌入式系统就算基本构建完成了。 本节是进行嵌入式l i n u x 内核的裁剪并启动内核。嵌入式系统的特点是专一 性,意思就是构建一个嵌入式系统,它的硬件、软件都是只适用于这个设备本身 的。因为不需要其它额外的软件,其存储空间就会极其有限,所以要对整个l i n u x 内核进行裁剪。裁剪的第一步,就是以前提到的,修改顶层的m a k e f i l e 文件,把 交叉编译器改为i k r l t l 1 i n u x g c e ,然后再执行“m a k e m e n u e o n f i g ,会看到内核的配 5 6 第四章嵌入式l i n u x 内核的移植与根文件系统的制作 置的菜单。如果没有进行交叉编译器的修改,在执行完上面的命令后,出现的内 核配置界面就会是非嵌入式的l i n u x 内核,里面会出现各种我们常见的p c 机的 c p u 种类、显卡声卡等。图4 - 4 就是内核的配置界面。 溺蓊箧震一粼攀 篓戮嬲瓣麓麓豢蓊鬻黪囊蒸羹誓雾黧爹 缓鬈琵缀鼗磁鬣瑟驻臻麓:笺篓z 差篓兹;露荔。鬈鼍荔罗:;= 。z 鬈麓荔羞蓉篓澄燮” 逐鋈鍪鋈鎏豳霆鋈隧錾鋈壅垂鋈銎:签薹鋈鍪囊 图4 - 4l i n u x 2 6 2 9 3 内核配置界面 给m i i l i 2 4 4 0 使用的内核进行配置时,需要根据其软硬件的需要而进行。首先 选择最重要的c p u 类型,如上图所示。接着选择开发板所用的芯片类型、所需要 支持的文件系统以及设备驱动程序,去掉不需要的选项,将内核的体积降到最小。 配置菜单里的所有选项都是a r c h 目录下的各种模板的k c o n f i g 文件内容。 内核配置选项繁多,如果一个一个的了解并进行配置会花费很多时间,而且 也有可能出现某些配置选择上后内核不能编译的问题,比较通用的办法是先使用 与开发板相似的配置文件,然后再根据具体的硬件信息进行相应的修改,最后将 自己的配置文件保存,以便下次继续使用,不需要再重新配置。 经过内核配置并编译,生成的u l m a g e 映像已经与m i n i 2 4 4 0 基本符合,可是 系统启动后会发现串口会显示p a n i c 的错误信息,那是由于还没有往n a n df l a s h 写入文件系统,或者没有使用n f s 文件系统,下节就是根文件系统的制作。 5 7 溪溪嚣 电子科技大学硕士学位论文 4 3 制作根文件系统 4 3 1l i n u x 文件系统介绍 我们使用w i n d o w s 操作系统时,会把硬盘分成1 州个区,比如c 、d 盘等, 使用l i n u x 操作系统时,同样也会分区,只是这个分区并不是传统意义上的 w i n d o w s 分区,l i n u x 下的分区是树状结构的。一般内核映像会放在一个单独的分 区里面,i n i t 程序、应用程序所用到的库等基本文件都会放在相应的区域里,上面 的这些就组成了根文件系统【1 4 】。通常根文件系统会被挂载在“ 符号下,而其它 分区的所有文件就叫做文件系统。文件系统的类型很多,p c 机上经常使用n t f s 、 f a t 3 2 格式,其它还有y a f f s 、j f f s 2 、e x t 2 3 等类型的文件系统,针对嵌入式 设备来说,其n o rf l a s h 与j f f s 2 格式结合的较好,而n a n df l a s h 则与专门为其 设计的y a f f s 文件系统有着良好的兼容性。 图4 5 是u b u n t u8 1 0 的根文件系统结构。 型苎里! :! :i :i :- 曼:奠:。,型曼垦曼兰盘箜;:i 曼翌曼2 毖琵麓缓缢鬣翻里苎竺竺! 璺塑型:翅 争囱b i n ;1 1 3i t e m s :f o l d e rw e d1 5j u l2 0 0 91 0 : 爹翰b o o t 。j :;7 _ 。”臻2 5i r e m s lf o l d e ;l ,? ;鬈i 翼鼙鬈 t u e2 9d e c2 0 0 9l o i 翰c d r o m 0 i t e m s u n kt of o l d e ri w e d1 3m a y2 0 0 9o ! 爹、豳d e v j 2 ,s j i 7 0 3i t e m 窖;f o j d e l ,磊式荔j 臻? 。! t h u2 ,5 m a r 2 0 1 0 0 9 。, + 豳e t c ;2 4 4i t e m s :f o l d e r i t h u2 5m a r2 0 1 00 9 夔:函h o m e0 羔多,。o ;蠹翻3i t e m s i f o l d e r ? 二缀囊磊:;t u e2 8j u l2 0 0 9 1 4 :5 ! 豳i t bj 1 5 0i t e m s 。f o l d e r 。:w e d0 7o c t 2 0 0 9 1 9 , 势嗣l o s t + f o u n d :“誓j 骛秀i 7 ;i t e m s ! f o l d e r i 乏鬈! 鼍壤誉:! w e d1 3 一a y 2 0 0 9o ! 步豳m e d i a ,i 3i t e m s if o l d e r i t h u2 5m a r2 0 1 00 9 嚣嗣m ,n o :互 j j j :鋈0 i t e m s ! f o l d e r 慧萋薹薹隧i m o n l 2 0 “o c t2 0 0 8 2 0 p 囝o p t+ 、j 1i t e m l f o l d e r;刚2 6j u n2 0 0 91 0 :3 : 囊:p r o c 、:乏- 。i ,。:,:差i 露2 t l i t e m s if o l d e ,r 鼋囊墓薹;螽塞妻复p u2 5 m a r ,2 0 1 01 毒 p 嗣r o o t 0 i t e m s :f o l d e r :t u e2 9d e c 2 0 0 91 0 : 爹茬葱s b i n 一。,;i 7 ? ? ;7 冀溪i j ,1i t e m , ! f o d o i :i i :! 篡麓餐蓼褰露;t u e 2 9d e c2 0 0 9l 谚 争国s 1 1i t e m :f o l d e r :t u e1 9m a y2 0 0 92 0 蕤匾翕s y sj 。:一i 0 :。1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论