内核,文件系统实验报告一

时间:2024.4.20

嵌入式系统实验报告(一)

091180083刘浩通信工程

一、实验目的

了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybox软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。

二、嵌入式系统开发实验

1、minicom和tftp

(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。本实验中用到的是RS-232C标准的接口。

(2)软件结构:minicom

运行minicom,Ctrl+A-o进入minicom的configuration界面。对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。保存好设置后以后可以不用再设置。

(3)bootloader引导:给开发板加电,任意按下一个键进入bootloader界面。可以通过命令行方式进行设置,按0进入命令行模式,出现>51board,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。

(4)通过bootloader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。

由于bootloader需要从服务器上下载内核和文件系统,一般采用tftp服务。进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。再设置完后要重新启动tftp服务。

按下a——,写入下载的内核名和文件系统名(注意:这些文件必须在tftp服务的主目录/tftpboot下),之后就可以进行下载和启动。

2、pc机和开发板之间文件共享——NFS文件系统服务

NFS是在不同机器不同操作系统之间进行网络共享文件的服务系统。在嵌入式系统中目标机可以将宿主机的共享文档挂载在自己的系统中,从而,目标机使用宿主机上的远端文件就像是使用自己本地的文件一样,有利于嵌入式开发。 在pc机上要打开NFS服务:

#chkconfignfs on

1

#chkconfigportmap on

#service nfs restart

#service portmap restart

我们要查看服务器的共享目录是哪个目录时,需要在/etc/exports中查看或者修改设置。通过查看,发现默认的共享目录设置为/exp。当想修改共享目录时,可以编辑文件exports,保存退出后需要用#exportfs–a这条命令使设置生效。 启动目标板操作系统后,用mount命令将主机的共享目录挂载在目标机的/mnt目录下:

#mount 192.168.207.13:/exp /mnt

此条命令之前先要设置目标机的ip:#ifconfig eth0 192.168.207.113

3、编写应用程序,分别在主机和目标机上运行,注意区别

编写简单的c程序hello.c:

#include <stdio.h>

int main()

{printf(“hello,world\n”);

return 0;

}

在主机上编译,gcc hello hello.c

执行./hello

显示hello,world

将hello可执行程序复制到/exp:cp hello /exp

在目标机上cd /mnt

./hello

出现错误。因为主机上编译生成的x86体系下的二进制代码,而目标机用的是arm体系。不能兼容。

在主机上用交叉编译器进行编译。本实验中用到的是arm-linux-gcc,所在目录/usr/local/arm-linux/bin.编译方法是:/usr/local/arm-linux/bin/arm-linux-gcc–o hello1 hello.c

或者先export PATH=/usr/local/arm-linux/bin:$PATH

然后gcc –o hello1 hello.c

在主机上运行./hello1

错误不能运行。因为可执行程序是arm代码。在x86上不能正确运行。 将hello1复制到共享目录/exp

在目标机上运行/mnt/hello1

显示hello,world

4归纳总结嵌入式系统下软件开发的一般流程

pc机上软件的编写——在pc机上编译及调试——在pc机上采用交叉编译器进行编译生成可执行程序——将可执行程序下载到目标机中——在目标机上运行程序

2

三、Linux内核配置和编译

1、内核源代码目录的简单介绍

本实验中用的是内核源码是linux-2.4.21-51Board_EDR在目录/usr/src/linux下。源代码树下有如下目录:arch(支持的微处理器体系结构),include(头文件),init(初始化代码),mm(内存管理代码),kernel(主要的内核代码),drives(所有的设备驱动程序),lib(库文件代码),net(网络相关代码),ipc(进程间通信的代码),fs(文件系统),scripts(配置内核的脚本文件)。

本实验中要求将目标板的启动画面换成自己设定的画面。做法是:

将/usr/src/linux目录下的内核源代码拷贝到自己的目录下,进入这个目录,在arch/arm下找到开发板启动画面的文件,将其删除,用自己的图画替换。注意,目标板只是别.ppm文件,所以需要改变原来图画的文件格式,可直接改文件后缀名,或者在终端中用命令:

convert xx.jpgxx.ppm

2、编译内核

进入内核源代码目录,输入:make menuconfig进入内核配置菜单,可以根据需要对内核配置项进行选择。配置变量有四种选择:y——静态编译进内核,m——内核代码被编译成模块,n——表示不编译进内核,[ ]——表示配置变量的值为空。在配置过程中,可以通过help来帮助了解各个配置变量的功能,从而决定要不要把这项编译进内核。下面针对一些比较重要的内核配置项进行说明:

1.code maturity level options 代码的成熟程度。我在网上看到一篇文档中提到:要配置framebuffer必须将其选为y。故我在实验中将其选为y,其实不选也行。

2.Loadable module support.将不常用的设备模块化,动态地加载。这样能更加有效利用内存。所以最好选为y。

3.System type 处理器种类。本实验选“PXA270/210-based”——“XSBase270-EDR”

4.在Network device support,网络设备驱动。选择对应的网卡。本实验箱的网卡是“Ethernet 10M or 100Mbit””SMSC LAN91C111”,将其选为y

5.Console drivers.终端设备驱动配置。为了以后实验中要用到的支持图像的功能,要选择“support for framebuffer devices”和”PXA LCD support”。

上面这些配置很重要。其他的配置见实验讲义p20。

配置完之后选择保存,执行完之后会生成.config文件。然后执行make clean,清除以前构核过程中生成的目标文件、模块文件、核心和一些临时文件。再执行make dep,建立依赖关系,然后make,将生成核心vmlinux,再执行make zImage,则可以在arch/arm/boot下生成压缩的内核映像文件zImage。

3、通过bootloader加载引导内核

3

我们将生成的内核映像文件拷贝到/tftpboot下,以便开发板下载。

然后我们将内核下载到开发板。先保证电脑和开发板之间是连接的。在终端中输入minicom,给开发板上电,按照上一实验的方法进行下载,然后boot执行启动。看到开发板出现自己设置的启动画面。

在系统启动过程中,终端提示文件系统没有启动。原因可能是文件系统没有配置好,这将是下次实验的要求。在这次实验中不对其做过多分析。

4、总结内核映像文件的生成方法及其对操作系统的作用

Make menuconfig——make clean——make dep——make——make zImage

内核文件是操作系统的核心,负责系统的进程管理,内存管理,设备和文件管理等,决定着系统的性能和稳定性。

5、内核配置中哪些选项对操作系统的正常启动是必须的?

System type (系列选型);Character devices(字符设备驱动)中的Virtual terminal,support for console on serial support,support for console on virtual terminal,standard/generic serial support,unix98 PTY support; 文件系统(File System)

四、嵌入式文件系统的构建

1、linux文件系统的类型和优缺点比较

1、ext2fs/ext3fs可以实现快速符号链接,类似于Windows文件系统的快

捷方式,可将目标名称直接存储在索引节点表中,提高了访问速度;支持的内存大至4TB,文件名称很长,可达1024个字符;管理者在创建系统文件时根据需要选择存储逻辑块的大小。

这种文件系统稳定,可靠,健壮,在台式机、服务器、工作站中普遍使用。

2、jffs2支持数据压缩,多种文件节点类型,是一种基于FLASH的日志文件系统,提高了对闪存的利用率,降低了内存的损耗。通过jffs2,可以通过flash来存储数据,将flash当作硬盘来使用,而且系统运行的参数可以实时保存在flash中,在系统断电后数据不会丢失。它在嵌入式系统中很受欢迎。

3、romfs是一种相对简单,占用空间较少的文件系统。它比ext2文件系统代码少,而且它在建立系统超级块时需要更小的空间。但它只是可读文件系统,禁止写操作,因此系统同时需要虚拟盘(ramdisk)来支持临时文件和数据文件的存储。

2、busybox简单介绍和编译

Busybox 可编译成一个叫做busybox 独立执行程序,根据配置,可以执行几十个小应用程序。 这其中包括一个迷你的 vi 编辑器, 系统不可或缺的 /sbin/init 程序, 以及如ifconfig, ping,mkdir, mount, cat,ls等程序。Busybox将全部的功能都编译进去,也只有100多k。我们可以根据需要对其进行才将,使其规模更小。

4

1.将/exp 目录下的busybox-1.00-pre5.tar.gz压缩文件复制到自己的文件夹 /home /st /81180015 , 在该目录下解压缩 tar zxvfbusybox-1.00-pre5.tar.gz

2.进入解压后的目录,执行make menuconfig,对busybox进行配置。配置过程中要针对文件系统的需要进行配置。下面将针对几点注意事项进行分析: a在Build Option菜单下,可以选择静态库编译方式,

b在交叉编译器设置,在cross compiler prefix中输入/ usr/ local / arm-linux /bin / arm-linux-

c在 Installation Option菜单下,自定义安装目录,建议使用默认目录 . / _install

d在Init Utilities中配置初始化指令。其中init 选项必选,否则无法正常进入命令行界面的系统,若不选则会显示“kernel panic: no init”。其他选项如:reboot,poweroff等都选上。因为在/etc/init.d中用到了。 e在Login/Password Mangement Utilities菜单下配置对用户登录/密码管理的配置。其中getty必选,因为在inittab文件中要用到该指令,若不选则在执行boot[7]开发板命令,系统启动过程中,会显示 could’t find “sbin/getty”。

f在Networking Utilities菜单下配置和网络有关的命令,为了使用网络连接,其中ping和ifconfig必选。

g在Another Bourne like shell菜单下指定shell(必须因为在启动时rc中的/bin/sh中会使用指定的shell),否则在开发板启动时会出现错误“ Bummer, could not run ‘etc / init.d / rcS’ no such file or directory ”,“/ bin /sh”no such file or directory”。在实验中,当看到提示的错误之后,我在choose your default shell下选择了ash。但重启开发板时仍然出现了上述的错误。于是我开始查看bin目录,发现找不到sh,有的是ash可执行程序。经过分析,我将inittab文件中的::askfirst:/bin/sh改成了::askfirst:/bin/ash,并将rc中的#!/bin/sh改成#!/bin/ash。重启开发板,错误被解决了。

h在Linux System Utilities中配置系统指令,为了使用NFS文件系统,要选择 mount ;Support mounting NFS file systems。 此外umount也应该选上,因为在inittab中有::shutdown:/bin/umount -a –r。

其他的选项要根据开发的需要进行选择。这些在实验记录中有详细的记录。这里就不再诉述。

配置好busybox之后保存退出。make——make install,就会在安装目录_install看到bin,sbin等目录,和一些指向busybox的可执行程序的符号链接。

3、构建文件系统

创建常用目录,etc,dev,lib,proc。并在各目录下建立必要的文件。具体方法见实验指导书上的操作步骤和实验记录纸上的过程记录。

这里只就几个重要问题做说明:

5

etc/inittab是由系统启动程序init读取并解释执行的。Init进程是系统启动的第一个进程,是其他所有进程的父进程。下面对inittab中的字段进行说明:

/etc/inittab文件中每个登记项的结构都是一样的,共分为以冒号“:”分隔的4个字段。具体如下:

identifier : run_level : action : process

本实验中无须指定identifier和run_level。action动作关键字。action用于指定init命令或进程对相应进程所实施的动作。本实验中包含的动作有:respawn(如果相应的进程还不存在,那么init就启动该进程,同时不等待该进程的结束就继续扫描/etc/inittab文件;当该进程死亡时,init将重新启动该进程。如果相应的进程已经存在,那么init将忽略该登记项并继续扫描/etc/inittab文件)。sysinit(只有在启动或重新启动系统并首先进入单用户时,init才执行这些登记项)。askfirst(进入console之前先询问一下shell要不要进入)。ctrlaltdel:允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。restart(系统重启的时候要执行的进程)。shutdown(系统关机时需要执行的进程)。 实验中编写的inittab文件的功能:在系统启动的时候执行/etc/init.d/rcS,即显示主机名是XScale270,将proc文件系统挂载到/proc目录,然后执行一条打印命令,即打印出/etc/motd里的启动信息。在进入console终端之前先问候shell:press “ENTER” to enter console(具体我记不清楚了,就是这个意思)。init进程启动选择终端tty5和tty6。当重启系统时执行/sbin/init初始化程序,若用户按下ctr+alt+del时,重启系统。当关机时实行解挂和关机。

创建dev目录,这个目录下建立必要的目录。实验操作的时候将老师提供的文档复制到文档里,将前面的命令符$去掉后,在终端中粘贴一下就执行了所有的命令。这个目录下有很多设备,如终端设备,dsp,声卡,frame buffer帧缓冲,硬盘(hda),鼠标,键盘,ram,触摸屏等。

建立lib目录,将交叉编译器链接库中路径下的几个库复制到lib目录,并做软链接。这样做的原因是:

Busybox本身不带glibc和uclibc,所以实验中要用静态链接的方式来运行应用程序,并且实验中要将这些库安装在/lib目录下。本实验中安装了三个库文件,ld-2.3.2.so,libc-2.3.2.so,libm-2.3.2.so。它们分别是linux的动态加载器和libc标准的c库函数,和数学库。实验中还做了四个软链接,这些软链接使其不受版本的影响,从而具有向后兼容的作用,所有的linux

6

版本都能使用这些共享库。

4、制作JFFS2的文件映像

在busybox的目录下,用mkfs.jffs2制作JFFS2文件系统。命令为: mkfs.jffs2 –o fs.img–e 0x40000 –r _install -p -l

说明:-o 选项表示输出的文件系统镜像名为fs.img;-e选项表示所需内存至少为64K;-r表文件系统镜像所在的目录。-l表示制作一个小型的jffs2文件系统。

5、加载文件系统

用实验一中的方法加载内核和文件系统,启动开发板。

实验过程中,通过反复调试,修改开发板启动过程中的错误,将必要的配置选项加入后,开发板正常启动,出现了/etc/motd中要求显示的欢迎界面。进入开发板环境中,编写简单的应用程序来检测文件系统的可行性。在实验中,先建立/mnt目录,配置ip后,将/mnt目录挂载在主机的/exp共享目录下,然后编写简单的应用程序,hello.c。在主机上交叉编译后,在目标板上 运行成功。

五、实验总结

花了五六次课的时间做上面三个实验,对嵌入式linux开发环境、内核和文件系统有了更加清楚的认识,明白了嵌入式系统的特点,如它不提供bios程序,所以基本输入输出由程序员完成;缺乏友好的人机交互界面,开发能力不如通用计算机,存储空间有限。这些特点决定了嵌入式系统的开发 需要在宿主机上开发,通过交叉编译,利用串行口和网口进行开发。

试验一中我了解到了嵌入式系统的基本硬件设施,熟悉了几个接口:JTAG主要用于bootloader引导和调试,RS232串行接口用于bootloader初级引导。学会了用minicom这个串口通信软件建立开发板和宿主机之间的连接。明白了tftp协议传输的设置。通过网络文件系统NFS实现目录的挂载和文件的共享。

实验一是第一次接触嵌入式开发实验,很多东西都很陌生。实验中犯了很多错误,比如说实验过程中总是按照实验指导书的提示做,没有理解目录及操作的作用,以至于在目录挂载的时候,将/mnt目录挂载到了主机的/opt目录,结果发现主机上交叉编译后,在目标机上没法正确运行。后来在看书和同学交流的帮助下,明白了NFS是有一个共享目录的,只能将主机的共享目录挂载到目标机上,否则无法实现共享。而共享目录和权限是在

7

/etc/exports中设定的。通过查看该文件可以知道现有的共享目录,实验室是/exp;也可以通过编辑这个文件来修改共享目录。总之在实验中要明白实验中每一个步骤的目的,搞清楚它们之间的联系,而不能照搬书上的内容。 实验二是内核的配置和编译,在实验过程中,我通过查看内核源码中的各个目录,结合书本知识,明白了内核各个目录的作用,也清楚了内核源码的结构。在内核配置时,我仔细查看了配置选项的功能,虽然有很多看不懂,而且实验之前内核选项已经基本配置好,不需要做太多的变更。实验中我又犯了比较低级的错误,在生成内核镜像后没有把它复制到正确的目录/tftpboot下,导致内核没法下载到开发板中。这说明我在实验一时没能理解/tftpboot的作用,它是tftp协议服务的主目录,文件只有放到这个目录下才能通过tftp服务下载。

实验三是文件系统的构建和编译。首先要理解busybox的作用。Busybox是一个集成的应用程序。文件系统中需要许许多多的程序,这些程序如果独立编译,会显得相当繁琐。利用busybox对应用程序进行裁剪,使其生成文件系统需要的应用程序。通俗地说Busybox是帮助构建文件系统的。实验开始时,我没有明白busybox的作用,也不清楚各个配置选项的功能,所有在一开始配置busybox时,只是简单地改了一下静态编译方式,设置了交叉编译的路径,其它的选项都没做改动。结果在建立好文件系统目录,生成文件系统镜像后加载文件系统并启动时发现文件系统中缺少很多选项和很多程序,系统无法正常启动。后来通过不断的完善,终于可以启动文件系统,并在开发环境下运行简单的程序。

实验的整个过程是比较曲折的,感觉自己在一直犯错误,然后纠正错误。通过这次实验,基本上对嵌入式开发环境有了较深刻的认识。实验给我的经验是,以后在实验之前一定要多多查阅资料,帮助自己的理解。这样实验时才不会措手不及。

8

更多相关推荐:
操作系统文件系统实验报告后附源代码

目录1课程设计简介111课程设计的目的112课程设计内容12数据结构的设计221预定义222结构体223全局变量和函数23功能模块或算法描述531模块划分432模块流程图64程序运行结果85心得体会9参考文献1...

操作系统 实验报告 文件管理

昆明理工大学信息工程与自动化学院学生实验报告201201学年第二学期课程名称操作系统开课实验室年月日一实验目的用C或C语言编写和调试一个简单的文件系统模拟文件管理的基本功能从而对各种文件操作命令的实质内容和执行...

简单文件系统的实现实验报告

操作系统课程设计报告简单文件系统的实现专业班级姓名学号老师一课程设计的目的1通过具体的文件存储空间的管理文件的物理结构目录结构和文件操作的实现加深对文件系统内部数据结构功能以及实现过程的理解二课程设计要求1在内...

文件系统实验报告

试验四文件系统一实验目的1用高级语言编写和调试一个简单的文件系统模拟文件管理的工作过程从而对各种文件操作命令的实质内容和执行过程有比较深入的了解2要求设计一个n个用户的文件系统每次用户可以保存M个文件用户在一次...

实验四 文件系统实验报告

实验四文件系统实验一目的要求1用高级语言编写和调试一个简单的文件系统模拟文件管理的工作过程从而对各种文件操作命令的实质内容和执行过程有比较深入的了解2要求设计一个n个用户的文件系统每次用户可保存m个文件用户在一...

简单文件系统的实现的实验报告

杭州电子科技大学操作系统课程设计完成日期20xx528负责老师胡志凌专业计算机科学与技术22学院计算机学院学号09056012班级09056011课程设计题目简单文件系统的实现姓名庄严简单文件系统的实现一课程设...

文件系统设计实验报告

软件学院计算机课程实验报告册课程名称计算机操作系统实验学期20xx年至20xx年第2学期学生所在院系软件学院年级11级专业班级软件工程1班学生姓名朱水云学号1115114034指导教师陈自刚实验最终成绩软件学院...

Linux课程设计报告 编写proc文件系统相关的内核模块

Linux课程设计报告学院信息学院专业班级08级网络二班姓名学号实验目的1通过课程设计对操作系统基本原理进行更深入的认识以Linux为具体研究对象分析理解操作系统底层实现综合利用已学知识与技术就Linux操作系...

操作系统原理实验报告01

操作系统原理实验报告实验序号1实验项目名称Windows文件操作命令

操作系统实验报告

操作系统实验报告,内容附图。

文件系统实验报告

实验二文件系统实验报告一实验简介本实验要求在假设的IO系统之上开发一个简单的文件系统这样做既能让实验者对文件系统有整体了解又避免了涉及过多细节用户通过createopenread等命令与文件系统交互文件系统把磁...

文件系统课程设计报告

操作系统课程设计报告题目专业软件工程院系信息管理学院年级大三软件学号姓名指导教师李红艳职称副教授文件系统Q114111150132王毅湖北经济学院教务处制目录操作系统课程设计报告一实验内容2二设计的基本概念和原...

文件系统实验报告(29篇)