如何在启动时将数组放置在特定地址
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();
写一个小爱好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();