linux嵌入式实验2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式实验报告(二) 姓名:董辰辰 学号:111180031 专业:电子信息与科学
一、 实验目的
1、 了解Linux 内核源代码的目录结构以及各个目录的相关内容。
2、 了解Linux 内核各配置选项内容和作用。
3、 掌握Linux 内核的编译过程。
4、 了解嵌入式操作系统中文件系统的类型和作用。
5、 了解JFFS2文件系统的优点以及在嵌入式系统中的作用。
6、 掌握利用busybox 软件制作嵌入式文件系统的方法。
7、 掌握嵌入式Linux 文件系统的挂载过程。
二、实验内容和要求
1、配置完整的内核,尽可能理解配置选项在操作系统中的作用。
2、以 Busybox 为基础,构建一个合适的文件系统。
3、制作ramdiak 文件系统映像。
4、将自己编译生成的内核和文件系统下载进开发板。
5、讨论自己的嵌入式系统所具备的的功能。
6、比较romfs 、ext2fs/ext3fs 、JFFS2等文件系统的优缺点。
三、实验设计和分析
实验分为两个部分:Linux 内核配置编译和文件系统构建。本次实验的目的
就是自己搞一个内核和文件系统。当然自己编写代码是不太可能啦,而是根据
linux 提供的源代码自己配置编译出一个自己的内核,在构建一个自己需要的文
件系统。实验室用的内核版本是2.6.35.7 实验室的开发板有了内核和文件系统
才能够对其进行开发。内核是操作系统最基本的部分,可以说是一个软件,实验
室的开发板有处理器、内存、Flash 闪存等硬件组成,可以说内核是调度它们的
软件,有了内核各种应用程序才能够调用硬件资源,总的来说内核文件是操作系
统的核心,负责系统的进程管理,内存管理,设备和文件管理等,决定着系统的
性能和稳定性。文件系统是操作系统的一个重要组成部分,通过对操作系统所管
理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备
的直接操作和资源管理。我觉得内核的本质其实是程序,而文件系统是设置一些
规则来用来管理存储的,在一个完整的操作系统中两者都是不可或缺的,内核在
加载的时候需要有很多的挂载指令,应该挂载的就是文件系统的文件夹,比如将
proc 文件系统挂载到proc 文件夹,这就是为什么在开发板启动时内核和文件系
本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。
统任何一个有问题都不会正常启动的一个原因之一吧,我觉得内核是执行单元,而文件系统是储存单元,内核通过文件系统访问数据来进行处理。
编译内核之前需要了解下内核源代码的目录,实验室用的内核源代码的文件包一开始在系统文件中需要拷贝到自己的目录下才可以进行编译,在文件系统的目录之下使用make命令编译很有可能发生不必要的错误,也可能是没有权限,将kernel_x210v3文件夹拷贝到自己的目录111180031下,可以看到最外面的文件夹里面有个Makefile,当编译执行make命令的时候就是按照这个Makefile的规则执行的,当然各个子文件夹也有对应的Makefile,这个最外层的Makefile可以调用里面子文件的Makefile,从而完成整个内核的编译。当然内核源代码的编译规则非常的复杂,因为内核源码必须保证不同编译设置生成不同的内核以便在不同需要,不同配置的环境中运行,对于本实验来说是针对arm 体系编译的内核,其中在arch目录下包括与体系有关的内核代码,也包括本实验中用到的S5Pv210处理器。init文件夹根据名字也可以看出来是初始化使用的,其中的main.c和version.c是研究内核起点的c文件,后面的文件系统也可以看出,包括在屏幕上写出嵌入式系统的基本系统,挂载proc文件夹,在屏幕上显示一个logo等等也就是内核加载之后载入的第一段程序应该就是这个文件夹中的代码编译出来的吧,mm包括的是内存管理的代码,这个就比较复杂了,内存的分配管理想当年我也是听得云里雾里的,kernel文件夹不必多说,自然包括的是实现linux内核主要的代码,还有包含驱动程序的文件夹driver,还有比较重要的fs文件夹它包含着所有文件系统的代码和各种类型的文件操作代码。这些目录的内容作用其实就是摘抄书上啦,但是实验报告还是应该写上的,这也是编译内核之前所应该了解的基本内容吧。
实验的内容是配置一个自己的内核,自己的,这个很关键,因为linux源代码支持太多的功能,太多的平台,太多的环境了,但是对于实验室的开发板来说用到的或者说可能用到功能又是十分有限的,因此没有必要将那些根本不可能用到,或者很少用到的功能编译到内核中,那样不仅增加了内核的大小占用了系统不必要的空间,而且还会成为系统的负担,所以根据自己用到的功能,配置一个适合自己的内核是很有必要的。向着老师配置的内核大小努力O(∩_∩)O哈哈~。
进入放着内核源码的文件夹,执行make menuconfig,这个命令提供基于Ncurses 的是图形化选择窗口,所以配置起来更加方便,还有make config和make xconfig 命令分别对应配置命令解释器(对配置脚本中的配置命令进行解释,配置非常繁琐)和基于xwindows的图形界面的用户配置界面,实验中用的就是menuconfig。一般的配置变量可以选择不编译,静态编译,或者编译成模块,对于不可能在系统板上实现和很少用到的功能不编译,可能会用到的功能编译成模块能够有效的减小内核的大小。
实验中内核配置的选项是非常的多的,可精简的部分也着实有很多,但是有些很多时候并不理解如果不编译进内核会有什么弊端,有些配置是不能省略的,
因为自己配置不恰当(video设备支持错误)引发的无法编译通过的情况出现了很多次,最终也算配置出自己的内核了。修改的配置见实验过程。最后精简完的zImage大小为:2.4M,并且并不影响系统的正常启动。我一开始错误的认为生成的zImage中并不只有内核,还应该有模块,因为我将内核配置中的一些选项改为模块以后并不影响zImage的大小,这说明模块也在zImage中,我觉得应该是加载内核的时候会将zImage解压,然后加载其中的编译到内核中的部分,但是模块并不会加载进去,而是在需要的时候可以通过命令进行加载,所以如果准备减小zImage的大小,只有减小模块和编译进内核的选项才可以。但是询问老师后得知zImage就是只有内核,模块在另外的文件夹中,如果要使用需要传输到开发板中进行加载,之所以改了几个模块以后大小没有变化,很可能是这几个模块本身比较小,编译成模块和编译进内核的不会对内核大小有明显的影响。另外我觉得自己的内核不一定非要做到最小,因为开发板是需要用的,而不是仅仅可以启动起来就可以,如果仅仅为了启动起来,那样的话开发板好多可以实现的功能就浪费了,这并不是好的事情,所以根据需要编译出自己的内核是最好的,大小没有那么重要吧。
在编译的时候,顶层Makefile完成产生核心文件和内核模块两个任务,在执行顶层Makefile读取.config中的配置选项,在做实验的时候发现make命令不能执行,提示交叉编译器找不到,有三种方法解决这个问题,第一,找到顶层Makefile文件中的交叉编译选项,将编译器的地址改正,第二在make menuconfig 中选择交叉编译器的路径,第三直接修改.config文件(虽然没有试过)。因为前两种方法的本质就是改变.config文件。
内核和文件系统加载之后,可以看到屏幕上出现了一个‚QT‛的logo,但是老师编写的内核的logo是一只小企鹅,我就有一个疑惑,这个logo是在文件系统中还是在内核中呢,因为加载的logo肯定是在某个源文件中,根据构建文件系统的过程并没有发现有加载logo的过程,而且寻找到logo的位置是drivers/video/logo 所以应该是编译内核的时候将这个logo图片的信息静态编译到内核中的,根据这个原理,就可以改变开机logo。但是图片的大小是有限制的因为屏幕的分辨率是有限的,通过后面的实验可以知道系统板的屏幕分辨率是640*480,每个像素用32位数据显示那么所能显示的图片大小为9830400b,所以图片大小不能大于这个数取整也就是900k左右。这一点是需要注意的。
文件系统的构建是本实验另一个内容,从本质上来讲,文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。
既然要构建文件系统,必须要了解下都有哪些文件系统,都各有什么特点。以便决定到底用哪个文件系统。(以下为抄书内容 = =)
1. ext2fs/ext3fs可以实现快速符号链接,类似于windovs文件系统的快捷方式,可将目标名称直接存储在索引节点表中,提高了访问速度;支持内存达4TB,文件名称很长,可达1024个字符;管理者在创建系统文件时根据需要选择存储逻辑块的大小。这种文件系统稳定,可靠,健壮,在台式机、服务器、工作