KasperskyOS Community Edition 1.1

KnVmAllocate()

Функция объявлена в файле coresrv/vmm/vmm_api.h.

void *KnVmAllocate(void *addr, rtl_size_t size, int flags);

Функция резервирует диапазон физических страниц, задаваемый параметрами addr и size. Если указан флаг VMM_FLAG_COMMIT, функция резервирует и передает страницы за один вызов.

Параметры:

  • addr – странично-выровненный базовый физический адрес; если задать addr равным 0, система сама выберет свободный участок физической памяти;
  • size – размер участка памяти в байтах (должен быть кратен размеру страницы);
  • flags – флаги аллокации.

Функция возвращает базовый виртуальный адрес зарезервированного участка. Если зарезервировать участок памяти невозможно, функция возвращает RTL_NULL.

Флаги аллокации

В параметре flags можно использовать следующие флаги (vmm/flags.h):

  • VMM_FLAG_RESERVE – обязательный флаг;
  • VMM_FLAG_COMMIT – позволяет за один вызов KnVmAllocate() резервировать и передать страницы памяти в "ленивом" режиме;
  • VMM_FLAG_LOCKED – используется совместно с VMM_FLAG_COMMIT; позволяет сразу передать физические страницы памяти вместо "ленивой" передачи;
  • VMM_FLAG_WRITE_BACK, VMM_FLAG_WRITE_THROUGH, VMM_FLAG_WRITE_COMBINE, VMM_FLAG_CACHE_DISABLE и VMM_FLAG_CACHE_MASK – управляют кэшированием страниц памяти;
  • VMM_FLAG_READ, VMM_FLAG_WRITE, VMM_FLAG_EXECUTE и VMM_FLAG_RWX_MASK – атрибуты защиты памяти;
  • VMM_FLAG_LOW_GUARD и VMM_FLAG_HIGH_GUARD – добавление защитной страницы перед и после выделенной памяти соответственно;
  • VMM_FLAG_GROW_DOWN – определение направления доступа к памяти (от старших адресов к младшим).

Допустимые комбинации атрибутов защиты памяти:

  • VMM_FLAG_READ – разрешено чтение содержимого страницы;
  • VMM_FLAG_READ | VMM_FLAG_WRITE – разрешено чтение и изменение содержимого страницы;
  • VMM_FLAG_READ | VMM_FLAG_EXECUTE – разрешено чтение и выполнение содержимого страницы;
  • VMM_FLAG_RWX_MASK или VMM_FLAG_READ | VMM_FLAG_WRITE | VMM_FLAG_EXECUTE – полный доступ к содержимому страницы (эти записи эквивалентны).

Пример

coredump->base = KnVmAllocate(RTL_NULL, vmaSize,

VMM_FLAG_READ | VMM_FLAG_RESERVE |

VMM_FLAG_WRITE | VMM_FLAG_COMMIT |

VMM_FLAG_LOCKED);

При необходимости можно изменить заданные атрибуты защиты участка памяти с помощью функции KnVmProtect().