utilizar tutorial tag que manager gtm google container como app c malloc heap dynamic-memory-allocation

c - tutorial - que es gtm



Descripción del código de implementación de ptmalloc. (2)

Ok, he investigado un poco y tengo la respuesta para muchas de esas preguntas.

  • La arena es la región de memoria en la que se almacenarán todos los datos dinámicos de un proceso. En resumen, la arena es la estructura de memoria que en el pasado se llamaba montón. Dado que en la actualidad (con el material de subprocesamiento múltiple) desea tener más de un montón por proceso, lo maneja creando algo llamado arena, pero este campo no es más que un montón. La estructura heap_info solo gestiona las múltiples arenas existentes de un proceso.

  • No sé por qué sólo hay un puntero anterior . Lo que sé es que normalmente, todos los datos dinámicos se almacenan en la main_arena , es la arena que se crea para ese proceso. No sé en qué circunstancias no se usa main_arena , lo que sí sé es que si el campo de tamaño en un fragmento de memoria tiene establecido el bit NON_MAIN_ARENA , entonces no se usa main_arena y el algoritmo hace que no se borre la nueva dirección de arena los 20 bits menos significativos de ese puntero de fragmento de memoria a través de la macro heap_for_ptr () . En resumen, en circunstancias normales, siempre se utilizará main_arena .

  • Sí, como dije, cada estructura heap_info puede tener múltiples arenas. Esto es debido a la contención de bloqueo. Si tiene suficiente tiempo libre, puede leer sobre esto en [1].

  • No recuerdo este. Pero el hecho es que si la arena está en uso, bloqueada, se crea una nueva arena. Busca cualquier llamada a una función similar a new_arena () o new_heap (). Recuerdo que el nombre de la función era similar a eso.

  • Creo que esto solo significa que al principio, todo el espacio de memoria para el montón es la parte superior (o parte salvaje), por lo que cuando se solicitan nuevas solicitudes de memoria del proceso, esta parte superior se divide y se fragmenta. Así que todo comienza con la parte superior.

Sin querer ser pomposo, creo que, después de tres meses, mi respuesta es la que se ajusta más a mis preguntas, así que la pondré como la correcta. Por otro lado, gracias por todas las otras respuestas. Han sido de gran ayuda.

Por cierto, he puesto toda esta investigación en un documento, pero dado que está en español, no creo que sea de utilidad aquí, y no sé si se consideraría spam. [2]

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.4439

[2] Aquí tiene el documento: http://overflowedminds.net/papers/newlog/linux_heap_exploiting_revisited.pdf

Espero entender cómo funciona la administración dinámica de memoria a bajo nivel en los sistemas GNU / Linux (también conocido como, cómo funciona ptmalloc).

Por supuesto, he leído el código pero tengo muchas dudas. Yo, más o menos, entiendo las estructuras de datos, ¡pero tengo muchas filtraciones de información!

Mi pregunta es si alguien conoce algún recurso que explique en detalle la implementación. Por ejemplo, he leído artículos como ''Entendiendo el montón rompiéndolo'' o la serie y post-serie ''Malloc Malleficarum''. Hacen un gran trabajo, pero, por supuesto, están más enfocados en la explotación que en explicar muchos detalles de la implementación.

Si no sabe acerca de algún recurso, aquí están algunas de mis preguntas.

  • ¿Qué es realmente una arena? En el código para la variable ar_ptr de la estructura heap_info hay un comentario que dice ''arena para esta pila'', por lo que una arena no puede ser una pila (como se dice en todas partes).

  • ¿Por qué en la estructura heap_info no hay un puntero siguiente y hay un puntero anterior ? ¿Es por main_arena ? ¿Y qué es main_arena ?

  • ¿Cada estructura heap_info puede tener más de una arena (apuntando a diferentes estructuras malloc_state )?

  • ¿Cuándo se crean las arenas de noticias y qué código lo maneja? He leído que las nuevas arenas se crean cuando una arena solicitada para almacenar datos está bloqueada (porque el proceso o una secuencia de proceso está funcionando con ella) y también he leído que cada secuencia de proceso tiene una arena diferente. Lo importante aquí es si sabes qué código maneja estas situaciones .

  • Tampoco entiendo cuando la gente dice que todas las operaciones de memoria nacen de la parte superior o la parte más salvaje. ¿Sabes dónde puedo encontrar este código?

Por cierto, no quiero profundizar con detalles mutex.

Estoy revisando la implementación de ptmalloc en glibc 2.12.1. Me gustaría hacer algunos diagramas sobre la estructura general de todo, ¡así que necesito entender estas cosas!

Gracias.


Un montón está básicamente dividido en muchas regiones pequeñas que atienden independientemente uno o más objetos asignados. Una de esas regiones podría llamarse arena o zona. Principalmente un montón es una colección de arenas que atienden objetos con el requisito de que una arena pueda ser desasignada en una sola operación. Para hacer esto posible, se asigna una arena completa como un único rango contiguo de direcciones de memoria.

La diferencia entre arena o zona es algo más que gris. No estoy seguro de Linux, pero un ejemplo es una familia de procesadores de red multinúcleo en el mundo real de las redes Cavium llamada Octeon. Lo que trata la memoria asignada como arena o zona, con la diferencia de que esa zona puede asignar objetos de igual tamaño fijo, mientras que arena puede tener objetos de diferentes tamaños. Esto naturalmente daría lugar a la fragmentación en caso de arena. Pero no puedo confirmar si ese es el caso de Linux también.

Gestión de memoria basada en la región