Android 开发基础知识

Android 开发基础知识(六)

  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:anonymous@cvs.aleph1.co.uk:/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代码:

  1. rootfs / rootfs rw 0 0
  2.   /dev/root / nfs rw,vers=2,rsize=1024,wsize=1024,...
  3.   tmpfs /dev tmpfs rw,mode=755 0 0
  4.   devpts /dev/pts devpts rw,mode=600 0 0
  5.   proc /proc proc rw 0 0
  6.   sysfs /sys sysfs rw 0 0
  7.   tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
  8.   /dev/block/mmcblk0p1 /sdcard vfat rw,...

复制代码

  Android 本机挂载(使用flash中的文件系统) 

java代码:

  1. rootfs / rootfs ro 0 0
  2.   tmpfs /dev tmpfs rw,mode=755 0 0
  3.   devpts /dev/pts devpts rw,mode=600 0 0
  4.   proc /proc proc rw 0 0
  5.   sysfs /sys sysfs rw 0 0
  6.   tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
  7.   /dev/block/mtdblock2 /system yaffs2 ro 0 0
  8.   /dev/block/mtdblock3 /data yaffs2 rw,nosuid,nodev 0 0
  9.   /dev/block/mmcblk0p1 /sdcard vfat rw

复制代码

  ubuntu 系统: 

java代码:

  1. /dev/sda8 on / type ext3 (rw,relatime,errors=remount-ro)
  2.   tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
  3.   /proc on /proc type proc (rw,noexec,nosuid,nodev)
  4.   sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
  5.   varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
  6.   tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
  7.   devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
  8.   /dev/sda7 on /boot type ext3 (rw,relatime)
  9.   /dev/sda11 on /home type ext3 (rw,relatime)
  10.   /dev/sdb5 on /opt type ext3 (rw,relatime)
  11.   /dev/sda9 on /usr/local type ext3 (rw,relatime)
  12.   /dev/sda1 on /windows/c type vfat (rw,utf8,umask=007,gid=1000)
  13.   /dev/sda5 on /windows/d type vfat (rw,utf8,umask=007,gid=1000)
  14.   /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代码:

  1. echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
  2.   sudo sysctl ?p
  3.   ./system/core/logcat/logcat.cpp:403: fd = open("/proc/cmdline", O_RDONLY);
  4.   ./system/core/init/init.c:553: char cmdline[1024];
  5.   ./system/core/init/init.c:557: fd = open("/proc/cmdline", O_RDONLY);
  6.   ./system/core/init/init.c:580: chmod("/proc/cmdline", 0440);
  7.   ./system/core/init/bootchart.c:139: proc_read("/proc/cmdline", cmdline, sizeof(cmdline));
  8.   ./system/core/init/bootchart.c:319: proc_read( "/proc/cmdline", cmdline, sizeof(cmdline) );
  9.   ./system/core/init/bootchart.c:320: s = strstr(cmdline, KERNEL_OPTION);
  10.   ./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设备信息、应用程序轮询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值