sunq2003
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2003-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2190回复:10

对U盘逻辑块内部分字节读写问题!

楼主#
更多 发布于:2003-06-05 10:06
偶现在考虑windows API里面文件处理函数如何最终实现对U盘的操作。假设U盘已经格式化成FAT32、盘符为G:,采用SCSI transparent command set;
我要copy C:\\xxx.doc to G:\\则可以用API的函数
CopyFile(\"C:\\xxx.doc\",\"G:\\xxx.doc\",true)实现。
转化成SCSI的命令至少需要3条write()命令;
1、write(logical block Address, length 32bytes):在根目录区所在的逻辑快写入32bytes的FDB(文件描述块);
2、对FAT区所在的逻辑快写入相应数据;
3、对一系列逻辑块写入文件数据;
问题:对于前两个命令都是对某个逻辑块中的部分字节的写入,例如根目录区的文件描述块只有32个byte,对于scsi 的write命令如何标示逻辑块内部的地址偏移?最小的存储单位不是逻辑块吗?这个矛盾是如何处理的?thank u!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-07 02:31
你看看这里吧!http://www.driverdevelop.com/forum/html_42926.html?1054924181
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-07 02:26
你过你是写u盘,那么你要自己处理文件系统的所有事情,至于你要的物理地址,你是不用关心的,因为u盘自己会处理,你只要在FAT中找到空的cluster,并计算出相应的逻辑地址就行了!
一次要写的数据,最小是以page为单位的!


上面这段话指的是主机的,如果你问的是固件,那么你就要按照我前面的几个帖子的内容了!我估计你对文件系统不太熟悉啊!先好好看看书吧!这样问没什么意义啊!

简单的说,固件将cbw包中的逻辑地址取出,找到相应的物理地址,读出返回,或者加上新的数据写入一个新的物理块,再将旧块擦除,所以我说逻辑地址需要写在物理地址后面的区域,就是为了对照用的!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-06 20:18
我当然要处理文件系统所有事情。
我怎么可能不关心物理地址。U盘自己怎么会处理??不是全靠
控制器里的固件来协调这一切的么?在往flash里面写数据前,
要先写3个周期的地址。这个地址我感觉跟页面末16字节里面的
块地址没有关系。事实上我认为。末16字节那个地址都是我们
在固件里编写进去的
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-06 12:19
你过你是写u盘,那么你要自己处理文件系统的所有事情,至于你要的物理地址,你是不用关心的,因为u盘自己会处理,你只要在FAT中找到空的cluster,并计算出相应的逻辑地址就行了!
一次要写的数据,最小是以page为单位的!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-05 21:12
那么scsi命令包里来的数据要一个簇的内容了??
怎么装阿。
just do it
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-05 20:44
谢谢。总算有人说清楚了。
 :)
just do it
sunq2003
驱动牛犊
驱动牛犊
  • 注册日期2003-05-05
  • 最后登录2003-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-05 17:40
逻辑块的地址实际上就是cluster的编号,从0到n-1,n为存储介质的cluster的数量,一个cluster可能对应于flash上的几个block,这个取决于磁盘的格式化结果,因此可以用一个简单的公式来计算。
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-05 16:31
我要copy C:\\xxx.doc to G:\\则可以用API的函数
CopyFile(\"C:\\xxx.doc\",\"G:\\xxx.doc\",true)实现。
转化成SCSI的命令至少需要3条write()命令;
1、write(logical block Address, length 32bytes):在根目录区所在的逻辑快写入32bytes的FDB(文件描述块);
2、对FAT区所在的逻辑快写入相应数据;
3、对一系列逻辑块写入文件数据;

请问楼主,可知道如何转换逻辑块地址和写flash前要先写的那个
地址??一直弄不清楚,请帮忙!!
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-05 11:59
对于u盘的读写一定要完整的page,现在有两种格式的flash,所以分别是512/2048
wolfwoo22
禁止发言
禁止发言
  • 注册日期2003-03-11
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分930分
  • 威望8970点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-05 11:43
用户被禁言,该主题自动屏蔽!
游客

返回顶部