在同一物理内存位置运行进程

问题描述 投票:0回答:1

对于一个研究项目,我有一个长期运行的过程,该过程使用各种缓冲区和堆栈变量。我希望能够多次启动此过程,以使physical支持其堆,堆栈,代码和静态变量的地址每次都相等。我知道所有这些变量的确切大小,并且堆和堆栈的大小在执行期间保持不变。为了解决这个问题,我使用一些帮助程序代码将程序中的任意虚拟地址转换为它们相应的物理地址(来自here):

struct pagemap
{
    union status
    {
        struct present
        {
            unsigned long long pfn : 54;
            unsigned char soft_dirty : 1;
            unsigned char exclusive : 1;
            unsigned char zeroes : 4;

            unsigned char type : 1;
            unsigned char swapped : 1;
            unsigned char present : 1;
        } present;

        struct swapped
        {
            unsigned char swaptype : 4;
            unsigned long long offset : 50;
            unsigned char soft_dirty : 1;
            unsigned char exclusive : 1;
            unsigned char zeroes : 4;

            unsigned char type : 1;
            unsigned char swapped : 1;
            unsigned char present : 1;
        } swapped;
    } status;
} __attribute__ ((packed));


unsigned long get_pfn_for_addr(void *addr)
{
    unsigned long offset;
    struct pagemap pagemap;

    FILE *pagemap_file = fopen("/proc/self/pagemap", "rb");
    offset = (unsigned long) addr / getpagesize() * 8;

    if(fseek(pagemap_file, offset, SEEK_SET) != 0)
    {
        fprintf(stderr, "failed to seek pagemap to offset\n");
        exit(1);
    }

    fread(&pagemap, 1, sizeof(struct pagemap), pagemap_file);
    fclose(pagemap_file);

    return pagemap.status.present.pfn;
}

unsigned long virt_to_phys(void *addr)
{
    unsigned long pfn, page_offset, phys_addr;

    pfn = get_pfn_for_addr(addr);
    page_offset = (unsigned long) addr % getpagesize();
    phys_addr = (pfn << PAGE_SHIFT) + page_offset;

    return phys_addr;
}

到目前为止,我的方法仅要求程序中的特定缓冲区在每次运行时都位于相同的物理地址。为此,只要该缓冲区的物理地址错误,我就可以退出并重新启动该过程,并且每次都能以相对较快的速度结束正确的位置。但是,我想扩展我的实验,以确保在两次运行之间,我的进程被相同地加载到物理内存中,并且这种try-and-restart方法似乎不适用于此情况。理想情况下,我希望能够将少量物理页框架分开,这些物理页框架无法分配给另一个进程或内核本身。然后,我将一个标志向下传递给do_fork,以通知内核这是我的特殊过程,并为其分配特定的页面框架。

我的问题是:

  1. 内核中是否已经建立了某种隔离机制,可以让我留出可以在其中启动进程的专用物理内存空间?]

  2. 如果没有,修改内核以支持这种行为的起点是什么?

  3. 还有其他解决方案(不涉及上述两个方案中的任何一个),可以用于我想要的行为吗?

对于一个研究项目,我有一个长期运行的过程,该过程使用各种缓冲区和堆栈变量。我希望能够多次启动此过程,以便物理地址支持...

linux-kernel embedded-linux
1个回答
0
投票

这是内核使用虚拟内存来从您那里进行抽象的任务,因此我不确定是否可以这样做(无需进行大量的工作)。

© www.soinside.com 2019 - 2024. All rights reserved.