2011-06-07 9 views
34

Estoy buscando una buena descripción de las pilas dentro del kernel de Linux, pero me resulta sorprendentemente difícil encontrar algo útil.Linux Stack Sizes

Sé que las pilas están limitadas a 4k para la mayoría de los sistemas, y 8k para otros. Supongo que cada hilo del núcleo/mitad inferior tiene su propia pila. También he escuchado que si se activa una interrupción, usa la pila del hilo actual, pero no encuentro ninguna documentación sobre esto. Lo que estoy buscando es cómo se asignan las pilas, si hay buenas rutinas de depuración para ellas (estoy sospechando un desbordamiento de pila para un problema en particular, y me gustaría saber si es posible compilar el kernel para la policía tamaños de pila, etc.).

+0

¿con qué versión de kernel estás trabajando? entonces tenemos una mejor idea de las opciones de configuración de depuración del kernel disponibles para usted. –

+0

Parece que no entiendo esto. ¿Por qué no es un depurador suficiente para la tarea? – cnicutar

+0

"mitades inferiores" probablemente compartan la misma pila. Además, las "mitades de abajo" desaparecieron hace mucho tiempo, ahora quedan bizcochos. – ninjalj

Respuesta

1

Para los procesos, puede controlar el tamaño de la pila de los procesos a través del comando ulimit (opción -s). Para los hilos, el tamaño de pila predeterminado varía mucho, pero puede controlarlo a través de una llamada al pthread_attr_setstacksize() (suponiendo que esté utilizando pthreads).

En cuanto a la interrupción usando la pila de userland, lo dudo un poco, ya que acceder a la memoria de usuario es una especie de molestia del kernel, especialmente a partir de una rutina de interrupción. Pero no estoy seguro.

32

La razón de que la documentación sea escasa es que es un área que depende bastante de la arquitectura. El código es realmente la mejor documentación; por ejemplo, la macro THREAD_SIZE define el tamaño de la pila del kernel (dependiente de la arquitectura) por subproceso.

Las pilas se asignan en alloc_thread_info_node(), o la anulación específica de la arquitectura para esa función (el struct thread_info siempre vive en la parte inferior de la pila). El puntero de pila en struct task_struct se actualiza en dup_task_struct(), que se llama como parte de la clonación de un subproceso.

El kernel verifica los desbordamientos de la pila del kernel, al colocar un valor canario STACK_END_MAGIC al final de la pila (inmediatamente después del struct thread_info en la memoria). En el controlador de fallas de página, si se produce un error en el espacio del kernel, este canario está marcado; consulte, por ejemplo, the x86 fault handler, que imprime el mensaje Thread overran stack, or stack corrupted después del mensaje Oops si el canario de la pila ha sido destruido.

Por supuesto, esto no va a disparar en todas excesos de pila, sólo los que Clobber el canario pila. Sin embargo, siempre debe poder decir desde la salida Oops si ha sufrido un desbordamiento de la pila: ese es el caso si el puntero de la pila está por debajo de &threadinfo.

5

Puede determinar el tamaño de la pila de proceso con el comando ulimit. Obtengo 8192 KiB en mi sistema:

$ ulimit -s 
8192 
+5

Respuesta de baja calidad, porque la pregunta era sobre kernel. Citar _ "pilas dentro del kernel de Linux" _. – catpnosis

+2

@MilesRout Mi mal, creo que se refiere al tamaño de la pila del kernel. –

+0

De hecho, parece que este no es el lugar correcto para responder eso, pero sinceramente me ayuda a buscar el tamaño de pila de proceso (como la pregunta lo responde) –