0

Grub 是一个兼容多重引导的引导加载程序。当它启动操作系统时,它会创建一个定义可用内存的结构,并在内存中留下一个指向该结构的指针。

我在这里得到了这些信息:

http://wiki.osdev.org/Detecting_Memory_(x86)#Memory_Map_Via_GRUB

这是我认为我感兴趣的结构:

 typedef struct memory_map
 {
   unsigned long size;
   unsigned long base_addr_low;
   unsigned long base_addr_high;
   unsigned long length_low;
   unsigned long length_high;
   unsigned long type;
 } memory_map_t;

所以我有一组内存映射结构。如上页所述,您可以通过在 grub 提示符下键入“displaymem”来查看内存映射。这是我的输出

但我不完全了解结构....

为什么长度设置为 0 (0x0)?我必须结合低内存和高内存吗?

它说这些值是 64 位的,所以它是否像这样将“低内存和高内存”放在一起:

__int64 full_address = (low_mem_addr + high_mem_addr);

还是我得到 1 个列表,其中包含低地址和高地址?

并且由于我使用的是 32 位机器,所以我基本上是指每个具有两个值的唯一地址吗?

我期待一个地址列表,例如displaymem节目,但填充了实际长度字段,但我没有看到。有什么我不明白的吗?

4

1 回答 1

0

好的,基本上它只是两个变量......它们是 64 位数字,所以上面和下面是相同的!

typedef struct memory_map
 {
   unsigned long size;
   //unsigned long base_addr_low;
   //unsigned long base_addr_high;
   unsigned long long base_addr;
   // unsigned long length_low;
   // unsigned long length_high;
   unsigned long long length; //holds both halves.
   unsigned long type;
 } memory_map_t;

你可以像这样取出两半:

unsigned long base_addr_low = base_addr
unsigned long base_addr_high = base_addr >> 32

问题就是这么简单。:-s

于 2011-02-13T01:36:57.863 回答