如何在启动时将数组放置在特定地址

How can I place an array at a specific address at boot time

写一个小爱好OS作为学习心得。它针对 32 位 x86 架构。

我正处于需要创建初始 page_directory 以便启用分页的位置。此时分页(因此 VM)未启用。

我有一个函数可以保留4kb未使用的内存和returns这个内存块的起始地址。

我想在上述函数返回的内存位置创建一个数组,page_dir(由 1024 个 int 组成)。

我了解指针的基础知识(我认为),但我不知道该怎么做。

如何在运行时返回的物理地址定义数组page_table

一般来说,您不能对实际的物理地址执行此操作,但您可以使用mmap获取指向指定[=24=的内存的指针]虚拟 地址。映射物理地址(例如设备特定内存)通常在使用操作系统特定 API 的设备驱动程序中完成。

编辑:根据您提供的额外信息,这不是 general 的情况! 为了在设置分页之前有一个指向物理地址的指针,我想你可以使用这个:

p = (void*)0x00010000;

或者您要使用的任何实际物理地址。

即使没有设置分页,您可能已经处于带分段的保护模式,所以这实际上取决于您的 DS 分段的设置方式。

我建议你研究一下实际操作系统的bootstrap,或者只是在你所指的模式下执行的引导加载程序。

如果我很清楚你想将函数返回的地址视为整数数组的基地址。
如果上述假设是正确的,您可以使用两种方式,强制转换或中间变量。
使用演员表:

void *pd = GetPhysicalAddress();
...
for (i=0; i<1024; i++)
    ((int *)pd)[i] = SomeValue();    //cast for each access

或者:

int *pd = (int *)GetPhysicalAddress();    //Cast only on assignement
...
for (i=0; i<1024; i++)
   pd[i] = SomeValue();