Programa en C que use una direccion de memoria exacta

Me gustaría dada una dirección de memoria (pasada por argumento al programa) , reservar esa dirección de memoria para usarla (a todo esto para plataformas Windows)

Si tengo la dirección de memoria 0xABCFE101 pues poder decir

miprograma 0xABCFE101

Y que dentro de mi programa pueda usar exactamente esa dirección como dirección de memoria de una variable. Obviamente intentaría usarla, pero puede que este siendo usada por otro programa, así que mi programa a cada cierto tiempo generaría un sigalarm y consultaría si esta sigue en uso.

Es algo que se me ha ocurrido hace unos días y me gustaría saber si es posible indicarlo.
Diría que lo que quieres hacer no es trivial, ya que los programas no trabajan con direcciones físicas, sino a través de páginas, realmente este es transparente al programa ya que es el sistema operativo quien se encarga de esto.

Mas o menos en la wikipedia lo tienes bien explicado, https://es.wikipedia.org/wiki/Paginaci% ... de_memoria
Parece que en Stack Overflow alguien tenía una pregunta parecida:
Accessing Specific Memory Locations in C tal vez te pueda ahorrar algo de trabajo ;)
sodark escribió:Obviamente intentaría usarla, pero puede que este siendo usada por otro programa

No, eso nunca pasará pues estas en memoria virtual. Tu programa tiene los 4 GB de memoria libre para direccionar (32 bits). Es responsabilidad del sistema operativo la traducción a una memoria física, el sistema operativo suele hacer algunas optimizaciones (por ejemplo. compartir una misma variable entre dos programas para ahorrar memoria) y también puede guardarlo en el disco duro.

Como consecuencia de esto, lo que tú pides no tiene ninguna utilidad para programas de usuario.
Usando punteros podrás especificar la memoria que quieras dentro de tu programa, pero no podrás acceder a la dirección que esté usando otra aplicación, salvo que claro está, este la marque como memoria compartida.

En Windows XP original (antes del SP2) podías saltarte esta restricción usando punteros lejanos (far pointer), sin embargo, desde el SP2 el sistema operativo controla esto para que no se puedan hacer actos de maldad, como leer las contraseñas de Chrome o algo así.
Cierto, no recordaba que la CPU genera una direccion logica que luego la MMU es la encargada de traducir a física.

Es una lástima porque quería implementar una especie de BadRam de Linux para bloquear ciertas direcciones de memoria (las que dijera el memtest) y poder así usar memorias ram que tuvieran sectores erroneos con sistemas Windows.
5 respuestas