es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En memoria, ¿deben tener la misma dirección la base de la pila y la base del montón?

Estoy usando un microcontrolador tm4c123gh6pm con este script de enlace. Al ir al final, veo:

...
...
.bss (NOLOAD):
{
    _bss = .;
    <em>(.bss</em>)
    *(COMMON)
    _ebss = .;
} > SRAM

<p><em>heap</em>bottom = ALIGN(8);
<em>heap</em>top = ORIGIN(SRAM) + LENGTH(SRAM) - <em>stack</em>size;
<em>stack</em>bottom = ALIGN(8);
<em>stack</em>top = ORIGIN(SRAM) + LENGTH(SRAM);
<code>
Parece que los fondos del heap y de la pila son iguales. Lo he comprobado dos veces:
</code>
> arm-none-eabi-objdump -t mcu.axf | grep -E "(heap|stack)"
20008000 g       .bss   00000000 <em>stack</em>top
20007000 g       .bss   00000000 <em>heap</em>top
00001000 g       <em>ABS</em>  00000000 <em>stack</em>size
20000558 g       .bss   00000000 <em>heap</em>bottom
20000558 g       .bss   00000000 <em>stack</em>bottom

¿Es esto correcto? Según veo, la pila podría sobrescribir el montón, ¿es este el caso?

Si cargo este firmware, ‘funciona’ (al menos por ahora), pero espero que falle si la pila se vuelve lo suficientemente grande y uso memoria dinámica. Sin embargo, he observado que nadie en mi código ni en el script de inicio utiliza los símbolos de la pila y la base, por lo que tal vez incluso si uso la pila y el montón, todo seguirá funcionando. (A menos que la pila y el montón sean símbolos especiales utilizados por alguien que no puedo ver, ¿es este el caso?)

Quiero cambiar la última parte por:

_heap_bottom = ALIGN(8);
_heap_top = ORIGIN(SRAM) + LENGTH(SRAM) - _stack_size;
_stack_bottom = ORIGIN(SRAM) + LENGTH(SRAM) - _stack_size + 4; // or _heap_top + 4
_stack_top = ORIGIN(SRAM) + LENGTH(SRAM);

¿Es lo anterior correcto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El script de enlazador actual asigna tanto la heap como la stack a la misma dirección de memoria, lo cual puede causar un conflicto potencial entre las dos regiones de memoria. Es posible que la stack sobrescriba la heap si crece lo suficiente.

    Cambiar la base de la stack a _heap_top + 4 o _stack_top - _stack_size + 4 garantizaría que haya una separación de al menos 4 bytes entre las dos regiones de memoria, lo cual debería prevenir cualquier conflicto entre ellas.

    Siempre es recomendable tener una separación clara entre las regiones de memoria de la heap y la stack para evitar este tipo de conflictos. También es importante asegurarse de que el tamaño de la stack esté configurado correctamente para evitar problemas de desbordamiento de la stack.

Comments are closed.