2012-02-17 5 views
8

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

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

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

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

ответ

8

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

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

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

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

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

+1

Не ответил на реальный вопрос: где идет динамически выделенная память. Это идет в кучу. Где куча? Он находится в диапазоне адресов, настроенном сценарием компоновщика. –

+0

@fanl Ваш вопрос отличается от вопроса Лео Месси. Вы это ответили? Пожалуйста, отмените. Если вы откроете свой вопрос, я постараюсь ответить на него. –

5

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

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

+0

+1 и когда вы включаете оптимизацию, компилятор может выбрать стек, если он может определить, что распределение является локальным (например, для функции). – justin

+0

Хорошо, правда, но не очень полезно. –

4

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

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

Смежные вопросы