【发布时间】: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