多重引导规范有如下结构:
意图似乎是数组大小可变。这些信息在传递时由引导加载程序确定。在托管的C++中,建议使用“
“hack”的方法是只需使用
最后,您可以像这样迭代内存映射:
struct multiboot_tag_mmap
{
multiboot_uint32_t type;
multiboot_uint32_t size;
multiboot_uint32_t entry_size;
multiboot_uint32_t entry_version;
struct multiboot_mmap_entry entries[0];
};
意图似乎是数组大小可变。这些信息在传递时由引导加载程序确定。在托管的C++中,建议使用“
vector
”。但是我不能这么做。另一个选择是使用动态分配,但这将需要在获取内存映射信息之前实现大量内核(分页,MMU等)功能。有点像先有鸡还是先有蛋的问题。“hack”的方法是只需使用
gnu++11
启用扩展功能。但我尽可能避免使用扩展功能,以避免产生C式代码或潜在导致未定义行为的代码。我的观点是,代码越具有可移植性,出现bug的机会就越小。最后,您可以像这样迭代内存映射:
for (mmap = ((struct multiboot_tag_mmap *) tag)->entries;
(multiboot_uint8_t *) mmap
< (multiboot_uint8_t *) tag + tag->size;
mmap = (multiboot_memory_map_t *)
((unsigned long) mmap
+ ((struct multiboot_tag_mmap *) tag)->entry_size))
因此,结构的大小是tag->size
。
只要语义相同,我可以修改multiboot头文件。关键是它在引导加载程序中的显示方式。我能做什么?
multiboot_tag_mmap
分成两个结构体吗?感觉“头部”和“主体”应该是单独的对象,但要依次放置在同一内存块中。 - user2486888multiboot_tag_mmap
变量或者使用sizeof(multiboot_tag_mmap)
,那么定义 entry 数组为 0、1 或 1000 个条目都无所谓。 (我假设你将一个预先存在于内存中的缓冲区转换为这种类型,然后迭代遍历条目) - Russ Schultzstruct multiboot_mmap_entry entries[];
。也许您的编译器将其作为 C++ 的扩展功能? - M.M