malloc во встроенной системе без операционной системы

этот запрос касается выделения памяти с помощью malloc.

вообще то, что мы говорим malloc выделяет память из кучи.

Теперь скажите, что у меня есть простая встроенная система (без операционной системы), у меня есть нормальная программа, загруженная там, где я делаю malloc в моей программе.

в этом случае откуда выделяется память ?

3 ответов


malloc ()-это функция, которая обычно реализуется библиотекой времени выполнения. Вы правы, если вы работаете поверх операционной системы, то malloc иногда (но не каждый раз) запускает системный вызов, который заставляет ОС сопоставлять некоторую память в адресное пространство вашей программы.

Если ваша программа работает без операционной системы, то вы можете думать о вашей программе как будучи операционной системы. У вас есть доступ ко всем адресам, то есть вы можете просто назначьте адрес указателю, затем снимите ссылку с этого указателя на чтение / запись.

конечно, вы должны убедиться, что не другие части вашей программы просто используют ту же память, поэтому вы пишете свой собственный memory-manager:

проще говоря, вы можете выделить ряд адресов, которые ваш "memory-manager" использует для хранения, какие диапазоны адресов уже используются (структуры данных, хранящиеся там, могут быть такими же легкими, как связанный список или гораздо более сложными). Затем вы напишете функцию и назовете ее, например,malloc () который формирует функциональную часть вашего менеджера памяти. Похоже в упомянутых структура данных найти адрес диапазонов, как аргумент и возвращает указатель на него.

теперь, если каждая функция в вашей программе вызывает ваш malloc () вместо случайной записи в пользовательские адреса, вы сделали первый шаг. Вы можете написать free ()-функция, которая будет искать указатель приведен в упомянутой структуре данных и адаптирует структуру данных (в наивном связанном списке он объединит две ссылки).


единственным реальным ответом является "везде, где ваш компилятор / библиотека-реализация помещает его".

во встроенной системе, которую я использую, нет кучи, так как мы ее не написали.


из кучи, как вы говорите. Разница в том, что куча не предоставляется ОС. Сценарий компоновщика вашего приложения, несомненно, будет включать выделение для кучи. Библиотека времени выполнения будет управлять этим.

в случае файла библиотека C часто используется в встроенных системах на основе GCC, не работающих под управлением ОС или, по крайней мере, не работающих под управлением Linux, библиотека имеет заглушку syscall функция называется sbrk (). Это respnsibility разработчика к реализуйте sbrk (), который должен предоставить больше памяти диспетчеру кучи по запросу. Обычно он просто увеличивает указатель и возвращает указатель на начало нового блока, после чего менеджер кучи библиотеки управляет и поддерживает новый блок, который может быть или не быть смежным с предыдущими блоками. Предыдущая ссылка включает пример реализации.