我正在编写一个小型业余操作系统作为学习体验。它针对32位x86架构。如何在启动时在特定地址放置阵列
我处于需要创建初始page_directory的位置,以便启用分页。此时分页(因此VM)未启用。
我有一个功能,保留4kb未使用的内存并返回此内存块的起始地址。
我想创建一个数组,page_dir
(由1024个int组成),位于上述函数返回的内存位置。
我明白基本指针(我认为),但我无法弄清楚如何做到这一点。
如何在运行时返回的物理地址定义数组page_table
?
我正在编写一个小型业余操作系统作为学习体验。它针对32位x86架构。如何在启动时在特定地址放置阵列
我处于需要创建初始page_directory的位置,以便启用分页。此时分页(因此VM)未启用。
我有一个功能,保留4kb未使用的内存并返回此内存块的起始地址。
我想创建一个数组,page_dir
(由1024个int组成),位于上述函数返回的内存位置。
我明白基本指针(我认为),但我无法弄清楚如何做到这一点。
如何在运行时返回的物理地址定义数组page_table
?
如果我很好理解你想把一个函数返回的地址作为一个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();
一般情况下,你不能为一个实际的物理地址做到这一点,但您可以使用mmap
在指定虚拟地址获得指向内存的指针。映射诸如设备特定存储器的物理地址通常在使用特定于操作系统的API的设备驱动程序中完成。
编辑:随着您提供的额外信息,这不是一般案件! 为了有一个指向前的寻呼甚至还成立了,我想你可以使用这个物理地址:要使用
p = (void*)0x00010000;
或者任何实际的物理地址。
即使没有设置分页,您可能已经处于分段保护模式,所以它真的取决于您的DS
分段如何设置。
我建议你研究实际操作系统的引导程序,或者只是在你所指的模式下执行的引导程序。
他正在写一个业余爱好操作系统,他正在建立自己的页面目录,这段代码实际上是在内核中(环0)。不知道他有多长时间,如果他的内核符合POSIX标准,那么讨论'mmap'是否非常有用呢? –
@MichaelPetch:我更新了我的答案。 – chqrlie
啊,我也没有看过问题编辑历史,所以看起来事情从他的第一个版本改变了。 –
我。其实我正在写一个业余爱好OS(作为一种学习体验)。我正尝试在特定地址创建page_directory。 – ErwinM
@Mat我添加了详细信息。 – ErwinM
@Mat好的,这是有道理的。有没有一种方法可以轻松地引用该空间中的第二个整数? – ErwinM