SD卡驱动分析(一)
2012-08-16 16:07 至上 阅读(2381) 评论(0) 编辑 收藏 举报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);