Puedo obtener la dirección del final del montón con sbrk(0)
, pero ¿hay alguna forma de obtener mediante programación la dirección del inicio del montón, que no sea mediante el análisis del contenido de /proc/self/maps
?Cómo obtener programáticamente la dirección del montón en Linux
Respuesta
Creo que el análisis /proc/self/maps
es la única manera confiable en Linux para encontrar el segmento de montón. Y no olvide que algunos asignadores (incluido uno en mis SLES) sí lo utilizan para los bloques grandes mmap()
, por lo que la memoria ya no forma parte del montón y puede estar en cualquier ubicación aleatoria.
De lo contrario, normalmente ld
añade un símbolo que marca el final de todos los segmentos de duende y el símbolo se llama _end
. Ej .:
extern void *_end;
printf("%p\n", &_end);
Coincide con el final de la .bss
, tradicionalmente el último segmento del duende. Después de la dirección, con cierta alineación, normalmente sigue el montón. Stack (s) y mmap() s (incluidas las bibliotecas compartidas) están en las direcciones más altas del espacio de direcciones.
No estoy seguro de qué tan portátil es, pero aparentemente funciona de la misma manera en Solaris 10. En HP-UX 11 el mapa se ve diferente y el montón parece fusionarse con el segmento de datos, pero las asignaciones suceden después del _end
. En AIX, procmap
no muestra el segmento de montón/datos en absoluto, pero las asignaciones también obtienen las direcciones más allá del símbolo _end
. Por lo tanto, parece ser en el momento bastante portátil.
Aunque, en conjunto, no estoy seguro de lo útil que es eso.
P.S. El programa de prueba:
#include <stdio.h>
#include <stdlib.h>
char *ppp1 = "hello world";
char ppp0[] = "hello world";
extern void *_end; /* any type would do, only its address is important */
int main()
{
void *p = calloc(10000,1);
printf("end:%p heap:%p rodata:%p data:%p\n", &_end, p, ppp1, ppp0);
sleep(10000); /* sleep to give chance to look at the process memory map */
return 0;
}
Bueno, si no hay forma de encontrar la dirección de inicio del montón, ¿cómo se implementa Malloc, que está tratando de dividir el montón en trozos de memoria más pequeños? – Jun
Tenga en cuenta que esto puede fallar en un sistema con compensaciones aleatorias. Se puede habilitar, pero de forma predeterminada, Linux fuzzes donde el montón "comienza" por lo que es más difícil encontrarlo desde el exterior de la máquina (evitando los ataques de desbordamiento del búfer). – jwarner112
@Jun, libc llama a 'sbrk (0)' para buscar la dirección del inicio del montón. Pero eso solo funciona para la libc: se llama muy temprano durante el inicio de la aplicación, antes de 'main()', y por lo tanto el final del montón es el mismo que el comienzo del montón. Dentro del 'main()' que ya no es verdadero. – Dummy00001
- 1. ¿Cómo obtener la dirección de memoria del montón de Java?
- 2. ¿Cómo detectar el cambio de dirección IP programáticamente en Linux?
- 3. Cómo obtener la dirección IPv6 de una interfaz en Linux
- 4. Obtener dirección MAC en Linux usando mono
- 5. ¿Cómo obtener programáticamente la resolución de una ventana y la del sistema en Linux?
- 6. ¿Cómo obtener la pantalla DPI (linux, mac) programáticamente?
- 7. ¿cómo puedo proteger una memoria de montón en Linux?
- 8. ¿Cómo obtener la dirección IP del servidor?
- 9. Obtener la dirección IP de una interfaz en Linux
- 10. ANSI C ¿Cómo obtener la dirección del servidor de nombres (DNS) en Linux?
- 11. Cómo obtener mi dirección MAC programáticamente con Ruby
- 12. Obtener la dirección IP del usuario
- 13. ¿Cómo obtener la dirección IP del servidor en ASP.NET?
- 14. ¿Cómo puedo cambiar la dirección del punto final programáticamente en el sitio del cliente?
- 15. Cómo obtener la dirección del puntero de la pila base
- 16. ¿es posible obtener la dirección en el montón de una variable en Java?
- 17. ¿Cómo obtener la dirección IP?
- 18. Cómo obtener la dirección MAC programáticamente en C# para un dispositivo con Windows Mobile 6.0
- 19. en Python y Linux cómo obtener la identificación del usuario
- 20. ¿Cómo obtener la fecha de creación del archivo en Linux?
- 21. ¿Cómo obtener la dirección IPv6 en C#?
- 22. ¿Cómo obtener los tamaños máximos del montón y el permgen de la JVM?
- 23. Cómo obtener el tamaño de página del kernel de Linux programáticamente
- 24. Cómo obtener la longitud y la latitud de una dirección de calle programáticamente (y legalmente)
- 25. Cómo obtener la dirección de la brújula
- 26. ¿Cómo obtener la dirección IP del cliente de escritorio remoto?
- 27. ¿Cómo obtener programáticamente la ID del dispositivo para AdMob?
- 28. ¿Cómo obtener la dirección IP del usuario usando .net?
- 29. ¿Cómo establecer mi dirección de IP programáticamente?
- 30. Cómo obtener la dirección IP del cliente usando jQuery
Me confunde ... si obtengo un montón con p = (int *) malloc (sizeof (int)); , entonces ¿por qué no puedo obtener la dirección de inicio del montón por p? – bazysong