【发布时间】:2012-03-16 03:14:20
【问题描述】:
我刚刚读完 this 关于在 ISO 9660 文件系统上读取文件的文章,我对如何将文件读入内存感到困惑。我知道根目录位于 PVD 的偏移量 156,我将如何使用它来查找位于根目录中的文件,一旦找到文件名,我将如何找到该文件所在的地址,这样我就可以将它加载到内存中(使用 int 0x13 AH=42)?
【问题讨论】:
标签: assembly filesystems x86 bios iso9660
我刚刚读完 this 关于在 ISO 9660 文件系统上读取文件的文章,我对如何将文件读入内存感到困惑。我知道根目录位于 PVD 的偏移量 156,我将如何使用它来查找位于根目录中的文件,一旦找到文件名,我将如何找到该文件所在的地址,这样我就可以将它加载到内存中(使用 int 0x13 AH=42)?
【问题讨论】:
标签: assembly filesystems x86 bios iso9660
BIOS 可能无法通过 int 13h 直接访问 CD 驱动器,只有软盘和 HDD 始终可以通过 int 13h 直接访问。如果您从 CD 启动(如果您的 BIOS 支持),您可以使用 int 13h 来访问 CD,但是唯一可以保证工作的选项是仿真模式,在该模式下您将访问的不是整个 CD , 但引导映像好像是 FDD 或 HDD(在这种情况下,BIOS 通常将驱动器号 0 或 80h 分配给模拟磁盘 AKA A: 和 C:)。有一个关于这个问题的讨论here。
您可能需要编写一个 CD 驱动程序才能使用 I/O 端口直接从中读取数据。
对于 ISO9660,您需要从 Primary Volume Descriptor(偏移量 156)读取 Directory entry for the root directory。那么你对Directory entry for the root directory 中的Location of extent (LBA)(偏移量2)和Data length (size of extent)(偏移量10)感兴趣。这些告诉您目录数据(文件/目录列表)驻留在哪里以及它有多大。
此列表基本上是长度可变的相同目录条目的列表(由于可变文件/目录名称长度和填充)。当您阅读它时,您需要查看每个条目的File flags 以确定它是文件还是目录。如果它是一个目录并且你想访问它,你递归地重复整个过程。如果是文件,Location of extent (LBA)(偏移量 2)和Data length (size of extent)(偏移量 10)会告诉您它在哪里以及它有多大。
希望我没有搞砸,因为我手边没有旧的 CD 代码。
哦,请注意,以上是关于如何阅读 CD 的非常简单的描述,大多数 CD,但不是全部。 FS 过于笼统和复杂,并且有许多功能和选项,因此很难在所有情况下正确阅读。
我建议您获取一些.iso 文件、一个十六进制编辑器和一个计算器,并仔细检查逻辑并更好地熟悉文件系统。
【讨论】: