2010-11-28 29 views
9

Actualmente estoy leyendo 'Linux Kernel Development' de Robert Love y no entiendo qué está haciendo este ensamblaje.desarrollo del kernel de Linux

Básicamente, en cada pila de kernel de proceso, hay un struct thread_info que reside al final de la pila. Ahora, en la arquitectura x86, podemos parecer agarrar esta (suponiendo tamaño de la pila de 8 KB) utilizando el siguiente montaje

movl $-8192, %eax 
andl %esp, %eax 

Así que, básicamente ANDing el puntero de pila por 0xffffe000. Estoy confundido en cuanto a lo que está pasando aquí? No veo por qué enmascarar los 13 bits menos significativos de %esp nos lleva a la estructura. Sé que me sentiré estúpido una vez que se lo explique, pero me está molestando.

Gracias.

+0

Actualmente estoy leyendo este libro y tengo una pregunta aún más básica: ¿cómo sabes que '-8192' es' 0xffffe000'? ¿Cómo se almacenan los números negativos en los registros de la CPU? –

Respuesta

5

La pila crece hacia abajo, por lo que el final de la pila es la dirección más baja de la pila y la dirección inicial de la estructura. Y las pilas se almacenan en múltiplos de 8 KB. Por lo tanto, al borrar los 13 bits menos significativos se obtiene la dirección más baja de la pila y, por lo tanto, el inicio de la estructura. ¿Esto tiene sentido?

+0

¿Pero pensé que% esp apuntaba al final de la pila? Cuando se empuja la estructura a la pila al final, se disminuye% esp. – tbh

+0

La pila comienza desde una dirección de memoria alta (cuando se empujan cosas, el puntero de la pila disminuye). % esp apunta al final de la pila, ya que apunta a la parte inferior "actual", en lugar de a la parte inferior del espacio en el que la pila puede crecer. – lijie

+0

Ah, mira, pensé que la estructura simplemente estaba presionada en Al final de todo, en lugar de empujarlo directamente hacia abajo en el pozo de la pila cuando se inicializa el proceso y se le da su propia pila. OK, gracias lijie – tbh

Cuestiones relacionadas