我想知道LBA和群集号。

我的问题是这样的:


LBA 0是否总是群集2?
那么集群0和1的作用是什么?
群集和LBA之间的唯一区别只是它们从磁盘开始的位置?
CHS,LBA,集群分子之间的关系?
在现行代码中,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

最佳答案

磁盘驱动器上有许多扇区编号方案。最早的之一是CHS(Cylinder-Head-Sector)。可以通过指定圆柱体(磁道),读/写头和每个磁道三元组的扇区来选择一个扇区。此编号方案取决于磁盘驱动器的实际物理特性。

第一个逻辑扇区位于圆柱0,磁头0,扇区1上。第二个逻辑扇区位于扇区2上,依此类推。如果磁盘上没有更多的扇区(例如,在1.44M软盘上,每个磁道有18个扇区),则应用下一个磁头,再次从扇区1开始,依此类推。

您可以通过一点数学将CHS地址转换为绝对(或逻辑)扇区号:

L = (C * Nh + H) * Ns + S - 1


其中C,H和S是根据CHS地址的圆柱,磁头和扇区数,而Nh和Ns分别是磁头数和每个磁道(磁道)的扇区数。反向计算(将LBA转换为CHS)就这么简单。

在这种称为LBA(逻辑块寻址)的编号方案中,每个扇区可以由一个编号来标识。第一个逻辑扇区是LBA 0,第二个逻辑扇区是LBA 1,依此类推。该方案是线性的,并且易于处理。

群集只是磁盘上连续扇区的组,它们由操作系统和文件系统一起处理,以减少文件系统元数据所需的磁盘碎片和磁盘空间(例如,描述特定文件可以在哪些扇区中进行描述)在磁盘上找到)。群集可能仅包含1个扇区(512字节),最多可以包含128个扇区(64 KB)或更多,具体取决于磁盘的容量。

同样,可以很容易地计算出群集第一个扇区的逻辑扇区号:

L = ((U - Sc) * Nc) + Sd


其中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表示)。

关于filesystems - LBA和集群,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5774164/

10-11 06:29