zoukankan      html  css  js  c++  java
  • SD卡驱动分析(一)

        SD卡是个块设备,与字符设备的不同在于访问次序可以随机。其实,这样说吧,sd卡中存放了大量的文件,有普通文件,可执行文件,sd卡上用的文件系统。所以sd卡的驱动也就会有很大的不同,比如说没有read(),write(),但是有读写的命令,通常读写函数都注册到内核空间,用户经过系统调用就可以用,但对于sd卡,则不行,必须先通过具体的文件系统,再通过驱动中的命令实现。

    这样说吧,sd卡驱动的核心是请求队列,对于sd卡本身最重要的却不是驱动,而是其文件系统。

    为什么呢?因为文件系统决定了sd卡中文件的存储方式,文件的存储信息,以及文件的操作方法。你所写的文件要保存到sd卡中,还有你要查找文件在sd卡中的位置,这些都离不开文件系统,驱动只能去读写确定地址上的信息,那么怎么确定这个地址呢,那就是文件系统。

    为什么一个4g的sd卡,却不能存储4g的内容呢?

    因为文件系统的存在,你所看到的文件目录,他本来就存在吗?当然不是,如果没有文件系统,sd卡中的存储就是杂乱无章的,你将找不到你曾经写过的文件。文件系统对存储的文件做了管理,使用了超级块,索引节点(这些都是结构体,所以占据了不少的空间)。
    为什么在linux系统中可以找到sd卡,并可以顺利访问与操作?

    你所看到的sd卡目录本身是不存在的,是linux系统从sd卡中读取必要的信息,在内存中创建的,一开始搬运到内存中的只有超级块和部分索引节点。sd卡的文件目录是挂在到linux文件系统目录中的,这中间有个转换,由VFS完成,因为两者的文件系统类型并不一样。所以VFS所做的贡献很大。

    这是一个进程访问一个文件的过程。就是open一个文件时,创建file文件结构体的过程。

    下面是一个例子  两个不同文件系统中的拷贝工作,都是因为VFS,他们才走到了一起。

    cp命令
    inf = open("/floopy/test",V_RDONLY,0);
    outf = open("/tmp/test",O_WRONLY|O_CREAT|O_TRUNC,0600);  //file结构体只有在文件被打开的时候创建,会从索引节点中提取必要的信息
    do{
          i = read(inf,buf,4096);//read最终会调用文件系统中对文件的操作read,这个指针被放在file结构体内
          write(outf,buf,i);
         }while(i);
    close(outf);
    close(inf);
  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/autum/p/SD.html
Copyright © 2011-2022 走看看