malloc() - это функция, которая обычно реализуется библиотекой времени выполнения. Вы правы, если вы работаете поверх операционной системы, тогда malloc иногда (но не каждый раз) запускает системный вызов, который заставляет ОС отображать некоторую память в адресное пространство вашей программы.
Если ваша программа работает без операционной системы, вы можете представить свою программу как , являющейся операционной системой. У вас есть доступ ко всем адресам, то есть вы можете просто назначить адрес указателю, а затем удалить ссылку на этот указатель на чтение/запись.
Конечно, вы должны убедиться, что не другие части вашей программы просто использовать ту же память, так что вы написать свой собственные памяти-менеджер:
Проще говоря вы можете диапазон адресов зарезервированным который ваш «менеджер памяти» использует для хранения, какие диапазоны адресов уже используются (хранящиеся там хранилища данных могут быть такими же простыми, как связанный список или намного сложнее). Затем вы напишете функцию и вызовите ее, например. malloc(), который образует функциональную часть вашего менеджера памяти. Он рассматривает указанную структуру данных, чтобы найти адрес диапазонов, который до тех пор, пока аргумент указывает и возвращает указатель на него.
Теперь, если каждая функция в вашей программе вызывает ваш malloc() вместо случайной записи в пользовательские адреса, вы сделали первый шаг. Вы можете написать free() -функция, которая будет искать указатель, указанный в указанной структуре данных, и адаптирует структуру данных (в наивном связанном списке она объединяет две ссылки).
Не ответил на реальный вопрос: где идет динамически выделенная память. Это идет в кучу. Где куча? Он находится в диапазоне адресов, настроенном сценарием компоновщика. –
@fanl Ваш вопрос отличается от вопроса Лео Месси. Вы это ответили? Пожалуйста, отмените. Если вы откроете свой вопрос, я постараюсь ответить на него. –