Состояния памяти
Каждая страница виртуальной памяти может быть свободна (free), зарезервирована (reserved) или передана (committed).
Переход из свободного состояния в зарезервированное называется резервированием (аллокацией). Предварительное резервирование памяти (без передачи физических страниц) позволяет приложению заранее разметить свое адресное пространство. Обратный переход из зарезервированного в свободное состояние называется освобождением памяти.
Назначение физической памяти для ранее зарезервированной страницы виртуальной памяти называется передачей памяти, а обратный переход из переданного состояния в зарезервированное – возвращением памяти.
Переходы между состояниями страницы памяти
В начало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()
.
KnVmCommit()
Функция объявлена в файле coresrv/vmm/vmm_api.h
.
Retcode KnVmCommit(void *addr, rtl_size_t size, int flags);
Функция передает диапазон физических страниц, задаваемый параметрами addr и size.
Все передаваемые страницы должны быть предварительно зарезервированы.
Параметры:
addr
– странично-выровненный базовый виртуальный адрес участка памяти;size
– размер участка памяти в байтах (должен быть кратен размеру страницы);flags
– параметр не используется (укажите флаг VMM_FLAG_LOCKED в значении параметра для обеспечения совместимости).
В случае успешной передачи страниц функция возвращает rcOk.
В началоKnVmDecommit()
Функция объявлена в файле coresrv/vmm/vmm_api.h
.
Retcode KnVmDecommit(void *addr, rtl_size_t size);
Функция освобождает диапазон страниц (переводит их в зарезервированное состояние).
Параметры:
addr
– странично-выровненный базовый виртуальный адрес участка памяти;size
– размер участка памяти в байтах (должен быть кратен размеру страницы).
В случае успешного освобождения страниц функция возвращает rcOk.
В началоKnVmProtect()
Функция объявлена в файле coresrv/vmm/vmm_api.h
.
Retcode KnVmProtect(void *addr, rtl_size_t size, int newFlags);
Функция изменяет атрибуты защиты зарезервированных или переданных страниц памяти.
Параметры:
addr
– странично-выровненный базовый виртуальный адрес участка памяти;size
– размер участка памяти в байтах (должен быть кратен размеру страницы);newFlags
– новые атрибуты защиты.
В случае успешного изменения атрибутов защиты функция возвращает rcOk.
Допустимые комбинации атрибутов защиты памяти:
- 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 – полный доступ к содержимому страницы (эти записи эквивалентны).
KnVmUnmap()
Функция объявлена в файле coresrv/vmm/vmm_api.h
.
Retcode KnVmUnmap(void *addr, rtl_size_t size);
Функция освобождает участок памяти.
Параметры:
addr
– странично-выровненный адрес участка памяти;size
– размер участка памяти.
В случае успешного освобождения страниц функция возвращает rcOk.
В начало