You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Multiboot1信息结构(MBI)异常原因排查请求

问题详情

我正在编写物理内存分配器,需要BIOS(Multiboot1)提供可用内存基地址、高地址及内存映射。已确认内核启动时eax值符合Multiboot1标准,且已设置flags第1位请求内存映射,但ebx指向的MBI结构存在异常:mmap_length为0,每次启动调试值均固定重复,疑似无效数据。

我的C实现代码

/* 从Multiboot规范复制的宏 */
#define MULTIBOOT_MEMORY_AVAILABLE              1
#define MULTIBOOT_MEMORY_RESERVED               2
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE       3
#define MULTIBOOT_MEMORY_NVS                    4
#define MULTIBOOT_MEMORY_BADRAM                 5
 
typedef struct {
    uint32_t address_high; // 32位系统下忽略
    uint32_t address_low;
    uint32_t length_high; // 32位系统下忽略
    uint32_t length_low;
    uint32_t type; // (1 == 可用)
    uint32_t zero;
} __attribute__((__packed__)) mmap_entry_t;
 
 
/* 大部分内容和我无关但还是保留了 */
typedef struct {
    uint32_t flags;        // 标志位
    uint32_t mem_lower;    // 低端内存(KB)
    uint32_t mem_upper;    // 高端内存(KB)
    uint32_t boot_device;  // 启动设备ID
    uint32_t cmdline;      // 内核命令行地址
    uint32_t mods_count;   // 加载的模块数量
    uint32_t mods_addr;    // 第一个模块结构的地址
 
    uint32_t irrelevant[3];
 
    uint32_t mmap_length;  // 内存映射长度
    uint32_t mmap_addr;    // 内存映射地址
    uint32_t drives_length; // 驱动器信息长度
    uint32_t drives_addr;   // 驱动器信息地址
    uint32_t config_table;  // ROM配置表
    uint32_t boot_loader_name; // 引导加载程序名称字符串地址
    uint32_t apm_table;     // APM表地址
    uint32_t vbe_control_info; // VBE控制信息
    uint32_t vbe_mode_info; // VBE模式信息
    uint32_t vbe_mode;      // VBE模式
    uint32_t vbe_interface_seg;  // VBE接口段
    uint32_t vbe_interface_off;  // VBE接口偏移
    uint32_t vbe_interface_len;  // VBE接口长度
} __attribute__((__packed__)) multiboot_info_t;

Multiboot文档定义

Multiboot信息结构的格式(目前定义如下):

        +-------------------+
0       | flags             |    (必填)
        +-------------------+
4       | mem_lower         |    (若flags[0]置位则存在)
8       | mem_upper         |    (若flags[0]置位则存在)
        +-------------------+
12      | boot_device       |    (若flags[1]置位则存在)
        +-------------------+
16      | cmdline           |    (若flags[2]置位则存在)
        +-------------------+
20      | mods_count        |    (若flags[3]置位则存在)
24      | mods_addr         |    (若flags[3]置位则存在)
        +-------------------+
28 - 40 | syms              |    (若flags[4]或
        |                   |                flags[5]置位则存在)
        +-------------------+
44      | mmap_length       |    (若flags[6]置位则存在)
48      | mmap_addr         |    (若flags[6]置位则存在)
        +-------------------+
52      | drives_length     |    (若flags[7]置位则存在)
56      | drives_addr       |    (若flags[7]置位则存在)
        +-------------------+
60      | config_table      |    (若flags[8]置位则存在)
        +-------------------+
64      | boot_loader_name  |    (若flags[9]置位则存在)
        +-------------------+
68      | apm_table         |    (若flags[10]置位则存在)
        +-------------------+
72      | vbe_control_info  |    (若flags[11]置位则存在)
76      | vbe_mode_info     |
80      | vbe_mode          |
82      | vbe_interface_seg |
84      | vbe_interface_off |
86      | vbe_interface_len |
        +-------------------+
88      | framebuffer_addr  |    (若flags[12]置位则存在)
96      | framebuffer_pitch |
100     | framebuffer_width |
104     | framebuffer_height|
108     | framebuffer_bpp   |
109     | framebuffer_type  |
110-115 | color_info        |
        +-------------------+

GDB调试输出

(gdb) p *(multiboot_info_t*)($ebx)
$1 = {flags = 591, mem_lower = 639, mem_upper = 129920, boot_device = 2147549183, cmdline = 2142208, mods_count = 0, mods_addr = 2142208, irrelevant = {0, 0, 0}, mmap_length = 0, mmap_addr = 144, drives_length = 36864, drives_addr = 0, 
  config_table = 0, boot_loader_name = 0, apm_table = 2142229, vbe_control_info = 0, vbe_mode_info = 0, vbe_mode = 0, vbe_interface_seg = 0, vbe_interface_off = 0, vbe_interface_len = 0}

内容的提问来源于stack exchange,提问作者user29935845

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:05:54