GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo reservar un bloque de memoria del kernel de Linux?

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>;
    };
};

Linux
  1. ¿Cómo registrar el consumo de memoria en Linux?

  2. Cómo configurar la dirección IP desde C en Linux

  3. ¿Cómo funciona internamente copy_from_user del kernel de Linux?

  4. ¿Cómo puede un kernel de Linux ser tan pequeño?

  5. ¿Cómo puedo montar un dispositivo de bloques de una computadora a otra a través de la red como un dispositivo de bloques?

Cómo el kernel de Linux maneja las interrupciones

Cómo compilar un kernel de Linux en el siglo XXI

Cómo compilar el kernel de Linux desde cero {Guía paso a paso}

Cómo verificar la versión del kernel en Linux

Cómo construir el kernel de Linux desde cero

Cómo compilar el kernel de Linux desde el origen para crear un kernel personalizado