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

to frank_wang。关于FLASH的FAT结构

楼主#
更多 发布于:2003-06-02 19:17
在你的文章中,为什么要定义簇的大小为32K?
这对于容量本来就不是很大的U盘来说,将会浪费很多空间。
如果说为了让FLASH的块(32扇区)和FAT16统一起来,应该定为
16K/簇,页=扇区。但是这样还是会浪费空间。我看有些文章介绍
说16M以下的分区8K/簇,16―128M的分区4K/簇。我不太理解,
为什么分区越小的簇容量反而越大?岂不是雪上加霜?
不知道你如何理解?
另外,当PC要取得U盘上的文件结构时是发送特定命令,U盘的固件
仅返回给主机DBR和FAT内容。还是连同地址一起返回给主机?

just do it
ajinalong
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2005-12-23
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-18 10:08
 上面各位兄弟讨论得很好,我想问个U盘枚举问题
1.
20    CDB    25 00 00 00  00 00 00 00  
             00                       READ CAPACITY
20    CDB    28 00 00 00  00 00 00 00  01
             00                     READ            
为什么两个命令返回的总扇区数不一样呢?  
2.我在XP下监控朗科64MU盘,先格式化后,发现PC依次送以下命令:
CDB    28 00 00 00  00 00 00 00  01 00
CDB    28 00 00 00  00 20 00 00  01 00
CDB    28 00 00 00  00 60 00 00  04 00
CDB    28 00 00 00  00 20 00 00  08 00
.
.
.
CDB    28 00 00 00  01 18 00 00  08 00
CDB    28 00 00 00  02 18 00 00  08 00
请问为什么PC送逻辑地址到0x0218就不送了,后面的08应该是扇区的个数吧,还有为什么地址中间是连续的,而开始和结束是跳跃的?谢谢.
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-09 10:56
不过我还是不太清楚你的目的!如果你只做固件的话,这个公式对你没有什么大用处的!

我知道文件系统是怎么回事。我也知道FLASH里面是分成块来管理最小读写单位是页,写前要擦除先,我只是很不清楚接口上的数据如何转换。也就是我一直在说的:PC机传到控制器的地址信息(簇号)和
最终要读写Flash前,要先发送3个周期的地址信息(24位,即我所认为的物理地址)之间的关系。我是做固件啊。从接收PC机的命令,到最终操作执行到flash里面去,不都是固件来做的么?
按照公式得到了逻辑地址,把扇区和页面设成一样大。这样逻辑地址
就是物理地址了。我不太同意你前面说的“一个块的逻辑地址是保存在物理块每个page后面那16个字节里的!”我认为那16个字节里面
是块地址。每32页(扇区)用同一个块地址。而逻辑地址是一个扇区对应一个地址。
just do it
sky412
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2013-03-07
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-09 10:03
为了感谢你的帮助,我另外开了贴,给分数,里面还有问题需要你的解答。谢谢!

http://www.driverdevelop.com/forum/html_43585.html?1055124002 [url] [/url]
虽然我比较烦,但是我真不懂!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-09 02:17
不过我还是不太清楚你的目的!如果你只做固件的话,这个公式对你没有什么大用处的!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-08 15:57
看了上面的讨论,我想说说我的一些疑问,不对的请指出。NewTech在上面的帖子说到\"一个块的逻辑地址是保存在物理块每个page后面那16个字节里的\",这可以理解:只要在固件中读写操作前增加这么一段“转换”或者“查找”即可完成“逻辑地址”与“物理地址”相应的转换。
既然一切对固件的操作,都归结为read和write,而read和write都是通过“逻辑地址”通知固件操作,那么写的时候,操作系统如何计算“簇号”与“逻辑地址”间的关系。清楚点就是当一个大文件分几个簇存放时,操作系统通过读“目录表”得知文件的起始簇号(仅仅是“簇号”,不是“逻辑地址”,更加不是“物理地址”),然后通过一定的转换(转换关系不懂,我要问的就是这个,知道的高手请指点!),操作系统发给u盘的命令就变成了“逻辑地址”,当读完了一簇后,从fat表得知下一簇“簇号”,再转换通知固件读哪个,过程应该是这样,没错吧!
希望清楚“簇号”与“逻辑地址”的关系的朋友,指点一下?

 

总结的好。其实我一直就是在问这个转换关系,就是说不清楚。
just do it
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-08 14:04
 :D
谢谢NewTech大侠。不过这个帖子没分可放。
我在另一个帖子里给你放了。分数不多。但真的谢谢你。
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-07 16:33
你总算明白啦!:)
关于簇号和逻辑地址的换算关系极其简单:
逻辑地址=(簇号+(FAT+ROOT)所占簇的个数+1)*每簇扇区数

放分吧!
sky412
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2013-03-07
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-07 15:25
看了上面的讨论,我想说说我的一些疑问,不对的请指出。NewTech在上面的帖子说到\"一个块的逻辑地址是保存在物理块每个page后面那16个字节里的\",这可以理解:只要在固件中读写操作前增加这么一段“转换”或者“查找”即可完成“逻辑地址”与“物理地址”相应的转换。
既然一切对固件的操作,都归结为read和write,而read和write都是通过“逻辑地址”通知固件操作,那么写的时候,操作系统如何计算“簇号”与“逻辑地址”间的关系。清楚点就是当一个大文件分几个簇存放时,操作系统通过读“目录表”得知文件的起始簇号(仅仅是“簇号”,不是“逻辑地址”,更加不是“物理地址”),然后通过一定的转换(转换关系不懂,我要问的就是这个,知道的高手请指点!),操作系统发给u盘的命令就变成了“逻辑地址”,当读完了一簇后,从fat表得知下一簇“簇号”,再转换通知固件读哪个,过程应该是这样,没错吧!
希望清楚“簇号”与“逻辑地址”的关系的朋友,指点一下?

虽然我比较烦,但是我真不懂!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-06 20:01
这两个地址之间没有任何关系,一个块的逻辑地址是保存在物理块每个page后面那16个字节里的!

 :D   不是你说的??
总之,PC机只能根据FAT表,发送要改动簇的簇号和内容?
在固件里面再转换簇号-〉逻辑地址-〉物理地址。
是不是
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-06 18:03
fat 里面是簇号。你是说logical address其实就是簇号。
我在另一个贴子里面也看到这个说法。但你前面说:
一个块的逻辑地址是保存在物理块每个page后面那16个字节里的。

这不是矛盾?末16个字节里面的块地址可不是簇号阿


我什么时候这样说过,逻辑地址和簇号还还有一点点差别的。
另外如果不保存逻辑地址,固件怎么知道逻辑地址和物理地址的对应关系呢!
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-06-06 15:12
我下载了这个技术报告,呵呵
感谢楼主,我现在正在研究
说不定能解决我现在的问题
我思,故我在
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-06 13:43
发送的数据包里面包含整个簇的内容?
just do it
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-06 13:29
fat 里面是簇号。你是说logical address其实就是簇号。
我在另一个贴子里面也看到这个说法。但你前面说:
一个块的逻辑地址是保存在物理块每个page后面那16个字节里的。

这不是矛盾?末16个字节里面的块地址可不是簇号阿
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-06 12:32
pc上肯定知道logical address啊,因为有读fat啊,至于这个地址对应那个物理块,那要由固件自动查找啊,比如说这次写在第10个物理块,删掉文件后,下次再写就写道另外一个空的物理块啊!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-05 13:18
NewTech,
你是说从PC机上下来的地址,即SCSI中的Logical block address
就是flash页面中末16个字节中的block address?
既然这个地址是固件完成的,PC机怎么会知道要写哪个块地址。
在前面的过程中,PC机应该知道了MBR,FAT和目录区的内容
那么PC机的操作对象不是应该是簇么?
just do it
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-05 12:17
那后面的16个字节,包含有ECC,带校验的逻辑地址,块的标志,全部都要由固件来完成的!
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-04 19:00
这两个地址之间没有任何关系,一个块的逻辑地址是保存在物理块每个page后面那16个字节里的!

越来越晕了。难道PC机下来的LBA就是page后面16个字节里面的?
那FLASH中页面末16字节中的block address需要我们来写进去吗?
我察看了。没有存放数据的块,这部分是FF FF
just do it
sky412
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2013-03-07
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-04 18:31
这两个地址之间没有任何关系,一个块的逻辑地址是保存在物理块每个page后面那16个字节里的!

那是不是说逻辑地址和物理地址可以设成一样!
虽然我比较烦,但是我真不懂!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-04 15:49
这两个地址之间没有任何关系,一个块的逻辑地址是保存在物理块每个page后面那16个字节里的!
上一页
游客

返回顶部