【问题标题】:Second stage bootloader filename does not work with lowercase第二阶段引导加载程序文件名不适用于小写
【发布时间】:2014-01-21 15:22:00
【问题描述】:

我指的是 BrokenThorn 的操作系统开发教程,目前正在编写第一阶段引导加载程序和加载第二阶段的章节。

我编写了整个代码并在使用 qemu 运行它时遇到了崩溃。 经过一番调试,我发现问题出在第二阶段引导加载程序的名称上,我是通过循环访问根目录条目来读取的。

如果我将第二阶段的文件名用作 INITKRNL.BIN,则一切正常。但是如果我使用 initkrnl.bin(因此区别仅在于名称的情况),它就会崩溃。

我还打印了从根目录读取的名称。对于大写名称,它仅读取 INITKRNL.BIN。对于小写名称,它读取名称的一些字母和一些随机字符。

为什么文件名的大小写很重要,造成这种差异的原因是什么?

注意:我使用 Ubuntu 13.04 作为我的开发环境。我使用mkfs.vfat 使用VFAT 文件系统格式化软盘映像。

【问题讨论】:

  • 我不知道您在什么环境中运行它,但现在大多数文件系统不区分大小写吗? (即使是 NTFS,尽管 Win32 API 选择将其视为不区分大小写)。
  • @Michael:Linux。我正在启动使用 VFAT 文件系统格式化的软盘映像。
  • FAT12 以大写形式存储文件名,而 '.'不存储(如果“名字”小于 8,则空格填充为 8)。
  • @FrankKotler:好的。因此,即使我将文件存储为 initkrnl.asm,它实际上也会存储为 INITKRNL.ASM。所以当我阅读根目录条目时,我应该只得到 INITKRNL.ASM,对吗?但这并没有发生。

标签: assembly filenames bootloader x86-16


【解决方案1】:

它实际上存储为 11 个字符的字符串,采用 8.3 格式(文件名 8 个字符,扩展名 3 个字符)。所以在 ram 中应该是INITKRNLASM。

另外,我建议不要在软盘驱动器上使用 VFAT 文件系统,而是使用 FAT12 文件系统,因为它更简单,更适合这种大小的媒体。

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2016-03-22
    • 2019-08-24
    • 2019-07-08
    • 2011-12-04
    • 2016-02-14
    • 2019-07-20
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多