Comprensión de cómo obtener el puntero task_struct de la pila del kernel de proceso
Ahora mismo estoy leyendo el libro "Linux Kernel Development 3D Edition" de Robert Love. Allí escribe sobre la estructura thread_info que contiene el puntero a la estructura task_struct y, como entendí, se encuentra en la parte inferior o en la parte superior de la pila de procesos del kernel (depende de la arquitectura). No estaba familiarizado con la API del kernel de Linux hasta hace poco y no se sabía de la existencia del método current (). Hay un extracto del libro relacionado con cómo funciona realmente el método current ():
En x86, la corriente se calcula enmascarando los 13 bits menos significativos del puntero de pila para obtener la estructura thread_info. Esto se realiza mediante la función current_thread_info (). El ensamblaje se muestra aquí: movl $ -8192,% eax andl% esp,% eax Esto supone que el tamaño de pila es de 8 KB. Cuando las pilas de 4 KB están habilitadas, se usa 4096 en lugar de 8192.
Mis preguntas son:
Por lo que sé, si tenemos un valor decimal representado como un conjunto de bits, entonces solo hay un bit menos significativo en el conjunto, ¿no es así?¿Cuál es el número mágico 13?Para quienes lean este tema, las preguntas que he expresado pueden llevar a la conclusión de que el autor no entiende correctamente el proceso de asignación y administración de memoria. Ok, eso puede ser correcto debido al hecho de que en mi mente puedo representar la memoria asignada para la pila como la cinta llena de bits (o bytes). Todos estos bytes son accesibles por una dirección de memoria específica representada como un valor decimal. El origen de la pila es la dirección de memoria más baja y la aleta de la pila es el valor más alto de la dirección de memoria. Pero, ¿CÓMO, CÓMO podemos obtener el puntero a la estructura thread_info ubicada en el final de la pila, por ejemplo, ocultando 13 bits menos significativos del puntero de pila localizado de ARBITRARY (si entendí correctamente, ocultamos los bits de la pila)? apilar la dirección de puntero representada como valor decimal).