es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se accede a ‘task_struct’ a través de ‘thread_info’ en el último kernel de Linux?

Antecedentes:
Soy un principiante en el área del kernel de Linux. Acabo de comenzar a entender el kernel de Linux leyendo el libro ‘Desarrollo del kernel de Linux – Tercera edición’ de Robert Love. La mayoría de las explicaciones en este libro se basan en el kernel de Linux 2.6.34.

Por lo tanto, lo siento si esta es una pregunta repetitiva, pero no pude encontrar ninguna información relacionada con esto en Stack Overflow.

Pregunta:
Lo que entendí del libro es que cada hilo en Linux tiene una estructura llamada ‘thread_info’, que tiene un puntero a su proceso/tarea.

Este ‘thread_info’ se almacena en el extremo de la pila del kernel para cada hilo vivo.

y el ‘thread_info’ tiene un puntero a su tarea perteneciente como se muestra a continuación.

struct thread_info {
struct task_struct *task;
…
};

Pero cuando revisé la misma estructura en el último código de Linux, veo una estructura de thread_info muy diferente como se muestra a continuación. (https://elixir.bootlin.com/linux/v5.16-rc1/source/arch/x86/include/asm/thread_info.h). No tiene ‘task_struct’ en él.

struct thread_info {
unsigned long       flags;      /* low level flags */
unsigned long       syscall_work;   /* SYSCALL_WORK_ flags */
u32                 status;     /* thread synchronous flags */
#ifdef CONFIG_SMP
u32                 cpu;        /* current CPU */
#endif
};

Mi pregunta es, si la estructura ‘thread_info’ no tiene su estructura de tarea relacionada aquí, ¿cómo encuentra la información sobre su espacio de direcciones?

Además, si conoce algún buen libro sobre el último kernel de Linux, por favor proporcióneme los enlaces.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Linux y en el núcleo de Linux, puedo responder la pregunta de la siguiente manera:

    La estructura thread_info ha evolucionado con el tiempo y su implementación puede variar dependiendo de la arquitectura y la versión del núcleo de Linux. La versión de la estructura thread_info que encontraste en la última versión del núcleo de Linux (v5.16-rc1) es específica para la arquitectura x86.

    Para responder tu pregunta, el espacio de dirección de un hilo se almacena en el campo mm (manejo de memoria) del task_struct correspondiente. En la última implementación, la estructura task_struct tiene un campo struct mm_struct *mm que apunta al espacio de dirección de la tarea. Cuando un hilo quiere acceder a su espacio de dirección, puede hacerlo accediendo al campo mm de su task_struct. Por lo tanto, la información sobre el espacio de dirección del hilo se puede obtener a través de su task_struct asociado.

    En cuanto a la segunda parte de tu pregunta, dado que la implementación del núcleo de Linux está en constante evolución, es importante mantenerse actualizado utilizando los recursos más recientes disponibles. Un buen libro para la última versión del núcleo de Linux es “Linux Kernel Development” de Robert Love, que cubre la última versión del núcleo de Linux y su proceso de desarrollo. Otro recurso útil es la documentación oficial del núcleo de Linux disponible en https://www.kernel.org/doc/html/latest/.

Comments are closed.