有人能解释一下我是如何使用这个来自grub的C数据结构的吗?我不知道';I don’我不懂hi mem和lo mem

有人能解释一下我是如何使用这个来自grub的C数据结构的吗?我不知道';I don’我不懂hi mem和lo mem,c,memory,detection,osdev,multiboot,C,Memory,Detection,Osdev,Multiboot,Grub是一个多引导兼容的引导加载程序。当它引导一个操作系统时,它会创建一个定义可用内存的结构,并在内存中留下一个指向该结构的指针 我在这里得到了这些信息: 这是我想我感兴趣的结构: typedef struct memory_map { unsigned long size; unsigned long base_addr_low; unsigned long base_addr_high; unsigned long length_low; unsigne

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位的,所以它将“低内存”和“高内存”按如下方式推到了一起:

unsigned long base_addr_low = base_addr
unsigned long base_addr_high = base_addr >> 32
\uuuu int64完整地址=(低内存地址+高内存地址)

或者我会得到一个列表,其中只包含低地址和高地址

既然我使用的是32位机器,我基本上是用两个值引用每个唯一的地址吗


我希望有一个地址列表,比如
displaymem
显示,但实际长度字段已填充,但我没有看到。有什么我不明白的吗?

好的,基本上只有两个变量……它们是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

引号:“base_addr_low是起始地址的低32位,base_addr_high是高32位”,得到的地址如下:res=baselow+basehigh那么为什么长度为零?我是否需要按组合的起始地址对列表进行排序,然后将其排序到下一个保留地址?我原以为length_low和high的组合等于链接列表中的下一个条目。根据我提供的wiki链接,它们是一个组合,我可以使用无符号的long x。