2016-01-03 19 views
-1

我正在编写一个小型业余操作系统作为学习体验。它针对32位x86架构。如何在启动时在特定地址放置阵列

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

我有一个功能,保留4kb未使用的内存并返回此内存块的起始地址。

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

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

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

+0

我。其实我正在写一个业余爱好OS(作为一种学习体验)。我正尝试在特定地址创建page_directory。 – ErwinM

+0

@Mat我添加了详细信息。 – ErwinM

+0

@Mat好的,这是有道理的。有没有一种方法可以轻松地引用该空间中的第二个整数? – ErwinM

回答

2

如果我很好理解你想把一个函数返回的地址作为一个int数组的基地址。
如果上述假设是正确的,则可以使用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(); 
0

一般情况下,你不能为一个实际的物理地址做到这一点,但您可以使用mmap在指定虚拟地址获得指向内存的指针。映射诸如设备特定存储器的物理地址通常在使用特定于操作系统的API的设备驱动程序中完成。

编辑:随着您提供的额外信息,这不是一般案件! 为了有一个指向前的寻呼甚至还成立了,我想你可以使用这个物理地址:要使用

p = (void*)0x00010000; 

或者任何实际的物理地址。

即使没有设置分页,您可能已经处于分段保护模式,所以它真的取决于您的DS分段如何设置。

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

+0

他正在写一个业余爱好操作系统,他正在建立自己的页面目录,这段代码实际上是在内核中(环0)。不知道他有多长时间,如果他的内核符合POSIX标准,那么讨论'mmap'是否非常有用呢? –

+1

@MichaelPetch:我更新了我的答案。 – chqrlie

+0

啊,我也没有看过问题编辑历史,所以看起来事情从他的第一个版本改变了。 –

相关问题