Управление памятью

Объект CMemory.

Выделяемые блоки памяти делятся на «большие» (далее б-блок) и «малые» (далее м-блок). Б-блок — это блок размером более PAGE_SIZE. М-блок, соответственно, блок размером менее PAGE_SIZE.

Б-блоки всегда выделяются на границе страницы. То есть при запросе размер округляется до PAGE_SIZE (4кБ) вверх. При этом для б-блоков выделяется отдельные страницы, а первая (нулевая) используется для управления, что позволит её защищать на уровне страниц. М-блоки выделяются в рамках буфера задачи, то есть в б-блоке.

Конструктор CMemory проходит по карте памяти, предоставляемой UEFI и создаёт блоки свободной памяти, игнорируя всё занятое. Алгоритм довольно прямолинеен и в особом описании не нуждается.

Функция CMemory::allocate является основной вместе с CMemory::deallocate. Выделяется б-блок в списке свободной памяти. Тип блока определяется по запрашиваемому размеру. Вызываются из new и delete соответственно. М-блоки выделяются из буфера задачи.