kim*_*yun 2 filesystems operating-system disk cluster-computing relationship
我想知道LBA和簇号.
我的问题是:
LBA 0总是第2组?
那么集群0和1是什么?
只有集群和LBA之间的区别就在于它们从磁盘开始的位置?
CHS,LBA,集群nubmer之间的关系?
在流动的代码中, add ax, WORD [datasector]代码是什么?
;************************************************;
; Convert CHS to LBA
; LBA = (cluster - 2) * sectors per cluster
;************************************************;
ClusterLBA:
sub ax, 0x0002 ; zero base cluster number
xor cx, cx
mov cl, BYTE [bpbSectorsPerCluster] ; convert byte to word
mul cx
add ax, WORD [datasector] ; base data sector
ret
Run Code Online (Sandbox Code Playgroud)磁盘驱动器上有许多扇区编号方案.其中最早的是CHS(Cylinder-Head-Sector).可以通过指定柱面(轨道),读/写头和每轨道三元组的扇区来选择一个扇区.此编号方案取决于磁盘驱动器的实际物理特性.
第一个逻辑扇区位于柱面0,头部0,扇区1上.第二个位于扇区2上,依此类推.如果磁盘上没有任何扇区(例如,在1.44M软盘上,每个磁道有18个扇区),则应用下一个磁头,再次从扇区1开始,依此类推.
您可以使用一点数学将CHS地址转换为绝对(或逻辑)扇区号:
L = (C * Nh + H) * Ns + S - 1
Run Code Online (Sandbox Code Playgroud)
其中C,H和S是根据CHS加法的圆柱,头和扇区数,而Nh和Ns分别是每个磁道(圆柱)的磁头数和扇区数.反向计算(将LBA转换为CHS)就像这样简单.
在这种称为LBA(逻辑块寻址)的编号方案中,每个扇区可以由单个数字标识.第一个逻辑扇区是LBA 0,第二个是LBA 1,依此类推.这种方案是线性的,更容易处理.
集群只是磁盘上的连续扇区组,由操作系统和文件系统一起处理,以减少磁盘碎片和文件系统元数据所需的磁盘空间(例如,描述哪些扇区可以是特定文件)在磁盘上找到).群集可能只包含1个扇区(512字节),最多128个扇区(64千字节)或更多,具体取决于磁盘的容量.
同样,可以轻松计算集群第一个扇区的逻辑扇区号:
L = ((U - Sc) * Nc) + Sd
Run Code Online (Sandbox Code Playgroud)
其中U是簇号,Nc是簇中扇区的数量,Sc是第一个有效簇号,Sd是可用于通用文件数据的第一个逻辑扇区的号.后两个参数(Sc和Sd)完全是文件系统和操作系统特定值.
某些文件系统(例如FAT16和整个FAT系列)为特殊目的保留群集号0和1,这就是为什么第一个实际群集是群集号2(在这种情况下Sc = 2).类似地,在磁盘的开头可能存在一些保留的扇区,其中不允许写入和读取数据.该保留区域的范围可以从几个扇区(例如,引导记录)到数百万个扇区(例如,在硬盘上的分区之前的完全不同的分区).
嗯,这是一个很长的答案.毕竟,您的问题的简短答案可归纳如下:
不,LBA 0并不总是第2组,它是文件系统特定的(在FAT的情况下,第2组是磁盘上的第一个可用扇区,但不总是LBA 0 - 参见答案5).
簇号0和1的解释也是文件系统特定的(在FAT的情况下,簇号0表示文件分配表中的空簇,并且簇号1是保留的).
不,主要区别在于群集号解决了一组连续扇区,而LBA解决了磁盘上的单个扇区.
请参阅上面的长答案中的公式(公式?)和随附的说明.
从这么短的汇编代码中很难说,但我最好的猜测是分区开头的保留扇区数(在上面的公式中用Sd表示).