Подготовка сегментов ELF-образа к загрузке в память процесса
Сведения о функциях API приведены в таблице ниже.
Использование API
Буферы MDL используются не только для создания разделяемой памяти, но и для загрузки сегментов ELF-образа в память нового процесса. (Загрузку сегментов ELF-образа выполняет, например, инициализирующая программа Einit
.)
Функции KnVmSegInitFromVm()
и KnVmSegInitFromBuf()
создают буфер MDL и помещают в него сегмент ELF-образа для последующей загрузки этого сегмента в память нового процесса.
Удаление буферов MDL, содержащих сегменты ELF-образа
Чтобы буферы MDL, содержащие сегменты ELF-образа, были удалены, необходимо, чтобы завершился новый процесс, на память которого эти буферы MDL отображены. А также до или после завершения этого процесса нужно выполнить следующие шаги:
- Освободить регионы виртуальной памяти, на которые отображены буферы MDL, в процессе, который создал эти буферы MDL.
Этот шаг нужно выполнить только для тех буферов MDL, которые созданы с использованием функции KnVmSegInitFromVm()
.
Чтобы выполнить этот шаг, нужно использовать функцию KnVmUnmap()
.
- Закрыть дескрипторы буферов MDL в процессе, который создал эти буферы MDL.
Чтобы выполнить этот шаг, нужно использовать функцию KnHandleClose()
, которая объявлена в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h
из состава KasperskyOS SDK.
Сведения о функциях API
Функции vmm_api.h
Функция
|
Сведения о функции
|
KnVmSegInitFromVm()
|
Назначение
Создает буфер MDL из физической памяти, отображенной на заданный регион виртуальной памяти, который содержит сегмент ELF-образа.
Параметры
- [out]
seg – указатель на структуру, описывающую сегмент ELF-образа. Эта структура содержит дескриптор буфера MDL (поле h ) и используется для загрузки сегмента ELF-образа в память процесса. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK. - [in,optional]
loadAddr – странично выровненный адрес загрузки сегмента ELF-образа в память процесса или 0 , чтобы этот адрес был выбран автоматически. - [in]
addr – странично выровненный базовый адрес региона виртуальной памяти. - [in]
size – размер региона виртуальной памяти в байтах. Должен быть кратен размеру страницы памяти. - [in]
flags – флаги, задающие права доступа к буферу MDL. Тип параметра и флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK.
Возвращаемые значения
В случае успеха возвращает rcOk , иначе возвращает код ошибки.
Дополнительные сведения
Функцию можно использовать, если заданный регион виртуальной памяти выделен с фиксацией.
В параметре flags можно указать следующие комбинации флагов:
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 – доступ на чтение, запись и исполнение.
|
KnVmSegInitFromBuf()
|
Назначение
Создает буфер MDL и копирует в него сегмент ELF-образа из заданного буфера.
Параметры
- [out]
seg – указатель на структуру, описывающую сегмент ELF-образа. Эта структура содержит дескриптор буфера MDL (поле h ) и используется для загрузки сегмента ELF-образа в память процесса. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK. - [in,optional]
loadAddr – странично выровненный адрес загрузки сегмента ELF-образа в память процесса или 0 , чтобы этот адрес был выбран автоматически. - [in]
offset – смещение в буфере MDL, с которого нужно начать запись сегмента ELF-образа, в байтах. - [in]
size – размер сегмента ELF-образа в байтах. Должен быть кратен размеру страницы памяти. - [in]
flags – флаги, задающие права доступа к буферу MDL. Тип параметра и флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK. - [in]
fileOffset – смещение сегмента в ELF-образе в байтах. - [in]
buildId – указатель на идентификатор сборки. Компоновщик записывает этот идентификатор ELF-образ. - [in]
buildIdSize – размер идентификатора сборки в байтах. - [in]
buf – указатель на буфер, содержащий сегмент ELF-образа. - [in]
bufSize – размер буфера, содержащего сегмент ELF-образа, в байтах.
Возвращаемые значения
В случае успеха возвращает rcOk , иначе возвращает код ошибки.
Дополнительные сведения
В параметре flags можно указать следующие комбинации флагов:
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 – доступ на чтение, запись и исполнение.
|
В начало
[Topic libkos_vmm_api_elf]