Q3 Обычный способ управления кучами — через связанный список. В простейшем случае функция malloc сохраняет указатель на первый блок свободного пространства в куче, и каждый блок свободного пространства имеет заголовок, указывающий на следующий блок свободного пространства в куче. Таким образом, куча на самом деле самоопределяется в терминах знания того, что не занято (и, следовательно, того, что занято); это минимизирует объем дополнительной оперативной памяти, необходимой для управления кучей.
Когда требуется новое пространство с помощью вызова malloc, достаточно большой блок свободного пространства находится путем обхода связанного списка. Этот найденный блок свободного пространства передается вызывающей программе malloc (с небольшим скрытым заголовком), и при необходимости в связанный список вставляется меньший блок свободного пространства с любым остаточным пространством между исходным блоком свободного пространства и объемом памяти, Запрошен вызов malloc.
Когда блок кучи освобождается приложением, его блок просто форматируется с заголовком связанного списка и добавляется в связанный список, обычно с некоторой дополнительной логикой для объединения последовательных блоков свободного пространства в один больший блок свободного пространства.
Отладочные версии malloc обычно делают больше, в том числе сохраняют связанные списки выделенных областей, «защитные зоны» вокруг выделенных областей кучи, чтобы помочь обнаружить переполнение памяти и т. д. полезного пространства для приложений), но чрезвычайно полезны при отладке.
Q2 Указатель NULL фактически представляет собой просто ноль, который при использовании пытается получить доступ к памяти, начиная с местоположения 0 ОЗУ, которое почти всегда является зарезервированной памятью ОС. Это является причиной значительного количества прерываний нарушения памяти, вызванных отсутствием у программиста проверки ошибок для возврата NULL из функций, которые выделяют память).
Поскольку доступ к ячейке памяти 0 приложением, отличным от ОС, никогда не бывает желаемым, большинство аппаратных средств прерывает любые попытки доступа к ячейке 0 со стороны программного обеспечения, отличного от ОС. Даже при сопоставлении страниц, при котором пространство памяти приложений (включая ячейку 0) никогда не отображается в реальную ячейку ОЗУ 0, поскольку NULL всегда равен нулю, большинство процессоров все равно прекратят попытки доступа к ячейке 0, предполагая, что это доступ через указатель, содержащий NULL.
Учитывая ваш RISC-процессор, вам нужно будет прочитать его документацию, чтобы увидеть, как он обрабатывает попытки доступа к ячейке памяти 0.
Q1 Существует много способов использования выделенной памяти в языке высокого уровня, в основном с помощью указателей, строк и массивов.
С точки зрения языка ассемблера и самого оборудования, выделенный адрес блока кучи просто помещается в регистр, который используется для косвенного обращения к памяти. Вам нужно будет увидеть, как это обрабатывается в процессоре RISC. Однако, если вы используете C или C++ или подобный язык более высокого уровня, вам не нужно беспокоиться о регистрах; компилятор обрабатывает все это.
25.03.2015