我已经习惯了 x86 汇编,所以我想我应该从一些 16 位程序开始。为了测试自己,我正在创建一个程序,它将从磁盘加载数据,将其复制到内存,然后将其用于下一位。它将替换 MBR,所以我只能使用基本中断(完整的东西将是一种仅供我使用的“笑话病毒”)。
从磁盘读取数据并将其放入内存的中断需要 CHS 格式的参数,但我的主驱动器是 SSD。我在网上找不到任何可以帮助我解决这种情况的东西,因为 SSD 显然不能在柱面上运行。
我的问题是,有什么办法可以将我的 SSD 上的逻辑扇区号“转换”为 CHS 元组来欺骗程序,或者这是不可能的?
答案1
以前可以在 BIOS 中查找驱动器的逻辑柱面数、磁头数和扇区数(作为用户 - 也可以通过编程执行此操作,因为 Linux fdisk 实用程序以前可以执行此操作,但现在不再执行此操作)。然后,您可以使用以下公式求解 c、h 和 s
A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
其中 A 是 LBA 地址,Nheads 是磁盘上的磁头数,Nsectors 是每个磁道的最大扇区数,(c, h, s) 是 CHS 地址(从1)。
也可以改变BIOS 中的 CHS 几何值 - 但不要这样做,因为它会导致任何依赖它的操作系统(如 Windows)无法启动。