NASM:如何正确访问 ssd 驱动器?

Posted

技术标签:

【中文标题】NASM:如何正确访问 ssd 驱动器?【英文标题】:NASM: how to access ssd drive correctly? 【发布时间】:2020-04-07 16:52:40 【问题描述】:

我需要使用 NASM 16 位代码访问 SSD 驱动器。访问普通硬盘时,需要设置寄存器AX、DX、CX来选择Cylinder/Track/Sector/Number of Sector(AH - 选择读取扇区功能,DL - 选择驱动器号,CH - 选择柱面,DH - 选择磁盘边,CL - 选择磁道上的扇区,AL - 选择扇区数)。

不过,我想SSD盘还有一些其他的结构,那么如何正确访问它们呢?

【问题讨论】:

无论您使用的是 SSD 还是 HDD,都没有区别。即使在 HDD 上,也只是模拟了 CHS 结构,因为现代硬盘的每个磁道有超过 63 个扇区。 【参考方案1】:

假设将假几何转换为 LBA(最可能的情况),“int 0x13, ah=0x02”最多只能处理 16515072 个扇区。每个扇区 512 字节(也是最可能的情况),计算结果为 8064 MiB 或约 7.8 GiB。硬盘驱动器(包括 SSD)已经比这大了大约 2 十年;所以“int 0x13, ah=0x02”不是一个明智的选择。

相反,对于硬盘驱动器(包括 SSD),您希望使用“int 0x13, ah=0x42”(请参阅​​http://www.ctyme.com/intr/rb-0708.htm)。该函数使用 LBA 地址,不使用 CHS;并且(使用 64 位 LBA 地址和每个扇区相同的 512 字节)它可以处理(最多)8589934592 个 TiB 驱动器。

【讨论】:

有趣的是,在我将 AH 更改为 0x42 后,我得到了一个错误状态代码 01h,根据此表 ctyme.com/intr/rb-0606.htm 表示“无效功能在 AH 或无效参数中”,并且使用 AH=0x02 实际从磁盘读取了一些数据(使用此处的代码 ***.com/questions/59338886/nasm-disk-read-timeout)。是因为 16 位代码吗? @***er 鉴于此接口仅在真实(16位)模式下可用,并不是因为16位模式。请发布一个新问题。 @***er:对于“int 0x13,ah=0x42”返回“无效函数”;我怀疑驱动器号(dl)与有效的硬盘/SSD 不对应。例如,如果 DL=0(第一张软盘),您会认为“int 0x13, ah=0x02”可以工作,而“int 0x13, ah=0x42”则不受支持。 我用 qemu 检查过,我认为 qemu 将引导加载程序代码视为单独的驱动器或类似的东西..

以上是关于NASM:如何正确访问 ssd 驱动器?的主要内容,如果未能解决你的问题,请参考以下文章

NASM,如何直接写入硬盘并在实模式下读取

如何使用UEFI备份笔记本电脑SSD [关闭]

用AS_SSD_Benchmark检测ssd时驱动器检测失败怎么弄

《ESP32》Adafruit_GFXu8g2驱动ssd1306

《ESP32》Adafruit_GFXu8g2驱动ssd1306

选盘秘籍:用户如何选择SSD/SATA/SAS?