linux - 如何根据闪存存储的分区表确定磁盘几何结构(C/H/S)?

标签 linux sd-card disk-partitioning usb-mass-storage

我将为闪存可移动设备编写一个磁盘分区创建程序,主要由基于 SCSI 的 I/O 控制并通过 LBA 地址访问。

作为引用,我正在研究由 Ubuntu 的磁盘实用程序分区和格式化的 SD 卡上的分区表。

我使用Linux中“parted”软件的“unit”命令来查看卡的参数,以CHS为单位,以字节为单位。

以下是针对具有 15122432 个 LBA 扇区的 8GB SD 卡:

pi@raspberrypi:~ $ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit chs print
Model: Generic CRM01 SD Reader (scsi)
Disk /dev/sda: 1020,130,11
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 1020,239,62.  Each cylinder is 7587kB.
Partition Table: msdos
Disk Flags:

Number  Start  End          Type     File system  Flags
 1      0,1,0  1019,238,61  primary  ext3

(parted) unit b print
Model: Generic CRM01 SD Reader (scsi)
Disk /dev/sda: 7742685184B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End          Size         Type     File system  Flags
 1      31744B  7738552319B  7738520576B  primary  ext3

以下是针对具有 7585792 个 LBA 扇区的 4GB SD 卡:

(parted) unit chs print
Model: Generic CRM01 SD Reader (scsi)
Disk /dev/sda: 1019,71,29
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 1019,120,62.  Each cylinder is 3809kB.
Partition Table: msdos
Disk Flags:

Number  Start  End          Type     File system  Flags
 1      0,1,0  1018,119,61  primary  ext3

(parted) unit b print
Model: Generic CRM01 SD Reader (scsi)
Disk /dev/sda: 3883925504B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End          Size         Type     File system  Flags
 1      31744B  3881656319B  3881624576B  primary  ext3

根据我的观察,不同容量的SD卡上的磁盘几何值(C/H/S)是不同的,并且几何值似乎与分区末尾的结束CHS地址相关。好像是..

分区卡的结束 CHS 元组为 (c, h, s),其磁盘几何形状将为 (c + 1/h + 1/s + 1)。它们有关系吗?

但是这些值是如何确定的呢?这些依赖于操作系统或文件系统吗?

最佳答案

磁盘几何结构位于板载设备 Controller 中,操作系统通过驱动程序向 Controller 请求它。请求/应答格式在此类设备的协议(protocol)定义中指定。

很久以前我写过PDP-11的IDE驱动,还记得一些关于IDE/ATA协议(protocol)的事情。我不知道有关现代 SATA 或 SCSI 设备的详细信息, 所以只能回答关于 ATA/IDE 的问题。

IDE 设备具有特殊操作“identify”(代码 0xEC),驱动程序将其发送到设备。驱动程序将此操作码命令发送到控制端口,此后,当设备设置标志 DRDY(设备就绪)时,读取 512 字节 block ,包含答案。答案包含磁盘信息(制造商、序列号等)和几何信息。

例如参见 this code ,其中程序向 ATA 发送请求并解析答案,其中包含磁盘几何结构。

我还可以说的是:

  1. IDE 设备可以接受“上传的几何图形”(代码 0x91)。 IE。司机可以发送 向设备发出请求,并说“您将有 X 扇区、Y 头、Z 气缸”,此后设备接受并使用此“虚拟 几何”。
  2. 某些设备不知道其几何结构,并且在启动过程中,BIOS 必须向设备解释它具有哪种几何形状。否则,它 只是行不通。
  3. 某些设备存储由计算机指定的外部虚拟几何图形 在 1 ,即使在重新启动后也请记住并使用它。
  4. 如果您设置了一个与默认不同的“虚拟几何体”,那么一些 I/O 错误后设备可以自动返回默认几何形状。 结果,它会破坏文件系统。

关于linux - 如何根据闪存存储的分区表确定磁盘几何结构(C/H/S)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45603898/

相关文章:

在 rodata 区域以外的其他一些数据区域中分配的 Const 变量

linux - Kate 编辑器重置设置

linux - 无法使用 vsftpd centos 7 通过 ftp 写入/编辑?

sd-card - SDHC卡SPI初始化

java - 将 float 数组保存到SD卡(java)

C - 在 SPI 模式下初始化 SD 卡,始终读回 0xFF

docker - 如何在另一个分区上运行docker LXC容器?

Android 模拟器版本 16.0 持久性/系统/存储?

hadoop - 切换一个包含cloudera hadoop/hdfs/hbase数据的磁盘

linux - stdout, stderr 总是可以发送到常规文件吗?