如何在引导时将数组放在特定地址

时间:2016-01-03 17:00:52

标签: c pointers dynamic osdev

我正在写一个小爱好操作系统作为学习经验。它的目标是32位x86架构。

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

我有一个保留4k​​b未使用内存的函数,并返回该内存块的起始地址。

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

我理解指针的基本(我认为),但我无法弄清楚如何做到这一点。

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

2 个答案:

答案 0 :(得分:2)

如果我理解你想要将函数返回的地址视为整数数组的基地址 如果上述假设是正确的,您可以使用2种方式,一个演员或中间变量 使用演员:

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

答案 1 :(得分:0)

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

编辑:根据您提供的额外信息,这不是一般案例! 为了在分页建立之前有一个指向物理地址的指针,我想你可以使用它:

p = (void*)0x00010000;

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

即使未设置分页,您可能已经处于带分段的保护模式,因此它实际上取决于DS分段的设置方式。

我建议您研究实际操作系统的引导程序,或者只研究以您所指的模式执行的引导程序。