malloc во встроенной системе без операционной системы - PullRequest
9 голосов
/ 18 февраля 2012

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 18 февраля 2012

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

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

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

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

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

5 голосов
/ 18 февраля 2012

Единственный реальный ответ: «Куда бы ни поместила ваша реализация компилятора / библиотеки».

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

4 голосов
/ 18 февраля 2012

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

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

...