我在读取 ext2 文件系统的超级块结构时遇到问题。为啥我的代码读取 log2(block_size) 字段的错误值?

Posted

技术标签:

【中文标题】我在读取 ext2 文件系统的超级块结构时遇到问题。为啥我的代码读取 log2(block_size) 字段的错误值?【英文标题】:I have problems reading the superblock structure of an ext2 file system. Why does my code read the wrong value for the log2(block_size) field?我在读取 ext2 文件系统的超级块结构时遇到问题。为什么我的代码读取 log2(block_size) 字段的错误值? 【发布时间】:2020-10-16 00:21:29 【问题描述】:

我尝试为 ext2 格式化驱动器编写引导加载程序。 我将超级块加载到 0x7e00。然后我通过读取第 24 个字节来确定块大小。 我用这个值向左移动了 1024。但是 cl 寄存器包含错误的值。

内存转储(在 0x7e00 + 24 为 4 个字节):

24>: 0x02 0x00 0x00 0x00
Shifted value: 0x400 (eax)
cl: 0x00

我的代码:

mov     eax, 1024
mov     cl, byte [0x7e00 + 24]
shl     eax, cl
mov     [BLOCK_SIZE], eax

我做错了什么?

【问题讨论】:

什么是“BOCHS内存输出:”? Bochs 是一个虚拟机。我在它的调试器中输入:x /1024bx 0x7e00。这是内存转储的一部分 我知道 BOCHS 是什么,我不清楚你所展示的价值是什么。 (但仍然不是真的) 那是我的内存在 0x7e00 + 24 4 字节的内容。它是我加载到内存中的超级块的一部分。顺便说一句,我混淆了 cl 中的值。现在是 0x00。我希望 cl 的内容是 0x02 而 eax 是 0x1000 你的DS 0 吗? 【参考方案1】:

解决方案: 问题是我忘记了我的 DS 注册。我将 org 指令更改为 org 0x7c00 并将段寄存器设置为 0x0

【讨论】:

以上是关于我在读取 ext2 文件系统的超级块结构时遇到问题。为啥我的代码读取 log2(block_size) 字段的错误值?的主要内容,如果未能解决你的问题,请参考以下文章

dumpe2fs命令

第4章 文件和目录_文件系统结构及软硬链接

虚拟文件系统的超级块

EXT2 文件系统

linux-磁盘结构

Ext2:组描述符