KasperskyOS Community Edition 1.3

Подготовка сегментов ELF-образа к загрузке в память процесса

Сведения о функциях API приведены в таблице ниже.

Использование API

Буферы MDL используются не только для создания разделяемой памяти, но и для загрузки сегментов ELF-образа в память нового процесса. (Загрузку сегментов ELF-образа выполняет, например, инициализирующая программа Einit.)

Функции KnVmSegInitFromVm() и KnVmSegInitFromBuf() создают буфер MDL и помещают в него сегмент ELF-образа для последующей загрузки этого сегмента в память нового процесса.

Удаление буферов MDL, содержащих сегменты ELF-образа

Чтобы буферы MDL, содержащие сегменты ELF-образа, были удалены, необходимо, чтобы завершился новый процесс, на память которого эти буферы MDL отображены. А также до или после завершения этого процесса нужно выполнить следующие шаги:

  1. Освободить регионы виртуальной памяти, на которые отображены буферы MDL, в процессе, который создал эти буферы MDL.

    Этот шаг нужно выполнить только для тех буферов MDL, которые созданы с использованием функции KnVmSegInitFromVm().

    Чтобы выполнить этот шаг, нужно использовать функцию KnVmUnmap().

  2. Закрыть дескрипторы буферов 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 – доступ на чтение, запись и исполнение.