【问题标题】:Physical memory management in Userspace?用户空间中的物理内存管理?
【发布时间】:2017-10-27 00:46:57
【问题描述】:

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

【问题讨论】:

  • 我不关注你的问题,如果你只是使用 vmstat 命令来显示整个内存,页面信息。您不必为内存管理做任何事情。内核将处理并确保您的应用程序没有泄漏内存。
  • 您要解决什么样的问题?
  • 我不想让内核做内存管理,而是我的库应该做内存管理。
  • @Ôrel 我正在尝试为基于 Linux 的嵌入式设备提供 SDK。如果可能的话,我可以虚拟地将内存划分为不同的段,并限制每个应用程序使用相应部分的内存。
  • 您无法实现目标。您想要更改由内核处理的核心功能,即内存管理。这不是一件容易的工作。如果你想监控我的应用程序进程的系统内存使用情况,那么有几个实用程序可供使用。

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


【解决方案1】:

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

例如,想象一下这个场景:

  • 总内存 512MB
  • 进程 1 限制为 128MB - 使用 64MB
  • 进程 2 限制为 128MB - 使用 64MB
  • 进程 3 限制为 256MB - 使用 256MB 然后内存不足,而实际上 128MB 仍然可用。

我知道您认为这是您问题的答案,在“普通”嵌入式系统上,这可能会起作用,但您使用的是复杂的内核,正在运行您无法完全控制的进程。当内存紧张时,您应该编写强大的软件,因为这是您可以控制的全部。

【讨论】:

  • 你没有证明为什么这是一个有缺陷的想法。防止进程 3 导致进程 1 或 2 比计划的更早耗尽内存。
  • 这是一个有缺陷的想法,因为系统中有大量空闲内存,但需要它的进程无法访问它。
  • 为什么会有这个缺陷?
【解决方案2】:

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

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

#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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2014-06-10
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多