嵌入式linux文件系统简介

嵌入式文件系统

文件系统

文件系统存储介质是Flash芯片,常用的嵌入式文件系统类型有Cramfs、JFF、Yaffs、网络文件系统等。

架构如图所示:

嵌入式linux文件系统简介_第1张图片

linux下的文件系统主要分为三个层次:

上层用户空间的应用程序对文件系统的系统调用。

虚拟文件系统。

挂在到VFS中的各种实际文件系统。

用户空间包含一些应用程序和glibc,用于为文件系统调用(打开/读写/关闭)提供用户接口。

系统调用接口就像交换器,将系统调用从用户空间发送到内核空间。

系统调用实际上是通过调用内核虚拟文件系统提供的统一接口来完成对各种设备的使用。

VFS虚拟文件系统就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分。它位于用户程序和具体的文件系统之间。它为用户程序提供了标准的文件系统调用接口,对具体的文件系统,它通过一系列的对不同文件系统共用的函数指针来实际调用具体的文件系统函数,完成实际的各有差异的操作。任何使用文件系统的程序必须经过这层接口来使用它。通过这样的方式,VFS就对用户屏蔽了底层文件系统的实现细节和差异。

虚拟文件系统提供了很多的统一接口,使系统屏蔽了不同文件系统对于应用程序的差异。各种具体的操作由具体的文件系统按照各自的方式实现,如Yaffs文件系统、JFFS等文件系统都有自己的实现方式,但这些文件系统都导出一组通用接口供VFS使用。

这种想法类似于面向对象中的多态:系统将不同的文件系统封装起来,向用户提供统一的借口。相同功能的函数被不同的文件系统重载,完成各自需要的操作。

根文件系统

运行linux操作系统,除了内核代码外还需要根文件系统。

根文件系统通常是一个存放系统运行时必要文件、存储数据文件的外部设备。

根文件系统一般都包括主要一些子目录:/etc/、/dev/、/usr/、/usr/bin/、/bin/、/var/等。

内核代码镜像文件bootimage也保存在根文件系统中。

系统引导启动程序会从根文件系统设备上把内核执行代码加载到内存中去运行。

根文件系统的树状结构:

嵌入式linux文件系统简介_第2张图片

根文件系统制作

制作嵌入式根文件系统一般使用开源的busybox工具,busybox在设计上充分考虑了硬件资源受限的特殊工作环境。所有命令都通过插件的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。

最终生成的可执行文件为busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。busybox单一执行文件最大限度共享程序代码、文件头、内存中的程序控制块等操作系统资源。

MTD驱动程序

MTD提供访问Flash存储设备能力,提供了对Flash操作的一系列标准擦除和读写操作接口、驱动接口,可以把各种Flash设备加入到内核中。

JFFS2文件系统就建立在MTD-BLOCK模块的基础之上的。

使用JFFS2文件系统,需要把MTD编译到内核中,MTD提供MTD-CHAR和MTD-BLOCK这两个模块用于对Flash的访问。

MTD-CHAR将Flash表现为字符设备,设备文件是/dev/mtd0。

MTD-BLOCK将Flash表现为块设备,设备文件是/dev/block。

嵌入式linux文件系统简介_第3张图片

NFS网络文件系统

在开发过程中,编译的环境和运行的环境不一样,需要交叉编译编译工具,一般是在PC上面运行交叉编译工具编译好程序,然后再烧写到目标板的Flash上。如此一来频繁调试程序,每次都需要烧写是一件很麻烦的事。

可以通过用NFS文件系统调试程序解决这个问题。

在PC上构建NFS文件系统挂载到开发板中,PC上的程序不需烧写就可以在开发板上运行。

你可能感兴趣的:(linux内核,嵌入式,文件系统,内核,linux)