我有一个设备需要一块专门为其保留的内存块,而无需操作系统干预。有没有办法告诉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