rdw - Tamaños de pila de Linux
kid3 (3)
La razón por la cual la documentación es escasa es que se trata de un área bastante dependiente 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 (la 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, colocando un valor canario STACK_END_MAGIC
al final de la pila (inmediatamente después de la struct thread_info
en la memoria). En el controlador de falla de página, si ocurre un error en el espacio del núcleo, este canario está marcado; consulte por ejemplo el controlador de fallas x86 que imprime el mensaje Thread overran stack, or stack corrupted
después del mensaje Oops si la pila canaria se eliminó.
Por supuesto, esto no se disparará en todos los desbordamientos de pila, solo los que golpean a la pila de canarios. Sin embargo, siempre deberías poder decir desde la salida de Oops si has sufrido un desbordamiento de la pila: ese es el caso si el puntero de la pila está debajo de &threadinfo
.
Estoy buscando una buena descripción de las pilas dentro del kernel de Linux, pero me resulta sorprendentemente difícil encontrar algo útil.
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.).
Para los procesos, puede controlar el tamaño de la pila de los procesos a través del 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 a pthread_attr_setstacksize()
(suponiendo que esté utilizando pthreads).
En cuanto a la interrupción usando el stack de userland, lo dudo un tanto, 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.
Puede determinar el tamaño de la pila de proceso con el ulimit
. Recibo 8192 KiB en mi sistema:
$ ulimit -s
8192