代码之家  ›  专栏  ›  技术社区  ›  Philluminati

有人能解释我如何使用这个来自GRUB的C数据结构吗?我不明白“嗨-米”和“啦-米”

  •  0
  • Philluminati  · 技术社区  · 15 年前

    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”来显示内存映射。这是我的 output

    但我不完全理解结构……

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

    它说这些值是64位的,所以它将“低内存和高内存”按如下方式推到一起:

    __int64 full_address = (low_mem_addr + high_mem_addr);

    或者我得到了一个只包含低地址和高地址的列表?

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

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Philluminati    14 年前

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

    推荐文章