KasperskyOS Community Edition 1.3

Управление процессами (высокоуровневый API task.h)

API определен в заголовочном файле sysroot-*-kos/include/kos/task.h из состава KasperskyOS SDK.

API позволяет создавать, запускать и завершать процессы, а также статически создавать IPC-каналы и передавать дескрипторы.

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

Библиотека libkos также предоставляет низкоуровневый API для управления процессами, который определен в заголовочном файле sysroot-*-kos/include/coresrv/task/task_api.h из состава KasperskyOS SDK. Низкоуровневый API следует использовать, если только недостаточно возможностей высокоуровневого API.

Создание процессов

Чтобы создать процесс, нужно вызвать одну из следующих функций:

  • KosTaskInitEx();
  • KosTaskInit();
  • KosTaskInitFromSegEx();
  • KosTaskInitFromSeg();
  • KosTaskLaunch().

Через входной параметр params эти функции принимают параметры создаваемого процесса в виде структуры, содержащей следующие поля:

  • eiid – указатель на имя класса процесса.
  • endpointsCount – число предоставляемых служб.

    Поле может иметь нулевое значение, если процесс не предоставляет службы.

  • endpoints – указатель на массив структур, содержащих характеристики предоставляемых служб (имена и идентификаторы служб, имена интерфейсов).

    Тип структуры определен в заголовочном файле sysroot-*-kos/include/services/handle/if_connection.h из состава KasperskyOS SDK.

    Поле может иметь значение RTL_NULL, если процесс не предоставляет службы.

  • args – указатель на массив параметров запуска программы.

    Последним элементом массива должно быть значение RTL_NULL.

  • envs – указатель на массив переменных окружения программы.

    Последним элементом массива должно быть значение RTL_NULL.

  • flags – флаги:
  • componentTree – указатель на структуру, содержащую сведения из формальной спецификации компонента решения.

    Тип структуры определен в заголовочном файле sysroot-*-kos/include/nk/types.h из состава KasperskyOS SDK. Эта структура является элементом автоматически генерируемого транспортного кода.

    Если поле имеет значение, отличное от RTL_NULL, то значения в полях eiid, endpointsCount и endpoints будут проигнорированы, а имя класса процесса и параметры предоставляемых служб (включая параметры служб вложенных компонентов) будут взяты из формальной спецификации компонента решения.

Функции KosTaskInitEx(), KosTaskInit(), KosTaskInitFromSegEx() и KosTaskInitFromSeg() через выходной параметр outTask передают указатель на адрес объекта, описывающего дочерний процесс. Этот объект представляет собой структуру, которая создается в памяти как родительского, так и дочернего процесса. Разработчику решения на базе KasperskyOS не требуется выполнять операции с полями этой структуры, но указатель на нее нужно использовать в качестве идентификатора процесса при вызове функций API. Дочерний процесс может получить адрес описывающего его объекта вызовом функции KosTaskGetSelf().

Если для доступа к службам, предоставляемым серверным процессом, используются статически созданные IPC-каналы, то объект, описывающий этот серверный процесс, должен быть связан со структурами, содержащими сведения о службах из формальной спецификации компонента решения. Это необходимо, чтобы при создании статического IPC-канала клиентские процессы получили сведения о службах, предоставляемых серверным процессом. Чтобы связать объект, описывающий дочерний серверный процесс, со структурами, содержащими сведения о службах из формальной спецификации компонента решения, нужно передать эти сведения через поле componentTree параметра params при вызове функций KosTaskInit*() или функции KosTaskLaunch(). Серверный процесс, который уже запущен, может связать описывающий его объект со структурами, содержащими сведения о службах из формальной спецификации компонента решения, вызовом функции KosTaskSetComponentTree(). Это требуется, если у запущенного серверного процесса нет родительского процесса.

При вызове функции KosTaskInitEx(), KosTaskInit() или KosTaskLaunch() ELF-образ из заданного исполняемого файла в ROMFS загружается в память создаваемого процесса. Если ELF-образ содержит таблицу символов .symtab и таблицу строк .strtab, то они загружаются в память процесса. Используя эти таблицы, ядро получает имена функций для формирования данных обратной трассировки стека (сведений о стеке вызовов).

Чтобы получить сведения об ELF-образе, загруженном в память процесса, нужно вызвать функцию KosTaskGetElfSegs().

При вызове функции KosTaskInit() или KosTaskLaunch() в качестве имени процесса и имени исполняемого файла используется одно из следующих значений:

  • Значение поля eiid, если значение поля componentTree равно RTL_NULL.
  • Имя класса процессов из формальной спецификации компонента решения, если значение поля componentTree отлично от RTL_NULL.

Таким же образом эти значения применяются в качестве имени процесса и/или имени исполняемого файла, если вызвать функцию KosTaskInitEx() или KosTaskInitFromSegEx() со значением RTL_NULL в параметре name и/или параметре path. И аналогично эти значения применяются в качестве имени процесса, если вызвать функцию KosTaskInitFromSeg() со значением RTL_NULL в параметре name.

Для использования функций KosTaskInitFromSegEx() и KosTaskInitFromSeg() необходимо, чтобы заранее были созданы буферы MDL, которые содержат сегменты ELF-образа. Сегменты ELF-образа для загрузки в память создаваемого процесса нужно задать через параметр segs.

Через параметры entry и relocBase функции KosTaskInitFromSegEx() необходимо задать точку входа в программу и смещение загрузки ELF-образа соответственно. Точка входа в программу представляет собой сумму адреса, указанного в поле e_entry заголовка ELF-образа, и смещения загрузки ELF-образа. Генерацию случайного смещения загрузки ELF-образа и расчет адреса точки входа в программу с учетом этого смещения выполняет функция KnElfCreateVmSegEx(), объявленная в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK. (Смещение загрузки ELF-образа должно быть случайным значением с целью поддержки ASLR. Об ASLR см. "Управление процессами (низкоуровневый API task_api.h)".)

С помощью функции KosTaskInitFromSegEx() в память создаваемого процесса можно загрузить таблицу символов .symtab и таблицу строк .strtab, а также заголовок ELF-образа. Загрузку заголовка ELF-образа нужно выполнить, если требуется, чтобы данные из него были доступны в создаваемом процессе.

Данные, передаваемые функции KosTaskInitFromSegEx() через параметры segs, entry, relocBase и параметры, связанные с загрузкой таблицы символов .symtab и таблицы строк .strtab, подготавливаются функцией KnElfCreateVmSegEx(), объявленной в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK.

Функция KosTaskInitFromSeg() является упрощенной версией функции KosTaskInitFromSegEx() и не позволяет загружать в память процесса таблицу символов .symtab, таблицу строк .strtab и заголовок ELF-образа, а также не позволяет задавать смещение загрузки ELF-образа (устанавливает нулевое смещение).

Функция KosTaskLaunch() создает и сразу запускает процесс без возможности статического создания IPC-каналов.

Статическое создание IPC-каналов

Перед запуском процессов можно создать IPC-каналы между ними. Между одним клиентским и одним серверным процессом можно создать несколько IPC-каналов с разными именами. Между одним серверным и несколькими клиентскими процессами можно создать IPC-каналы с одним именем.

Чтобы создать IPC-канал с именем, соответствующим имени класса серверного процесса, нужно вызвать функцию KosTaskConnect().

Чтобы создать IPC-канал с заданным именем, нужно вызывать функцию KosTaskConnectToService().

Чтобы использовать созданный IPC-канал, на стороне клиентского процесса нужно получить клиентский IPC-дескриптор вызовом функции ServiceLocatorConnect(), а на стороне серверного процесса нужно получить серверный IPC-дескриптор вызовом функции ServiceLocatorRegister(). Через параметр channelName эти функции принимают имя IPC-канала. (Функции ServiceLocatorConnect() и ServiceLocatorRegister() объявлены в заголовочном файле sysroot-*-kos/include/coresrv/sl/sl_api.h из состава KasperskyOS SDK.)

Передача дескрипторов

Родительский процесс может передать один или несколько дескрипторов дочернему процессу, который еще не запущен. (Общие сведения о передаче дескрипторов приведены в разделе "Передача дескрипторов".)

Чтобы передать дескриптор дочернему процессу, нужно вызвать функцию KosTaskTransferResource(), указав среди прочего дескриптор объекта контекста передачи ресурса, а также маску прав и условное имя потомка передаваемого дескриптора.

Чтобы найти потомка дескриптора, переданного родительским процессом, нужно вызвать функцию KosTaskLookupResource(), указав условное имя потомка дескриптора, которое было задано родительским процессом при вызове функции KosTaskTransferResource().

Запуск процессов

Чтобы создать и сразу запустить процесс без статического создания IPC-каналов, нужно вызвать функцию KosTaskLaunch().

Чтобы запустить уже созданный процесс, перед запуском которого могут быть созданы требуемые этому процессу IPC-каналы, нужно вызвать функцию KosTaskRunEx() или KosTaskRun().

Через параметр fsBackend функции KosTaskRunEx() нужно задать, как осуществляется поддержка файловой системы ROMFS для запускаемого процесса: ядром или системной программой fsusr. Использование программы fsusr обеспечивает размещение образа ROMFS в пользовательском пространстве. В пользовательском пространстве можно разместить образ ROMFS существенно большего размера, чем в пространстве ядра.

Чтобы можно было использовать файловую систему ROMFS, размещенную в пользовательском пространстве, нужно включить программу fsusr в решение на базе KasperskyOS и создать IPC-канал с именем kl.core.FSUsr от процесса, которому требуется использовать эту файловую систему, к процессу с именем kl.core.FSUsr. (Клиентская часть программы fsusr входит в библиотеку libkos.) Чтобы проверить, поставляется ли программа fsusr в составе KasperskyOS SDK, нужно убедиться в наличии исполняемого файла sysroot-*-kos/bin/fsusr.

Чтобы задать, как осуществляется поддержка файловой системы в уже запущенном процессе, нужно вызывать функцию KosTaskSetSelfFSBackend(). Эта функция может быть использована следующим образом. Родительский процесс задает, что для него файловую систему ROMFS поддерживает программа fsusr, и вызовом функции KnFsChange() загружает требуемый образ ROMFS. (Функция KnFsChange() объявлена в заголовочном файле sysroot-*-kos/include/coresrv/fs/fs_api.h из состава KasperskyOS SDK.) Затем родительский процесс выполняет запуск дочернего процесса вызовом функции KosTaskRunEx(), указав, что для дочернего процесса файловую систему ROMFS поддерживает программа fsusr. В результате дочерний процесс по умолчанию будет использовать образ ROMFS, размещенный в пользовательском пространстве родительским процессом.

Если родительскому процессу не требуется завершать дочерний процесс или ожидать его завершения, то после запуска дочернего процесса описывающий его объект нужно удалить, обнулив число ссылок на него с использованием функции KosTaskPut(). Функция KosTaskLaunch() вызывает функцию KosTaskPut() после запуска дочернего процесса.

Завершение процессов

API позволяет завершать и ожидать завершения дочерних процессов.

Чтобы завершить дочерний процесс, нужно вызвать функцию KosTaskStop() или KosTaskStopAndWait().

Чтобы ожидать, пока дочерний процесс завершится по собственной инициативе, нужно вызвать функцию KosTaskWait().

Чтобы объект ядра, который описывает дочерний процесс, был удален после завершения этого процесса, нужно до или после завершения дочернего процесса закрыть его дескриптор в родительском процессе. Дескриптор дочернего процесса закрывается при удалении в памяти родительского процесса объекта, описывающего дочерний процесс. Чтобы удалить объект, описывающий дочерний процесс, нужно обнулить число ссылок на этот объект, используя функцию KosTaskPut(). Функция KosTaskLaunch() вызывает функцию KosTaskPut() после запуска дочернего процесса.

Подробнее о завершении процессов см. "Управление процессами (низкоуровневый API task_api.h)".

Сведения о функциях API

Функции task.h

Функция

Сведения о функции

KosTaskInitEx()

Назначение

Создает процесс.

Параметры

  • [in] params – указатель на структуру, содержащую параметры процесса.
  • [in] name – указатель на имя процесса.
  • [in] path – указатель на имя исполняемого файла в ROMFS.
  • [out] outTask – указатель на адрес объекта, описывающего процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskInit()

Назначение

Создает процесс.

Параметры

  • [in] params – указатель на структуру, содержащую параметры процесса.
  • [out] outTask – указатель на адрес объекта, описывающего процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskInitFromSegEx()

Назначение

Создает процесс.

Параметры

  • [in] params – указатель на структуру, содержащую параметры процесса.
  • [in] name – указатель на имя процесса.
  • [in] path – указатель на имя исполняемого файла в ROMFS.
  • [in] count – число загружаемых сегментов ELF-образа.
  • [in] relocBase – смещение загрузки ELF-образа в байтах.
  • [in] entry – адрес точки входа в программу.
  • [in,out] segs – указатель на массив структур, описывающих сегменты ELF-образа. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK. Если задать поле loadAddr этой структуры равным 0, то адрес загрузки сегмента ELF-образа будет выбран автоматически и записан в поле loadAddr.
  • [in] symTabIndex – индекс сегмента ELF-образа, содержащего таблицу символов .symtab. Нумерация начинается с нуля.
  • [in] symTabSize – размер таблицы символов .symtab в байтах.
  • [in] strTabIndex – индекс сегмента ELF-образа, содержащего таблицу строк .strtab. Нумерация начинается с нуля.
  • [in] strTabSize – размер таблицы строк .strtab в байтах.
  • [in] elfHdrData – указатель на буфер, содержащий заголовок ELF-образа.
  • [in] elfHdrSize – размер заголовка ELF-образа в байтах.
  • [out] outTask – указатель на адрес объекта, описывающего процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskInitFromSeg()

Назначение

Создает процесс.

Параметры

  • [in] params – указатель на структуру, содержащую параметры процесса.
  • [in] name – указатель на имя процесса.
  • [in] count – число загружаемых сегментов ELF-образа.
  • [in] entry – адрес точки входа в программу.
  • [in,out] segs – указатель на массив структур, описывающих сегменты ELF-образа. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK. Если задать поле loadAddr этой структуры равным 0, то адрес загрузки сегмента ELF-образа будет выбран автоматически и записан в поле loadAddr.
  • [out] outTask – указатель на адрес объекта, описывающего процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskGetElfSegs()

Назначение

Позволяет получить сведения об ELF-образе, загруженном в память процесса.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [out] segsBuf – указатель на массив для сохранения структур, описывающих сегменты ELF-образа. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK.
  • [in] segsBufSize – размер буфера для сохранения массива структур, описывающих сегменты ELF-образа, в байтах.
  • [out] segsCount – указатель на число загруженных сегментов ELF-образа.
  • [out] symTabIndex – указатель на индекс сегмента ELF-образа, содержащего таблицу символов .symtab. Нумерация начинается с нуля.
  • [out] symTabSize – указатель на размер таблицы символов .symtab в байтах.
  • [out] strTabIndex – указатель на индекс сегмента ELF-образа, содержащего таблицу строк .strtab. Нумерация начинается с нуля.
  • [out] strTabSize – указатель на размер таблицы строк .strtab в байтах.
  • [out] hdrBuf – указатель на буфер для сохранения заголовка ELF-образа.
  • [in] hdrBufSize – размер буфера для сохранения заголовка ELF-образа в байтах.
  • [out] hdrSize – размер заголовка ELF-образа в байтах.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskConnect()

Назначение

Создает IPC-канал.

Параметры

  • [in] cl – указатель на объект, описывающий клиентский процесс.
  • [in] sr – указатель на объект, описывающий серверный процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskConnectToService()

Назначение

Создает IPC-канал с заданным именем.

Параметры

  • [in] cl – указатель на объект, описывающий клиентский процесс.
  • [in] sr – указатель на объект, описывающий серверный процесс.
  • [in] name – указатель на имя IPC-канала.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskSetArgs()

Назначение

Задает параметры запуска программы.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] args – указатель на массив параметров запуска программы. Последним элементом массива должно быть значение RTL_NULL.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Функция используется библиотекой libkos при создании процессов.

KosTaskGetArgsList()

Назначение

Позволяет получить параметры запуска программы.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [out] args – указатель на адрес массива параметров запуска программы или RTL_NULL, если этих параметров нет.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Чтобы удалить массив параметров запуска программы, нужно вызвать функцию KosTaskFreeArgsList().

KosTaskFreeArgsList()

Назначение

Удаляет массив параметров запуска программы, полученный вызовом KosTaskGetArgsList().

Параметры

  • [in] args – указатель на массив параметров запуска программы.

Возвращаемые значения

Нет.

KosTaskSetEnv()

Назначение

Задает переменные окружения программы.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] envs – указатель на массив переменных окружения программы. Последним элементом массива должно быть значение RTL_NULL.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Функция используется библиотекой libkos при создании процессов.

KosTaskGetEnvList()

Назначение

Позволяет получить переменные окружения программы.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [out] envs – указатель на адрес массива переменных окружения программы или RTL_NULL, если этих переменных нет.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

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

KosTaskFreeEnvList()

Назначение

Удаляет массив переменных окружения программы, полученный вызовом функции KosTaskGetEnvList().

Параметры

  • [in] envs – указатель на массив переменных окружения программы.

Возвращаемые значения

Нет.

KosTaskRunEx()

Назначение

Запускает процесс.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] fsBackend – параметр, который задает, как осуществляется поддержку файловой системы ROMFS для запускаемого процесса: ядром или системной программой.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskRun()

Назначение

Запускает процесс.

Параметры

  • [in] task – указатель на объект, описывающий процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskStop()

Назначение

Завершает процесс.

Параметры

  • [in] task – указатель на объект, описывающий процесс.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskStopAndWait()

Назначение

Завершает процесс и ожидает окончания завершения этого процесса.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] timeout – время ожидания в миллисекундах или INFINITE_TIMEOUT, чтобы задать неограниченное время ожидания.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskWait()

Назначение

Ожидает завершения процесса.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] timeout – время ожидания в миллисекундах или INFINITE_TIMEOUT, чтобы задать неограниченное время ожидания.
  • [out] retcode – указатель на код завершения процесса.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskGetHandle()

Назначение

Позволяет получить дескриптор процесса.

Параметры

  • [in] task – указатель на объект, описывающий процесс.

Возвращаемые значения

Дескриптор процесса.

KosTaskLaunch()

Назначение

Создает и запускает процесс.

Параметры

  • [in] params – указатель на структуру, содержащую параметры процесса.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskGetSelf()

Назначение

Позволяет получить адрес объекта, описывающего вызывающий процесс.

Параметры

Нет.

Возвращаемые значения

Указатель на объект, описывающий процесс, или RTL_NULL, если этот объект удален.

Дополнительные сведения

Функция увеличивает на единицу число ссылок на объект, описывающий процесс, поэтому после вызова этой функции нужно вызвать функцию KosTaskPut().

KosTaskPut()

Назначение

Уменьшает на единицу число ссылок на объект, описывающий процесс.

Параметры

  • [in] task – указатель на объект, описывающий процесс.

Возвращаемые значения

Нет.

KosTaskAddEndpoints()

Назначение

Регистрирует службы.

Параметры

  • [in,out] task – указатель на объект, описывающий процесс.
  • [in] endpoints – указатель на массив структур, описывающих службы. Тип структуры определен в заголовочном файле sysroot-*-kos/include/services/handle/if_connection.h из состава KasperskyOS SDK.
  • [in] count – число служб.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Функция используется библиотекой libkos при создании процессов.

KosTaskSetSelfFSBackend()

Назначение

Задает, как осуществляется поддержка файловой системы ROMFS для вызывающего процесса: ядром или системной программой.

Параметры

  • [in] fsBackend – параметр, который задает, как осуществляется поддержка файловой системы ROMFS: ядром или системной программой.

Возвращаемые значения

Нет.

KosTaskGetSelfFSBackend()

Назначение

Позволяет получить сведения о том, как осуществляется поддержка файловой системы ROMFS для вызывающего процесса: ядром или системной программой.

Параметры

Нет.

Возвращаемые значения

Значение, которое отражает, как осуществляется поддержка файловой системы ROMFS: ядром или системной программой.

KosTaskSetComponentTree()

Назначение

Создает структуры со сведениями о службах из формальной спецификации компонента решения и связывает эти структуры с объектом, описывающим процесс.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] root – указатель на структуру, содержащую сведения из формальной спецификации компонента решения. Тип структуры определен в заголовочном файле sysroot-*-kos/include/nk/types.h из состава KasperskyOS SDK. Эта структура является элементом автоматически генерируемого транспортного кода.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskTransferResource()

Назначение

Передает дескриптор процессу, который еще не запущен.

Параметры

  • [in] task – указатель на объект, описывающий процесс.
  • [in] srcHandle – передаваемый дескриптор.
  • [in] srcBadge – дескриптор объекта контекста передачи ресурса.
  • [in] dstRights – маска прав потомка передаваемого дескриптора.
  • [in] handleName – имя потомка передаваемого дескриптора.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KosTaskLookupResource()

Назначение

Выполняет поиск дескриптора по имени, заданному функцией KosTaskTransferResource().

Параметры

  • [in] handleName – имя дескриптора.

Возвращаемые значения

В случае успеха возвращает дескриптор, иначе возвращает INVALID_HANDLE.