c - 在物理内存中动态创建数组

标签 c arrays operating-system kernel

在创建物理内存分配器来编写内核时,我尝试创建一个 struct page_frame 数组,其中数组的每个成员代表给定的物理 4KB 内存块。

Physical to Virtual Mapping and Area for new Array

当前内核已加载到物理内存中,从地址0x000000000physfree

physfreephysEnd的剩余 block 是空闲 block 。我想在 physfree 之后创建我的 struct page_frame 数组,并为内存中从 0 的每个 block 维护数组中的一个元素>physEnd

因此,该数组中的索引数应为 physEnd/4096。问题是,physEnd 直到运行时才知道,所以我不确定如何动态分配这样的数组。目前,以下内容不会填充 struct page_frame 数组,因为只有第一个元素 memBlocks[1] 显示为正确的 struct page_frame其余部分未正确初始化。

struct page_frame* memBlocks;
memBlocks = (struct page_frame*)kernbase + physfree;

int count = 0;
for(char* i = (char*) 0; i < (char*) ALIGNUP(physEnd)-PAGESIZE; i+=PAGESIZE)
{
    //The new page frame to be placed in array
    struct page_frame insert; 
    insert.used = 1;
    memBlocks[count] = insert;
    count++;
}

如何在内核顶部的地址动态创建这样的数组,以便我可以跟踪我的空闲物理 block ?我正在尝试利用指向名为 memBlocks 的结构的指针,并将其设置为内存中 kernbase + physfree 之后的地址(因为当前启用了虚拟内存)。然后我希望数组的每个元素只占用 sizeof(struct page_frame)。我是否可以通过将 memBlocks[i] 索引来正确访问 memBlocks 的元素?或者有更好的方法来创建这样的数组吗?

最佳答案

请记住,在 C 中,结构体框架 数组与指向结构体框架 的指针非常相似。至少如果您了解 C 的指针算术,最简单的做法就是简单地使用指向“数组”开头的指针。

给定structframe *memBlocks,您可以通过memBlocks + i访问第i个 block

关于c - 在物理内存中动态创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165733/

相关文章:

c - 在 C 中从较长字符串中提取子字符串的最佳方法是什么

javascript - 从每个对象数组中获取最大值

c - 如何找到数组中第二大的数字,但返回该值出现的最后一个索引?

linux - 是否可以将超过七个参数传递给 arm linux 中的系统调用?

c - 从磁盘读取文件期间使用中断

networking - 数据包IP识别生成

c - 如何向/从其他处理器发送/接收结构数组?

c - 从相对路径获取绝对路径

C - 仅从 file.txt 读取奇数行的程序

c - 使用指针获取 3D 数组元素的总和