Подготовка сегментов ELF-образа к загрузке в память процесса
Сведения о функциях API приведены в таблице ниже.
Использование API
Буферы MDL используются не только для создания разделяемой памяти, но и для загрузки сегментов ELF-образа в память нового процесса. (Загрузку сегментов ELF-образа выполняет, например, инициализирующая программа Einit.)
Функции KnVmSegInitFromVm() и KnVmSegInitFromBuf() создают буфер 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 – доступ на чтение, запись и исполнение.
Идентификатор статьи: libkos_vmm_api_elf, Последнее изменение: 27 янв. 2025 г.