Malloc en un sistema embebido sin sistema operativo.

Esta consulta se refiere a la asignación de memoria utilizando malloc .

En general, lo que decimos es que malloc asigna memoria desde el montón.

Ahora digamos que tengo un sistema integrado simple (No hay sistema operativo), tengo un progtwig normal cargado donde hago malloc en mi progtwig.

En este caso, ¿desde dónde se asigna la memoria?

malloc () es una función que generalmente es implementada por la biblioteca runtime. Tiene razón, si está ejecutando un sistema operativo, a veces malloc (pero no siempre) activará una llamada al sistema que hace que el sistema operativo asigne algo de memoria al espacio de direcciones de su progtwig.

Si su progtwig se ejecuta sin un sistema operativo, entonces puede pensar que su progtwig es el sistema operativo. Usted tiene acceso a todas las direcciones, lo que significa que solo puede asignar una dirección a un puntero, y luego desviar la referencia de ese puntero para leer / escribir.

Por supuesto, debe asegurarse de que no otras partes de su progtwig utilicen la misma memoria, por lo que debe escribir su propio administrador de memoria:

En pocas palabras, puede reservar un rango de direcciones que su “administrador de memoria” utiliza para almacenar los rangos de direcciones que ya están en uso (las estructuras de datos almacenadas allí pueden ser tan fáciles como una lista vinculada o mucho más complejas) ). Luego escribirá una función y la llamará, por ejemplo, malloc (), que forma la parte funcional de su administrador de memoria. Busca en la estructura de datos mencionada para encontrar una dirección de rangos que sea tan larga como especifique el argumento y devuelva un puntero a la misma.

Ahora, si cada función en su progtwig llama a malloc () en lugar de escribir aleatoriamente en direcciones personalizadas, ha hecho el primer paso. Puede escribir una función libre () que buscará el puntero que se proporciona en la estructura de datos mencionada, y adapta la estructura de datos (en la lista de enlaces naive fusionaría dos enlaces).

La única respuesta real es: “Dondequiera que lo ponga tu comstackdor / biblioteca de implementación”.

En el sistema integrado que uso, no hay montón, ya que no hemos escrito uno.

Desde el montón como dices. La diferencia es que el montón no es proporcionado por el sistema operativo. El script de enlace de su aplicación incluirá sin duda una asignación para el montón. La biblioteca de tiempo de ejecución se encargará de esto.

En el caso de la biblioteca Newlib C que se usa a menudo en sistemas integrados basados ​​en GCC que no ejecutan un sistema operativo o al menos no ejecutan Linux, la biblioteca tiene una función syscall de código auxiliar llamada sbrk (). Es responsabilidad del desarrollador implementar sbrk (), que debe proporcionar más memoria al administrador del montón a petición. Por lo general, simplemente incrementa un puntero y devuelve un puntero al inicio del nuevo bloque, luego el administrador del montón de la biblioteca administra y mantiene el nuevo bloque que puede o no ser contiguo a los bloques anteriores. El enlace anterior incluye una implementación de ejemplo.