2022年适用于嵌入式linux的文件系统的制作 .pdf
《2022年适用于嵌入式linux的文件系统的制作 .pdf》由会员分享,可在线阅读,更多相关《2022年适用于嵌入式linux的文件系统的制作 .pdf(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、适用于嵌入式linux 的文件系统的制作在嵌入式 linux系统中,文件系统是一个非常重要的组成部分,如果根文件系统工作不正常,则整个系统将无法工作,系统启动的时候会出现kernel pannic的大故障报警。首先简要的介绍一下建立嵌入式的文件系统所需要的必要的文件夹:1 嵌入式系统文件目录简介1.1 /dev/dev: 在 dev目录下,该目录下应该包含嵌入式系统所支持的所有设备所必须的设备文件。有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
2、 - - - - - 第 1 页,共 28 页 - - - - - - - - - 其中 mtd04,mtdblock04,分别是nandflash上的 mtd分区设备所必须的,分别代表字符设备和块设备,有时候我们可以见到带目录形式的设备名称。这只不过是设备文件系统的两种不同的表现形式。就如:/dev/mtd/0,文件的这种格式。null ,console这两者是最基础的,所以是必须,console指向控制台,ttS04,tts/04分别是两种形式的串口硬件设备的设备文件系统,当你不知道你的应用程序使用哪种形式的设备文件的时候,你最好两者都建立。ttySA03是串口设备的另外一种格式,具体含义
3、大家可以参考/kernel/Documentation/devices.txt文件的介绍。sda04是正确加载 u 盘设备所必须的设备文件。ram03 分别代表内核中的ramdisk 设备,如果你希望以cramfs 的格式来加载文件系统的话,必须要打开内核中对ramdisk 技术的支持。有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 28 页 - - - - - - - - - 该选项打开的位置位于devic
4、es driver-block devices目录下。shm目录为加载 tmpfs 文件系统所必须的设备目录。pts 目录为 devpts 文件系统所必须的文件目录。rtc0 文件为硬件时钟设备文件。是使用rtc 设备所必须的,但是你的内核必须自带rtc 设备的驱动,或者添加rtc 的设备驱动程序,本人的内核是没有带rtc 的设备驱动的,需要移植驱动程序产生,这一步待做。1.2 /bin,/sbin/bin,/sbin目录分别存储 busybox 自带的命令。1.3 /etc/etc 目录下带设备文件所必须的配置文件:1.4 /lib有疑问请联系 (23012675 ) 博客地址 : http
5、:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 28 页 - - - - - - - - - /lib目录用来存放busybox 和应用程序所需要的动态链接库文件。1.5 /proc,/sys/proc ,/sys 目录为文件系统工作正常所必须的文件夹,分别用来加载proc 和 sys的文件系统。1.6 /mnt为挂载文件所处的文件夹。yaffs 文件系统就挂载在该文件目录下。1.7 /tmp该文件为空文件目录,临时文件夹,无意义。1.8 /usr,/home,/va
6、r这三个文件夹为经常进行读写操作的文件夹,我们使用ln 将其链接到 yaffs文件系统下面,这是专门针对cramfs 为根文件系统的系统设计。有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 28 页 - - - - - - - - - 2 制作 cramfs 文件系统在上文中,我们已经获得了一个完整的嵌入式文件系统,下面我们需要做得就是将该系统文件夹打包制成cramfs 的文件系统。首先在网上下载 cramf
7、s1.1文件系统工具。 然后修改 根目录下的 GNU makefile 文件,这 里有一个 小技巧,该工具我们可以生成两个可执行文件, mkcramfs和 cramfsk ,将Makefile文件的 CC修改为 arm-linux-gcc,则可以 编译嵌入式系统下可以使用的工具,如果将CC该为 gcc ,则生成的是 PC机上使用的工具。2.1 文件系统的配置我们内核的配置参 数是:CONFIG_CMDLINE=root =/dev/ram0 rw initrd=0 x21100000,17000000 console=ttyS0,115200 mem =64M ip =192.168.0.11
8、 netmask =255.255.255.0 我们建立的嵌入式文件系统的思路 是,首先将 cramfs 文件系统 影像烧 写到 nand flash 上面, 然后通 过 u-boot 对 cramfs 的支持将 cramfs 加载到内核 ram地址中, 注意,我们的 commandline中定义的 长度必须大于 真实 的 cramfs 文件系统的 长度 ,我们 默认的一个 ramdisk 的大 小是 16M ,所以我们将 长度定 义为 17000000 。 起始 地址是 0 x21100000 。注意我们定义的地址的格式是 起始 地址为 16进制, 而长度 为 10进制。嵌入式系统在内核加载
9、成功之后 ,开 始加载根文件系统,根文件系统加载成功之后 ,内核的 init进程会自动的 查找 rcS 文件,该文件位于/etc/init.d/rcS。注意内核在 2.6开始之后 ,不会自动的加载proc ,sys等文件系统,必须要 通过手动的 mount操作,如果没有对这 些文件系统进行mount操作的话,就会出现echo,telnetd等命令 not found的故障。同时出现 cant access your tty name的错误 ,出现这种问 题的原因 就是你的一 些文件系统没有正常的加载。为了保证文件系统的正常加载,我们的/etc/init.d/rcS文件如下:#! /bin/sh
10、#该文件必须要先 执行这一 条指令, 否则会报出下面的命令无法找到的 错误!cd /bin有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 28 页 - - - - - - - - - echo e Starting Systemecho e M ounting some FileSystems !#该指令会将/etc/fstab文件中 定义的文件系统 按照 行来进行加载mount -a#将启动 信息 写入 /
11、var/log/dmesg文件中,这个文件存在于nandflash 中。dmesg /var/log/dmesg#开启 telnetd服务的关键 就是打开这个进程。telnetd -l /bin/login/etc/fstab文件的内 容如下:# proc/procprocdefaults 00devpts /dev/pts devpts defaults 0 0tmpfs/dev/shm tmpfsdefaults00sysfs/sys sysfsdefaults00/dev/mtdblock2 /mnt/flash2yaffsdefaults00mount -a 命令会 按行来加载这 些文
12、件系统。2.2 cramfs文件系统的制作 与下载首先制作 cramfs 的文件系统, 方法如下:然后使用 tftp协议 将这些文件映像 下载到 ram 中去,通过 u-boot 的 nand flash操作函数将 cramfs 文件 映像烧 写进 nandflash 中, 然后修改 u-boot 的启动参 数,每次启动时自动的 去从 nand flash中读取 cramfs 文件系统。cramfs 文件系统的 映像 可以 达到 50% 的压缩比率 ,效率还 是比较高 的。 10 M的内 容被压缩 为 5M 。有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - -
13、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 28 页 - - - - - - - - - 有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 28 页 - - - - - - - - - 首先将文件系统 烧写进 flash 之后,修改环境变量bootcmd为:bootcmd=run nf _ramdisk
14、;run nf _kernel ;run boot然后重启系统 即可。从最后的启动 信息来看,在根文件系统加载成功之后 ,最先 被执 行的就是/etc/init.d/rcS文件。系统加载成 功。有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 28 页 - - - - - - - - - 3、yaffs 文件系统 映像制作 与下载这个文件系统的制作,耗费 了我两 天的时间,将 u-boot 的关于 nandfl
15、ash 操作的 源码通读了一 遍,最后,终于实现了 u-boot 对 yaffs文件系统的下载的支持。那么 我们就可以在生产的过程中,首先通过 SAM - BA将 u-boot 顺利 的下载到 dataflash中,这 样用户通过 u-boot 来更新内核区代 码和 yaffs文件系统的代 码,避免了用最 笨的办法(先 通过nfs 或者 cramfs 、ramdisk 来作为根文件系统来启动系统,再 mount yaffs文件分区,最后通过文件 拷贝 来在 yaffs文件分区上建立一个完整的根文件系统)来创建 yaffs的根文件系统。这样做可以大大 减少 生产的工序 与时间。同时 逼迫 自己熟
16、悉 了 nand flash的操作 流程与 u-boot 的文件 结构 。同时 也加深了对 u-boot 程序的 调试 的理解 。重要的是这个过程。3.1u-boot 对 yaffs文件系统的支持为了调试 u-boot 对 yaffs的支持,我们不得不提到两个工具,一个是在pc机上使用的 hexedit,该程序可以以 16进制的格式 显示 文件,我就使用该工具来查看my _yaffs _fs.img 文件的内 容,这个文件就是yaffs文件系统的 映像 。还有一个就是在嵌入式环境 下使用的 md 20400000 400,该命令是 属于 u-boot 的,用来显示 内存中 从 20400000
17、开始的数据 ,首先使用 nand read 20400000 c00000 a00000,将数据从 nand flash中读入, 然后 使用 md命令显示!这样就可以用这两个命令来相互比较!看 你制作的 结果!使用命令 mkyaffsimage root_fs my _yaffs _fs.img。该命令将root _fs 文件夹制做成为 yaffs 的系统 映像。我们可以 看到一 共有 19820个 nand 页面。其大 小为 10464960字节,所以我们知道该有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - -
18、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 28 页 - - - - - - - - - 文件系统是 528字节每页 ,当然这就包 括了 512字节的数据 和 16个字 节的 oob数据 。我们使用 hexedit 函数 来查看 一下该文件系统的内容。我们可以 看到 0 x200地址开 始的是 oob的 16个字 节。而这个地址 里面最重要的部分就是页有效字节,第 6 个字节,该字 节一定要保证 是 0 xff ,当该字 节不是 0 xff的时候,说明该页是坏页 。我们首先 看 makeyaffs.c 文件,在该文件中static i
19、nt write _chunk(_ u8 *data, _u32 objI d, _u32 chunk Id, _u32 nBytes )这个函数将 528个字节的数据 写入文件中,其中512个字节,还包括 16个字 节的oob数据 ,而这 16个字 节的内 容的定义在: fs/yaffs/yaffs_guts.h 文件中。typedef struct _u8 tag Byte0 ;_u8 tag Byte1;_u8 tag Byte2 ;_u8 tag Byte3;_u8 pageStatus ;/ * set to 0 to delete the chunk */_u8 blockStat
20、us;_u8 tag Byte4 ;_u8 tag Byte5 ;_u8 ecc13;_u8 tag Byte6 ;_u8 tag Byte7 ;_u8 ecc23 ; yaffs_Spare;有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 28 页 - - - - - - - - - 这里要注意, makyaffs.c 文件使用的 yaffs的 ecc 校验算 法和内核的使用的ecc校验算法必须一 致,不
21、然的话加载系统的时候会给你报错! 就像下面这 样!这就是你写入的 映像 中采用的 ecc的校验算 法和内核 采用的 校验算 法不一 致导致 出现的问 题。我的 linux-2.6.15 打的 yaffs 补丁 的内核配置是:下面我们要重 点讲一下, u-boot 中 yaffs系统的支持。一个 小插曲 ,当你的 nand flash 中出现大 量的坏块的时候,一 般都是 由于你 错误的向 nandflash 里面写入了 数据 ,将最后 16个字节里 面的第 6 个字 节从 0 xff写为其 他的数据 了。 结果 u-boot 就认为是 坏块,其实这是 假坏 块,但是你 即使使用 nand er
22、ase 来擦除 的话, 擦除显示 成功,但是你使用有疑问请联系 (23012675 ) 博客地址 : http:/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 28 页 - - - - - - - - - nand read 来读的话会 显示 ERROR 。其 实这个 原因 就是执行读操作的时候 发现该块 被标记为坏的,就不会 去继续 读的操作,所以会报错。但是为 什么擦除 了之后,还是会这 样,其实看了 cmd _nand.c的源码之后 ,你会 发现,在 执行擦除
23、的操作的时候,程序发现该块是 坏块就根本没有 执行擦除 操作, 解决 的办法就是 ALLOW_ER AS E_BAD_DEBUG ,该 宏定义为 1,这样,不 管如何都执行擦除 的操作 !我使用的 u-boot 的版本是 1.1.4 ,我将该 cmd _nand.c文件贴出来。这里里 面的最上 层的命令是:do _nand 函数 ,该函数 用来区分 nand read,nand write等命令。if (strncmp (argv1, read, 4 ) = 0 | strncmp(argv1, write , 5 ) = 0 ) ulong addr = simple _strtoul(ar
24、gv2, NULL , 16);ulong off = simple _strtoul(argv3, NULL , 16);ulong si ze = simple _strtoul(argv4, NULL , 16);int cmd = (strncmp (argv1, read, 4 ) = 0 ) ?NAN DRW_RE AD : NANDRW_WRITE;int ret, total;char * cmdtail = strchr(argv1, .);if (cmdtail & !strncmp (cmdtail, .oob, 2 ) / * read out-of-band data
25、 */if (cmd & NANDRW_RE AD) ret = nand _read_oob(nand_dev_desc + curr _device, off, size, (si ze_t *)&total,(u_char *)addr);else ret = nand _write _oob(nand_dev_desc + curr _device, off, size, (si ze_t *)&total,(u_char *)addr);return ret;else if (cmdtail & !strncmp (cmdtail, .j ffs2 , 2 )cmd |= NANDR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年适用于嵌入式linux的文件系统的制作 2022 适用于 嵌入式 linux 文件系统 制作
限制150内