2012-07-17 18 views

Respuesta

-4

Porque la dirección de 6 bytes es solo la dirección virtual (desplazamiento de la dirección física real). En la arquitectura física (por ejemplo, X86), la memoria se divide en porciones que pueden ser direccionadas por un único registro de índice sin cambiar un selector de segmento de 16 bits. En el modo real de la CPU X86, un segmento siempre usa un selector de segmentos de 16 bits (2 bytes), que el Sistema operativo decidirá dinámicamente desde el principio cuando el programa comenzó a ejecutarse (es decir, se está creando un proceso real))

Por lo tanto, si la variable tiene la dirección de 48 bits 0x7fffbd8ce900, y su programa de tener el selector segmento compensado 08af, y la dirección real de la variable es (0x08af < < 48) + 0x7fffbd8ce900 = 0x08af7fffbd8ce900, que es 64 -poco.

lectura adicional pls gire a: x86 memory segmentation

+0

Guau, tu respuesta abre la arquitectura de mi ojo de la memoria. ¿Hay alguna manera de inspeccionar el contenido del contenido real de la memoria, como usar las herramientas de línea de comandos de c o linux? – mko

+2

Esta respuesta es incorrecta. Los sistemas operativos modernos usan un espacio plano de direcciones virtuales sin segmentación, y la segmentación ni siquiera es compatible en el modo de 64 bits ("modo largo"). Los 16 bits en cuestión son * no * un lugar para un selector de segmento. – Wyzard

+0

No, esto mezcla el modo real 8086 (donde una dirección seg: offset fue mapeada a 'seg << 4 + offset') con memoria virtual, que no funciona de ninguna manera. Simplemente totalmente equivocado. –

6

Eso solo significa que los primeros dos bytes son cero (que, por cierto, actualmente está garantizado para los chips x86-64, pero eso no significa nada en este caso, ya que su puntero no está inicializado). %p puede truncar ceros a la izquierda, como cualquier otro tipo numérico. %016p, sin embargo, no lo es. Esto debería funcionar bien:

printf("the value of ptr is %016p", ptr); 
+0

¿Cuál es la diferencia entre 'printf (.., ptr)' y 'printf (.., & ptr)'? – Jack

+1

@Jack ¿Está relacionado con la pregunta? Al pasar 'ptr' significa que verá la dirección del puntero contenida en la variable' ptr'. Al pasar '& ptr' significa que verá la dirección de la variable' ptr'. –

+0

& ptr daría la dirección de la variable ptr, a diferencia de la dirección de lo que se señala – 3Pi

13

Aunque un puntero es de 64 bits, current processors actually only support 48 bits, por lo que los dos bytes superiores de una dirección son siempre bien 0000 o FFFF (debido a la extensión con signo).

En el futuro, si 48 bits ya no son suficientes, los nuevos procesadores pueden agregar soporte para direcciones virtuales de 56 o 64 bits, y los programas existentes podrán utilizar el espacio adicional ya que ya están usando 64 punteros de bits.

Cuestiones relacionadas