用户空间中的物理内存管理?

时间:2017-05-26 07:42:57

标签: c linux memory memory-management linux-kernel

我正在使用只有512MB RAM的嵌入式设备,该设备正在运行Linux内核。我想通过自己的库对用户空间中运行的所有进程进行内存管理。是否有可能这样做。根据我的理解,内存管理由内核完成,是否可以在用户空间中使用该功能。

3 个答案:

答案 0 :(得分:2)

如果您的嵌入式设备运行Linux,则它有一个MMU。控制MMU通常是特权操作,因此只有操作系统内核才能访问它。因此,答案是:,您可以

当然,您可以编写直接在设备上运行的软件,无需操作系统,但我想这不是您想要的。您可能应该退后一步,问自己是什么让您了解内存管理以及可能是解决此原始问题的更好方法。

答案 1 :(得分:0)

您可以考虑使用setrlimit。请参阅another Q&A

我写了测试代码并在我的电脑上运行它。我可以看到内存使用量有限。单位的确切关系需要进一步分析。

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>

int main(int argc, char* argv)
{
    long limitSize =      1;
    long testSize  = 140000;

    // 1. BEFORE: getrlimit
    {
        struct rlimit asLimit;
        getrlimit(RLIMIT_AS, &asLimit);
        printf("BEFORE: rlimit(RLIMIT_AS) = %ld,%ld\n", asLimit.rlim_cur, asLimit.rlim_max);
    }

    // 2. BEFORE: test malloc
    {
        char *xx = malloc(testSize);
        if (xx == NULL) 
            perror("malloc FAIL");
        else
            printf("malloc(%ld) OK\n", testSize);
        free(xx);
    }

    // 3. setrlimit
    {
        struct rlimit new;
        new.rlim_cur = limitSize; 
        new.rlim_max = limitSize;
        setrlimit(RLIMIT_AS, &new);
    }

    // 4. AFTER: getrlimit
    {
        struct rlimit asLimit;
        getrlimit(RLIMIT_AS, &asLimit);
        printf("AFTER: rlimit(RLIMIT_AS) = %ld,%ld\n", asLimit.rlim_cur, asLimit.rlim_max);
    }

    // 5. AFTER: test malloc
    {
        char *xx = malloc(testSize);
        if (xx == NULL) 
            perror("malloc FAIL");
        else
            printf("malloc(%ld) OK\n", testSize);
        free(xx);
    }

    return 0;
}

<强>结果:

BEFORE: rlimit(RLIMIT_AS) = -1,-1
malloc(140000) OK
AFTER: rlimit(RLIMIT_AS) = 1,1
malloc FAIL: Cannot allocate memory

答案 2 :(得分:0)

根据我对您的问题的理解,您希望以某种方式使用您自己的库来处理内核进程的内存。我认为你这样做是为了确保流氓进程不会占用太多内存,这样你的进程就可以使用尽可能多的内存。我相信这个想法是有缺陷的。

例如,想象一下这种情况:

  • 总内存512MB
  • 进程1限制为128MB - 使用64MB
  • 进程2模拟128MB - 使用64MB
  • 进程3限制为256MB - 使用256MB然后耗尽内存,实际上仍有128MB可用。

我知道你认为这是你的问题的答案,在'普通'的嵌入式系统上,这可能会有效,但是你正在使用一个复杂的内核,运行你无法完全控制的进程。当你的内存变得紧张时,你应该把你的软件编写得很健壮,因为这是你可以控制的。