YAFFS 中是从头到尾对块搜索,所以在垃圾收集上 JFFS 的速度慢,但是能延长 NAND 的寿命.
3 )、 JFFS 支持文件压缩,适合存储容量较小的系统; YAFFS 不支持压缩,更适合存储容量大的系统.
YAFFS 还带有 NAND 芯片驱动,并为嵌入式系统提供了直接访问文件系统的 API ,用户可以不使用 Linux 中的 MTD 和 VFS ,直接对文件
进行操作. NAND Flash 大多采用 MTD+YAFFS 的模式. MTD ( Memory Technology Devices ,内存技术设备)是对 Flash 操作的
接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开.
YAFFS2 是 YAFFS 的升级版,能更好的支持 NAND FLASH .
//点击左下角的 Download tarball 下整个tar包
cvs下载:
export CVSROOT=:pserver:[email protected]:/home/aleph1/cvs cvs logon
cvs co yaffs2
tar -xvf yaffs2.tar.bz;cd yaffs2;make
为ubuntu 8.10 添加yaffs文件系统支持
sudo mkdir -p /lib/modules/2.6.27-4-generic/kernel/fs/yaffs2
sudo cp yaffs2.ko /lib/modules/2.6.27-4-generic/kernel/fs/yaffs2/
sudo insmod /lib/modules/2.6.27-4-generic/kernel/fs/yaffs2/yaffs2.ko
制作yaffs2文件系统
mkyaffs2image /nfsroot/rootfs/system system.img
/nfsroot/rootfs/system 为文件系统所在的目录 system.img 为生成的镜像文件
2.4.2 在pc上挂载yaffs2文件系统
sudo mkdir -p /mnt/mtd/yaffs2
sudo modprobe mtdblock
sudo modprobe mtdram total_size=100000 erase_size=256
sudo insmod /lib/modules/2.6.27-4-generic/kernel/fs/yaffs2/yaffs2.ko
sudo dd if=rootfs.yaffs2 of=/dev/mtdblock0
sudo mount -t yaffs2 /dev/mtdblock0 /mnt/mtd/yaffs2
#modprobe mtdram total_size=49152 erase_size=128
#cat rootfs.yaffs2 >/dev/mtdblock0
2.4.3 通过工具释放yaffs2 文件系统
yaffs2 image逆向工具
2.5 虚拟文件系统(sysfs,proc,tsmpfs等)
2.5.1 虚拟文件系统概述
2.5.2 proc 文件系统
2.5.3 sysfs文件系统
2.5.4 tmpfs文件系统
2.5.5 usbdevfs文件系统
2.5.6 devpts文件系统
2.5.1 虚拟文件系统概述
虚拟内核文件系统(Virtual Kernel File Systems),是指那些是由内核产生但并不存在于硬盘上(存在于内存中)的文件系统,
他们被用来与内核进行通信前面介绍的ext2,ext3,jffs2,yaffs2等目录和文件,都是真真正正、实实在在的存储在具体的外部存
储设备上的,它们可能是在本机的硬盘、闪存、光盘中,可能保存在不只一个磁盘分区中,也可能保存在网络中其它主机的存储设备中的.
虚拟文件系统,虽然它们出现在根文件系统中,但它里面的内容却无法在任何外部存储设备中找到,因为它们都在内存中.
android 网络挂载:
java代码:
- rootfs / rootfs rw 0 0
- /dev/root / nfs rw,vers=2,rsize=1024,wsize=1024,...
- tmpfs /dev tmpfs rw,mode=755 0 0
- devpts /dev/pts devpts rw,mode=600 0 0
- proc /proc proc rw 0 0
- sysfs /sys sysfs rw 0 0
- tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
- /dev/block/mmcblk0p1 /sdcard vfat rw,...
复制代码
Android 本机挂载(使用flash中的文件系统)
java代码:
- rootfs / rootfs ro 0 0
- tmpfs /dev tmpfs rw,mode=755 0 0
- devpts /dev/pts devpts rw,mode=600 0 0
- proc /proc proc rw 0 0
- sysfs /sys sysfs rw 0 0
- tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
- /dev/block/mtdblock2 /system yaffs2 ro 0 0
- /dev/block/mtdblock3 /data yaffs2 rw,nosuid,nodev 0 0
- /dev/block/mmcblk0p1 /sdcard vfat rw
复制代码
ubuntu 系统:
java代码:
- /dev/sda8 on / type ext3 (rw,relatime,errors=remount-ro)
- tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
- /proc on /proc type proc (rw,noexec,nosuid,nodev)
- sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
- varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
- tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
- devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
- /dev/sda7 on /boot type ext3 (rw,relatime)
- /dev/sda11 on /home type ext3 (rw,relatime)
- /dev/sdb5 on /opt type ext3 (rw,relatime)
- /dev/sda9 on /usr/local type ext3 (rw,relatime)
- /dev/sda1 on /windows/c type vfat (rw,utf8,umask=007,gid=1000)
- /dev/sda5 on /windows/d type vfat (rw,utf8,umask=007,gid=1000)
- /dev/sda6 on /windows/e type vfat (rw,utf8,umask=007,gid=1000)
复制代码
2.5.2 proc 文件系统
proc是一个重要虚拟文件系统,通过它里面的一些文件,可以获取系统状态信息并修改某些系统的配置信息.proc文件系统本身不占用
磁盘空间,它仅存在于内存之中,为操作系统本身和应用程序之间的通信提供了一个安全的接口.当我们在内核中添加了新功能或设备驱
动时,经常需要得到一些系统状态的信息,一般这样的功能可能需要经过一些象ioctl()这样的系统调用来完成.系统调用接口对于一些
功能性的信息可能是适合的,因为应用程序必须将这些信息读出后再做一定的处理.但对于一些实时性的系统信息,例如内存的使用状况,
或者是驱动设备的统计资料等,我们更需要一个比较简单易用的接口来取得它们.proc文件系统就是这样的一个接口,我们可以简单的用
cat、strings程序来查看这些信息.例如,执行下面的命令:
cat /proc/filesystems //操作系统支持的文件系统类型
cat /proc/meminfo //内存的实时信息,内存大小等
cat /proc/partitions //存储器分区信息
cat /proc/cpuinfo //查看cpu信息
同样的,free、df、top、ps等程序的功能实现,强烈依赖于proc文件系统,为了使用那些程序,一定要使内核支持proc文件系统,并将其挂接到根文件系统的/proc目录下。
其他使用 /proc 文件系统的例子:
processor : 0
vendor_id : AuthenticAMD
processor : 1
vendor_id : AuthenticAMD
model name : AMD Athlon(tm) 64 X2 Dual Core CPU 5000+
1.vmware 虚拟机无法正常启动
在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),
例如 ubuntu 8.10 的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB).
2.scratchbox 开发工具不能登录
/scratchbox/login
Inconsistency detected by ld.so: rtld.c: 1192: dl_main: Assertion `(void *) ph->p_vaddr ==
_rtld_local._dl_sysinfo_dso' failed!
NOTE: on Ubuntu installation, you have to disable VDSO to make Scratchbox work fine,
or you'll get errors like this:
在 ubuntu 系统中,我们必须关闭 VDSO 标记,以便scratchbox能正常工作
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
vm.vdso_enabled = 0
vm.mmap_min_addr = 4096
修改 /proc 文件系统值的方法
1.直接修改
echo "2147483648" | sudo tee /proc/sys/kernel/shmmax
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
2.将以下命令放入 /etc/rc.local 启动文件中:
echo "2147483648" > /proc/sys/kernel/shmmax
echo 0 > /proc/sys/vm/vdso_enabled
echo 4096 > /proc/sys/vm/mmap_min_addr
3.使用 sysctl 命令来更改 SHMMAX 的值:
sysctl -w kernel.shmmax=2147483648
4.内核参数插入到 /etc/sysctl.conf 启动文件中,使这种更改永久有效
java代码:
- echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
- sudo sysctl ?p
- ./system/core/logcat/logcat.cpp:403: fd = open("/proc/cmdline", O_RDONLY);
- ./system/core/init/init.c:553: char cmdline[1024];
- ./system/core/init/init.c:557: fd = open("/proc/cmdline", O_RDONLY);
- ./system/core/init/init.c:580: chmod("/proc/cmdline", 0440);
- ./system/core/init/bootchart.c:139: proc_read("/proc/cmdline", cmdline, sizeof(cmdline));
- ./system/core/init/bootchart.c:319: proc_read( "/proc/cmdline", cmdline, sizeof(cmdline) );
- ./system/core/init/bootchart.c:320: s = strstr(cmdline, KERNEL_OPTION);
- ./system/core/rootdir/init.rc:162: chown root radio /proc/cmdline
复制代码
2.5.3 sysfs文件系统
与proc文件系统类似,sysfs文件系统也是一个不占有任何磁盘空间的虚拟文件系
统.它通常被挂接在/sys目录下.sysfs文件系统是Linux2.6内核引入的,它把连接在系
统上的设备和总线组织成为一个分级的文件,使得它们可以在用户空间存取.其实
sysfs是从proc和devfs中划分出来的.
一、devfs
linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种.
在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道
/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件
系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互.但是devfs文件系统有一些缺点,例如:
不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多
的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等.
二、sysfs
正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个
虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用
这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也
就可以被用户空间读写了.用户空间的工具udev 就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,
而devfs却运行在内核空间,而且udev不存在 devfs那些先天的缺陷.很显然,sysfs将是未来发展的方向.
2.5.4 tmpfs文件系统
tmpfs 是Linux特有的文件系统,唯一的标准挂接点是/dev/shm.当然,用户可以将其挂接在其他地方.tmpfs有些像虚拟磁盘(ramdisk),
但不是一回事.说其像虚拟磁盘,是因为它可以使用你的RAM,但它也可以使用你的交换分区.传统的虚拟磁盘是一个块设备,而且需要一个mkfs
之类的命令格式化它才能使用.tmpfs是一个独立的文件系统,不是块设备,只要挂接,立即就可以使用.tmpfs的大下是不确定的,它最初只有
很小的空间,但随着文件的复制和创建,它的大小就会不断变化,换句话说,它会根据你的实际需要而改变大小;tmpfs的速度非常惊人,毕竟它
是驻留在RAM中的,即使用了交换分区,性能仍然非常卓越;由于tmpfs是驻留在RAM的,因此它的内容是不持久的,断电后,tmpfs的内容就消
失了,这也是被称作tmpfs的根本原因.
tmpfs 是ramfs的衍生物,用来限制缓存大小、向swap空间写入数据.它是用来保存VM所有文件的文件系统.
tmpfs中缓存的内容全部是临时的.一旦卸载,所有的内容都会遗失.它把所有的缓存置于内核,它的规模随着
文件的规模同步变化.但是它规模有大小限制,可以修改.它可以把当前不再需要的页写入到 swap空间.
tmpfs 和 ramfs 本身就是一个文件系统, 用的时候只需要直接挂载就可以. tmpfs可以使用ram, 也可以使用swap
共享内存的时候会使用tmpfs
系统默认共享内存是内存的一半大小! /dev/shm是挂载点!
通过 df -h 可以看出,默认状况下它为内存大小的一半:
文件系统 容量 已用 可用 已用% 挂载点
tmpfs 1013M 12K 1013M 1% /dev/shm
mount | grep tmpfs 显示当前系统中的 tmpfs:
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
lrm on /lib/modules/2.6.27-4-generic/volatile type tmpfs (rw,mode=755)
2.5.6 usbdevfs文件系统
顾名思义,usbdevfs就是USB设备文件系统,它是一个动态生成的文件系统,有些类似于proc文件系统.它的标准挂接点是/proc/bus/usb,当然,也可以挂接到其他地方.它主要用于:用户级驱动、即插即用、提供USB设备信息、应用程序轮询。