• 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);
  • 相关阅读:
    整型变量修饰符,char类型数据存储原理,字节数,
    进制
    C语言的数据、常量和变量
    递归函数
    函数,#include <>和#include " "区别
    分支语句
    hdu_1015(dfs)
    基本数论
    基础几何
    hdu_1018(斯大林公式/n!的位数)
  • 原文地址:https://www.cnblogs.com/autum/p/SD.html
Copyright © 2020-2023  润新知