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
相关产品推荐
相关产品推荐

