百思不得其解

xiaoxiao_8 2007-11-16 10:21:57
我在修改HttpDisk源码为自定义的与ISCSI相似的虚拟盘时发现了一个奇怪的问题:
虚拟一个80G的硬盘。簇大小为8扇区也就是4096个字节(1000H)。结果发现有几次读取的信息如下:
(硬盘看作文件操作)
起始位置(16进制) 读取长度(16进制)
C84DCCE00 4000
C84DC9E00 3000
C84DC2400 8000
C84DD4A00 4000
C84DD0A00 4000
C84D98400 8000


起始位置怎么会不是 4096 的整数倍呢?希望大家帮我想想!!多谢了.

...全文
160 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2007-11-18
  • 打赏
  • 举报
回复
>>虚拟硬盘的簇为8扇区呀,读取的长度都是簇的整数倍。我想问的是读的起始位置 怎么会不是按簇来读
硬盘格式为NTFS.

读取长度是按最小簇的整数来读的,但是起使位置可不是
NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来进行簇的定位。LCN是对整个卷中所有的簇从头到尾所进行的简单编号。卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏移量,从而得到物理磁盘地址。VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。VCN可以映射成LCN,而不必要求在物理上连续。

和fat类似的,ntfs也有自己的结构安排如何存储系统信息和文件信息,如何读取数据,由于之前有固定的空间是被用来放一些我们从不关心的东西,因此必然不是从簇的整数倍开始读和存数据!

我之前讲的fat16就是想表达这个意思……
flyaway57 2007-11-17
  • 打赏
  • 举报
回复
4000H/4096 = 16384/4096 = 4
0黄瓜0 2007-11-17
  • 打赏
  • 举报
回复
我以为 MBR会单独占一扇区,不会占一簇,所以簇起始就不可能从4096的整数倍的地方开始了.再加上前面管理簇的数据也可能不是按簇来占空间的.
真正按簇管理的只有数据区.
loops 2007-11-17
  • 打赏
  • 举报
回复
4096是十进制,4000H是十六进制。
xiaoxiao_8 2007-11-17
  • 打赏
  • 举报
回复
楼上的可能没理解我的意思:
虚拟一个80G的硬盘。簇大小为8扇区也就是4096个字节(1000H)。

虚拟硬盘的簇为8扇区呀,读取的长度都是簇的整数倍。我想问的是读的起始位置 怎么会不是按簇来读
硬盘格式为NTFS.
Treazy 2007-11-17
  • 打赏
  • 举报
回复
这应该是因为虚拟磁盘也有物理磁盘一样的分区格式

就拿有些虚拟磁盘的默认分区格式为FAT16(只是举例)

硬盘上的饿数据根据其不同的特点和作用大致可分为5部分:MBR区,DBR区,FAT区,DIR区,DATA区
如果楼主有兴趣的话可以查阅相关资料
每个区占用的磁盘空间不同
但真正的存储数据的地方就是在DIR区之后的DATA区

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧