有人可以解释一下我如何使用来自 grub 的 C 数据结构吗?我不明白 hi mem 和 lo mem

标签 c memory detection osdev multiboot

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);

或者我是否得到 1 个仅包含低地址和高地址的列表?

由于我使用的是 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

关于有人可以解释一下我如何使用来自 grub 的 C 数据结构吗?我不明白 hi mem 和 lo mem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4239878/

相关文章:

c# - 为什么分配的内存比预期的多?

c - 是否需要释放具有空值的已分配指针?

ios - 如何使用 `AVFoundation` 检测相机是否存在?

c - 在 PIC32 上,INT16 数组如何在内存中分配?

c - 带符号的补码算法

c - 请解释一下这个素数生成器代码是如何工作的(C语言)

使用 wifi 进行 iPhone 接近检测

c - fread() 在不同的字节序机器上表现不同吗?

c# - C# 套接字应用程序中的内存泄漏

c - 检测空格是否被按下3次?