这里用官方源码/example/hello做示例。
在编译完成之后我们会得到hello.o的可执行文件,
使用 ./hello -h 可以看到一大堆选项
其中需要注意的是:
再来看看上一节写的 fuse_main 函数
其中argc, argv就对应传入的option 和 mountpoint。
所以,我们实际 *** 作的位置不能是挂载点。
我们先定义一个映射的位置 static const string root_path = "/home/ubuntu/hello"那么挂载点中所有的 *** 作都会映射到这个目录。
还学要解决一个问题就是我们的函数中传入的目录实际上都是相对于挂载点的路径:
比如: /挂载点/b/a.txt
函数实际接收到的路径是 /b/a.txt
但是我们实际的 *** 作目录是在 /home/ubuntu/hello ,因此需要对目录做一个转化。将 /挂载点/b/a.txt 转换为 /home/ubuntu/hello/b/a.txt ,这一步很简单,定义一个fullpath函数如下:
这个函数主要是用来获取各种属性信息,简单记get attributes。
这一步就是要去调用实际的linux调用,将实际的信息传递给fuse文件系统。流程如下:
参数path为相对路径,stbuf是stat结构体,fi一般是NULL(fuse.h有说明)
同理 opendir 就是要去对应的 dir 调用 opendir 返回信息。opendir函数返回的打开的文件夹句柄,需要填充到fi->fh字段。(fh可以去fuse_common.h查看,如下:
readdir 的写法也是类似,不过需要注意的是,目录中可能含有多个条目,因此我们需要将所有的条目全部返回给fuse。
关于目录可能用到的结构体可以参考: https://www.cnblogs.com/jikexianfeng/p/7084911.html
目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针。
dirent 结构体:
filler函数的官方解释如下:
是用来在readdir *** 作中添加entry(条目)的。
顾名思义:释放目录,也就是释放资源。只需要调用closedir关闭dir即可。
我们添加一个main函数用于测试:
添加makefile文件:
执行编译:
运行:
为了测试我们先在 /home/ubuntu/hello 目录下创建一个文件 touch /home/ubuntu/hello/file1
运行文件系统之后我们在挂载点执行ls
可以看到结果输出file1。
嵌入应用:如何制作和使用Jffs2文件系统 (zhuan)本文主要介绍如何在AT91SAM9261EK板子上制作和使用jffs2文件系统,使用的是linux-2.6.21内核。首先配置MTD
$ make menuconfig
进入 Memory Technology Devices (MTD) --->
<*>Memory Technology Device (MTD) support
[*] Debugging
[*] MTD partitioning support
[*] Command line partition table parsing
[*] Direct char device access to MTD devices
[*] Caching block device access to MTD devices
RAM/ROM/Flash chip drivers ----->
<*>Detect non-CFI AMD/JEDEC-compatible flash chips
<*>Support for AMD/Fujitsu flash chips
Mapping drivers for chip access --->
[*] Support non-linear mappings of flash chips
Self-contained MTD device drivers --->
[*] Support for AT45... DataFlash
NAND Flash Device Drivers ---->
[*] NAND Device Support
[*] Support for NAND Flash /SmartMedia on AT91
File systems ---->
<*>Second extended fs support
[*] Inotify file change notification support
[*] Inotify support for user space
<*>Filesystem in Userspace support
Miscellaneous filesystems
<*>Journalling Flash File System v2 (JFFS2) support
[*] JFFS2 write-buffering support
<*>Compressed ROM file system support (cramfs)
以上配置中没有列出的,都没选;其配置仅做参考,可根据自己的需要自行配置。
$ make all
其次制作mtd-util工具
从网上下载zlib-1.2.3.tar.gz 解压缩 $ cd zlib-1.2.3
$ ./configure –prefix=/usr/local/arm/3.4.1/arm-linux --shared
修改Makefile如下:
CC=arm-linux-gcc
LDSHARED=arm-linux-ld -shared
$ make all
$ make install
注意:这里是安装在/usr/local/arm/3.4.1/arm-linux目录下
由于交叉编译mtd工具时需要zlib.h文件,所以在编译之前先安装zlib库文件。
从网上下载 mtd-snapshot-20050519.tar.bz2 解压缩 $ cd mtd/util
修改该目录下的Makefile:
CROSS=arm-linux-
$ make all
然后将该目录下生成的 flash_erase,flash_eraseall, mkfs.jffs2工具放在ramdisk 文件系统中(我这里放在/bin目录下),另外在 ramdisk文件系统的dev目录下要保证有mtd0~mtd9,mtdblock0~mtdblock9这些设备,如果没有可参考 ramdisk文件系统的制作,也可从pc机相同目录下拷贝,要加上文件属性。
另外,需要将/arm-linux/lib目录下的libz.so, libz.so.1, libz.so.1.2.3文件拷贝到ramdisk文件系统的/lib目录下,否则mkfs.jffs2工具不能使用。
最后将新生成的uImage和ramdisk文件下载到板子上,起动系统,使用命令 cat /proc/mtd 可以看到
dev: size erasesize name
mtd0: 00040000 00020000 "Partition 1"
mtd1: 0ffc0000 00020000 "Partition 2"
mtd2: 00420000 00000210 "spi0.0-AT45DB321x"
这里mtd0,mtd1是nandflash上的分区; mtd2是dataflsh上的分区,该分区上放有u-boot,uImage.img,ramdisk.img,所以我们这里可以使用空的nandflash上的两个分区。使用之前要先用工具flash_erase或者flash_eraseall擦除nandflash,具体使用的步骤如下:
# flash_erase /dev/mtd1
制作jffs2映像
# cd /var/tmp
# mkdir jffs2 (jffs2下的目录可以任意建)
# mkfs.jffs2 –d jffs2/ -o jffs2.img
# cp /var/tmp/jffs2/jffs2.img /dev/mtdblock1
最后# mount -t jffs2 /dev/mtdblock1 /mnt/mtd即可,使用结束可使用$ umount /mnt/mtd 卸载.
如果只是当作普通的jffs2 来使用dataflash或者nandflash,可不必制作 jffs2映像,只需要最后一步,# mount -t jffs2 /dev/mtdblock1 /mnt/mtd即可。
AT91sam9263EK使用JFFS2根文件系统
在AT91sam9263EK成功配置了NFS根文件系统后,后来又想把JFFS2也移植到AT91sam9263EK上吧,说干就干。
1. 呵呵,其实很简单我使用的linux-2.6.20内核里已经有jffs2 文件系统支持,选上jffs2即可
File systems --->
Miscellaneous filesystems --->
<*>Journalling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[*] JFFS2 summary support (EXPERIMENTAL)
[*] JFFS2 XATTR support (EXPERIMENTAL)
[*] JFFS2 POSIX Access Control Lists
[*] JFFS2 Security Labels
[*] Advanced compression options for JFFS2
[*] JFFS2 ZLIB compression support
[*] JFFS2 RTIME compression support
[ ] JFFS2 RUBIN compression support
JFFS2 default compression mode (priority)
选上MTD支持
Device Drivers --->
Memory Technology Devices (MTD) --->
<*>Memory Technology Device (MTD) support
[ ] Debugging
<*>MTD concatenating support
[*] MTD partitioning support
<>RedBoot partition table parsing
[*] Command line partition table parsing
<*>ARM Firmware Suite partition parsing
--- User Modules And Translation Layers
<*>Direct char device access to MTD devices
<*>Caching block device access to MTD devices
<*>FTL (Flash Translation Layer) support
<*>NFTL (NAND Flash Translation Layer) support
[ ] Write support for NFTL
2. 从ttp://www.linux-mtd.infradead.org/上下载
mtd-utils-1.0.0.tar.gz 到宿主机。
解压
tar xvzf mtd-utils-1.0.0.tar.gz
进入mtd-utils-1.0.0目录修改Makefile进行编译。
编译出mkfs.jffs2,nandwrite等工具
3. 创建jffs2根文件系统:
首先要有一个其他类型的根文件系统,制作和获取方式可以参见<<AT91sam9263EK使用NFS根文件系统>>
比如可以:
mount -t cramfs rootfs_lnxdemo.cramfs tmp/ -o loop
rootfs_lnxdemo.cramfs由atmel提供当然你可以自己制作,这里直接使用atmel的省去了制作的麻烦。
tar czvf target.tar.gz tmp/
生成jffs2根文件系统镜像:
mkfs.jffs2 –l –s 0x400 –e 0x20000 –d tmp/ -o target.jffs2
4. 烧写jffs2根文件系统镜像到nand flash。
烧写方法应该有多种常用的有2种(呵呵自己认为的):
a.通过nand编程器烧写镜像文件到nand flash芯片然后再焊接到pcb.
b.挂载nfs文件系统,使用nandwrite工具写镜像文件
到mtd设备。
第一种适合生产时使用,而我们测试时候比较适合使用第二种方式。
挂载nfs文件系统:
nandwrite –o /dev/mtd1 target.jffs2
或者是在nfs 根文件系统下:
mount –t jffs2 /dev/mtdblock1 /mnt
cd /mnt
tar xvzf ../target.tar.gz
umount /mnt
5. 配置内核启动参数如下:
setenv bootargs mem=64M console=ttyS0 115200 root=/dev/mtdblock1 rootfstype=jffs2 rw
6. 重新启动,呵呵内核使用jffs2文件系统自动挂载根文件系统到mtdblock1设备上。
ls 测试一下
vi test
hello this is for test jffs2 filesystem.
保存退出。
Sync
重新启动
vi test
内容依旧。
Ok jffs2根文件系统引导成功。
Linux联盟收集整理 ,转贴请标明原始链接
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)