2009-08-24 14 views

Respuesta

11

¿Está preguntando sobre punteros en general?

En la mayoría de los sistemas operativos, son direcciones lógicas.

El sistema operativo es responsable de traducirlos en direcciones físicas a través de la memoria virtual y el mecanismo de búsqueda. Esto es transparente para el programa. Es por eso que un programa equivocado "llega a los límites" y los GPF.

En algunos sistemas antiguos (por ejemplo, DOS), serían físicos, lo que le permite sobrescribir cosas en otras partes de la memoria.

7

Depende del sistema operativo y en qué nivel se está ejecutando su código.

Para un programa usuario-terreno normal en un sistema operativo moderno, obtendrá la dirección virtual.

+1

pero si ejecuto el siguiente prog: int main() {int (* p)(); p = main; printf ("% p", p);} está dando una dirección como 0x80483c4, cree que es una dirección física, ¿por qué la dirección virtual de inicio principal en una dirección tan grande? estoy ejecutando esto en linux.plz aclarar si estoy equivocado ?? – mawia

+4

Estás equivocado. Esa es una dirección virtual. Nadie dijo que tu función main() se carga en la dirección virtual 0. De hecho, de forma predeterminada en los binarios ELF (usados ​​en Linux), el segmento de código comienza en la dirección virtual 0x80482c0, que se ve exactamente bien (hay una configuración oculta) código antes de main()). Tenga en cuenta que el espacio de direcciones virtuales a menudo no es contiguo, y las direcciones virtuales solo se asignan a medida que las utiliza. El hecho de que su programa esté cargado en 0x80482c0 no significa que ya se haya asignado todo lo que hay entre allí y 0x0. –

+0

Si está realmente interesado en aprender cómo se organiza su programa en la memoria bajo Linux, déjele una lectura: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html –

Cuestiones relacionadas