nucleo know descargar compilar como linux-kernel kernel-module vmalloc

linux-kernel - know - linux kernel github



¿Hay un límite de tamaño para el módulo kernel en Linux? (3)

Recuerde que la memoria kernel-space es diferente de la memoria de espacio de usuario: en Linux de 32 bits, el kernel tiene solo espacio de direcciones de 1Gb. Hay un espacio de direcciones de registro más espacio para el kernel en Linux de 64 bits, pero la documentación del kernel sugiere que solo 1536MB está disponible para los módulos.

Tengo un problema cargando un módulo kernel, hay una gran estructura de datos, alrededor del tamaño de 2Gb de memoria, si preajunto la tabla (para que se muestre en .bss cuando hago el size -A module.ko o trato de vmalloc() en el momento de la carga, la carga del módulo falla con insmod: error inserting ''module.ko'': -1 Cannot allocate memory .

Intenté depurar el problema en usermode linux, pero tengo un montón de segfaults (que pueden continuarse en gdb, pero terminan con un overflow in relocation type 10 val <value in the ball park of 6G> mensaje de la consola overflow in relocation type 10 val <value in the ball park of 6G> y ''module'' likely not compiled with -mcmodel=kernel . Supongo que con Kbuild el -mcmodel debería estar en lo cierto, ¿no?

Entonces las preguntas son:

  1. ¿Hay un límite genérico de 2G para el tamaño del módulo de kernel de Linux?
  2. ¿Existe un límite 2G específico para los módulos kernel en usernode linux ( creo que en el pasado he notado que un módulo kernel grande necesita un bloque limpio y continuo de memoria ...)
  3. ¿Puedo especificar -mcmodel=large para un módulo kernel y esperar que funcione?

He intentado esto con debian squeeze, 64 bits, 2.6.32-5-amd64 (host) con 8 Gb de memoria y 2.6.32 en UML con memoria 4G, por lo que este no debería ser un problema habitual de falta de memoria.

Crédito adicional por trabajar alrededor del límite, si tal límite existe :)


En cuanto a su primera pregunta, el límite del módulo en sí es de 64 megabytes. El cargador de módulos rechazará cargar un módulo que exceda este tamaño. De kernel / module.c :

if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL) return ERR_PTR(-ENOMEM);

Esto es cierto tanto para 2.6.32 como para los kernels nuevos también, hasta 3.3.

EDITAR: En kernel versión 3.4, se eliminó el límite de 64 Mb. Ahora el límite real depende únicamente de la cantidad de memoria que puede asignar vmalloc() .


Si defino la tabla como static , la carga del módulo fallará, esto es probablemente debido al límite de 1.5G mencionado en la respuesta de Andrew Aylett.

Sin embargo, si hago llamadas vmalloc() dinámicas, pude obtener hasta 7680Mb en un host con 8Gb de memoria (hasta que el kernel eliminó algún proceso crucial y mi X colgó).

Entonces para responder mis preguntas:

  1. Sí, pero solo para datos compilados como static
  2. No se ve así.
  3. No hay necesidad de hacer eso.

Crédito adicional: simplemente haz vmalloc()

Esto solo funciona en kernels de linux más nuevos que 2.6.10 - antes de eso, el límite de vmalloc() era de 64 Mb.