Si desea que el sistema operativo totalmente ignóralo, necesitas hacer un agujero de memoria usando "memmap
." Vea esta referencia. Por ejemplo, si quiere 512M en la barrera de 2GB, puede poner "memmap=512M$2G
" en la línea de comandos de su kernel.
Deberá verificar su dmesg
para encontrar un agujero contiguo para robar para no pisar ningún dispositivo; eso es específico para su placa base + tarjetas.
Esto es no la forma recomendada de hacer las cosas:consulte la respuesta de Warren Young sobre cómo hacerlo correctamente (controladores del kernel + DMA). Estoy respondiendo exactamente a la pregunta que hiciste. Si planea hacer esto para los usuarios finales, ellos odiarán si les haces esto... confía en mí, esa es la única razón por la que sabía esta respuesta.
Editar:si está utilizando grub2 con grubby (por ejemplo, CentOS 7), debe asegurarse de escapar de $. Debería haber un solo \
antes de $
. Ejemplo:
$ 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"
Lo que estás pidiendo se llama DMA. Debe escribir un controlador para reservar esta memoria.
Sí, me doy cuenta de que dijo que no quería que interviniera el sistema operativo, y un controlador se convierte en parte del sistema operativo, pero en ausencia de una reserva de controlador, el kernel cree que toda la memoria le pertenece. (A menos que le diga al núcleo que ignore el bloque de memoria, según la respuesta de Aaron).
El capítulo 15 (PDF) de "Linux Device Drivers, 3/e" de Rubini, Corbet y Kroah-Hartmann cubre DMA y temas relacionados.
Si desea una versión HTML de esto, encontré la versión de la segunda edición del capítulo en otro lugar en línea. Tenga en cuenta que la segunda edición ya tiene más de una década y salió cuando el kernel 2.4 era nuevo. Se ha trabajado mucho en el subsistema de administración de memoria del kernel desde esos días, por lo que es posible que ya no se aplique muy bien.
Para reservar un bloque de memoria del kernel en Linux basado en ARM, también puede usar un reserved-memory
nodo en su archivo de árbol de dispositivos (dts). En la documentación del kernel (ver aquí), hay un ejemplo:
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: [email protected] {
reg = <0x78000000 0x800000>;
};
multimedia_reserved: [email protected] {
compatible = "acme,multimedia-memory";
reg = <0x77000000 0x4000000>;
};
};