如何从 Linux 内核中保留一块内存?

如何从 Linux 内核中保留一块内存?

我有一个设备需要一块专门为其保留的内存块,而无需操作系统干预。有没有办法告诉BIOS或操作系统一块内存被保留,并且不能使用它?

我正在 openSUSE 机器上使用此设备。

答案1

如果您希望操作系统完全忽略它,你需要使用“ memmap.”创建一个内存漏洞。看这个参考。例如,如果您想要 2GB 的 512M,您可以memmap=512M$2G在内核命令行上输入“”。

您需要检查dmesg以找到连续的漏洞来窃取,这样您就不会踩踏任何设备;这是特定于您的主板+卡的。

这是不是推荐的做事方式 - 请参阅 Warren Young 的答案,了解如何正确执行此操作(内核驱动程序 + DMA)。我正在回答你问的确切问题。如果您计划为最终用户制作此产品,他们会如果你对他们这样做...相信我,这是我知道这个答案的唯一原因。


编辑:如果您使用 grub2 和 grubby(例如 CentOS 7),您需要确保转义 $\之前应该有一个$。例子:

$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"

答案2

您所要求的称为 DMA。您需要编写一个驱动程序来保留该内存。

是的,我知道你说过你不希望操作系统干预,并且驱动程序成为操作系统的一部分,但在没有驱动程序保留的情况下,内核认为所有内存都属于它。 (除非你告诉内核忽略内存块,按照亚伦的回答,就是这样。)

第15章(PDF) 的“Linux 设备驱动程序,3/e由 Rubini、Corbet 和 Kroah-Hartmann 撰写的《DMA 及相关主题》。

如果你想要这个的 HTML 版本,我发现本章的第二版其他地方在线。请注意,第二版已经有十多年的历史了,它是在内核 2.4 刚刚推出时发布的。从那时起,内核的内存管理子系统已经做了很多工作,因此它可能不再适用了。

答案3

要在基于 ARM 的 Linux 中从内核保留一块内存,您还可以使用reserved-memory设备树 (dts) 文件中的节点。在内核文档中(参见这里),有一个例子:

memory {
    reg = <0x40000000 0x40000000>;
};

reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;

    /* global autoconfigured region for contiguous allocations */
    linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0x4000000>;
        alignment = <0x2000>;
        linux,cma-default;
    };

    display_reserved: framebuffer@78000000 {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: multimedia@77000000 {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};

答案4

首先输入此命令,检查您当前的设置:

sysctl vm.min_free_kbytes

要更改设定值,请编辑/etc/sysctl.conf。寻找该行:

vm.min_free_kbytes=12888

如果它不存在,请创建它(以及您想要的值)。以下值是可接受的:

8192
12288
16384
20480

8M极其保守; 16M高度也能坐得舒服。更改值后,运行此命令,无需重新启动:

sudo sysctl -p

相关内容