2010-05-22 14 views
8

Cuando trato de usar malloc en un módulo kernel recibo un mensaje de error del compilador. Mi código:malloc en kernel

res=(ListNode*)malloc(sizeof(ListNode)); 

El mensaje de error es compiladores:

/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’ 

¿Qué debo hacer?

+0

en otras palabras, como todos sabemos #include no existe en kernel ¿qué incluir debería tener? – yoavstr

Respuesta

19

uso kmalloc o vmalloc lugar (ver también this)

+1

O 'vmalloc()'. La asignación de memoria funciona de manera diferente en el kernel. – Wyzard

+0

wyzard, gracias. – knittl

+2

estos enlaces están muertos; ejemplo perfecto de por qué las respuestas de solo enlace son una mala idea. esta respuesta se encuentra en la parte superior de una búsqueda de Google para "¿puedo usar malloc en un módulo kernel?". –

7

No puede utilizar las bibliotecas en el núcleo. Ninguno en absoluto.

Esto significa que CUALQUIER función que llame en el kernel debe definirse en el kernel. Linux no define un malloc, por lo tanto no puede usarlo.

Hay un asignador de memoria y una familia de funciones de asignación de memoria. Lea los documentos del kernel en el asignador de memoria para más información.

Incidentalmente, hay algunas funciones que el núcleo define que también están en la biblioteca C estándar; esto es por conveniencia

lo hace, por ejemplo, definido snprintf

1

uso kmalloc/kfree. Puedes grep malloc en el código fuente del kernel.

14

Nota sobre la diferencia entre los dos métodos de asignación - kmalloc y kmem_cache o vmalloc:

kmalloc: Mejor usado para las asignaciones rápidos que son más pequeños que una página (PAGE_SIZE, 0x1000 en la mayoría de las arquitecturas). No implica la asignación de memoria, por lo que obtiene la memoria directamente de la asignación de memoria física 1: 1 del kernel. Obtienes memoria física contingente. Tenga en cuenta que si desea asignar más de una página (es decir, orden> 0), corre el riesgo de toparse con problemas de fragmentación externos, es decir, la llamada podría fallar incluso si hay suficiente espacio libre. Orden más alto: mayores posibilidades de fallas de asignación, y el tiempo de actividad también es un factor aquí.

Si desea lograr la máxima eficiencia de asignación, usar su propio kmem_cache para cada tipo de estructura es el camino a seguir (los otros beneficios de esta estrategia son poder monitorear el estado de sus asignaciones desde/proc y capturar memoria gotea más fácilmente).

vmalloc: Asignaciones de más de una página. Se obtiene memoria mapeada en el kernel. Detrás de escena, es similar a lo que obtiene el espacio de usuario: el kernel asigna un grupo de páginas y las mapea en un espacio de direcciones virtuales. Esta asignación es más lenta que la de kmalloc, y los accesos a la memoria pueden incurrir en un poco más de sobrecarga.

0

Se puede imaginar como un proceso de tres pasos: Biblioteca espacio

  1. usuario - malloc() llamada

  2. Sistema - brk()

  3. Dentro del núcleo - rutinas de kmalloc/vmalloc/gfp etc. del administrador de memoria

Entonces, si ya está en el paso 3, escribiendo el módulo kernel, entonces volver no tendría sentido. Por lo tanto, debe usar las rutinas del kernel solo para la asignación de memoria.