TASK_SIZE es una constante del núcleo que define el límite superior de la memoria accesible para el código que funciona en el nivel de privilegio más bajo.
Su valor generalmente se establece en 0xc0000000 en sistemas con menos de 1 GB de memoria física (todos los ejemplos incluidos en este artículo se refieren a este valor). La memoria por encima de este límite contiene el código del kernel.
¿Hay alguna manera de determinar los núcleos en ejecución TASK_SIZE a través del programa c?
Después de mucha búsqueda y análisis en Google, obtuve una lógica
Suponga que la dirección virtual neta es de 4 gb y está dividida en una proporción de 1:3.
Suposiciones aproximadas: -
Núcleo (1 gb superior): c0000000 -ffffffff
Espacio de usuario (menos de 3 gb): 0-c0000000
que
#define GB *1073741824 unsigned int num; unsigned int task_size; task_size=(unsigned)&number+ 1 GB / 1 GB * 1GB;[el área de pila del proceso se asignará debajo del espacio del kernel]
entonces la dirección de num (en la pila) = en algún lugar alrededor del rango de 3 GB, por ejemplo: [3214369612]
ahora agregando 1 GB = 1073741824+3214369612=4288111436
dividiendo por 1GB=3.993614983 será 3 (int sin signo)
ahora multiplicando por 1 GB = 3 * 1073741824 = 3221225472 es decir (0xC0000000 en hexadecimal)
por lo tanto, obtuve la dirección inicial del kernel (TASK_SIZE)
Lo probé asumiendo también una relación (2: 6) y obtuve el resultado correcto.
¿Es esta una lógica justa, por favor comenten?