Программные интерфейсы микроядра

Руководство характеризует программные интерфейсы ядра Операционной системы

Данный раздел предназначен для разработчиков, использующих ЗОСРВ «Нейтрино». Руководство содержит инструкции по программированию и справочник разработчика.

Виртуальная файловая система менеджера процессов (/proc)
Установка соединения
Чтение и модификация адресных пространств процессов
Управление процессами и потоками
Команды devctl(), поддерживаемые виртуальной файловой системой

Виртуальная файловая система менеджера процессов (/proc)

Менеджер процессов предоставляет виртуальную файловую систему /proc, позволяющую контролировать процессы и потоки в системе.


Note: Также менеджер процессов также обслуживает файловую систему /proc/mount, перечисляющую все зарегистрированные точки монтирования в системе.


Note: Через каталог /proc/boot доступно содержимое загрузочного образа системы.

/proc представляет каждый запущенный в системе процесс в виде каталога, имя которого есть целочисленный идентификатор процесса pid (Process ID). Внутри этого каталога создается логический файл as (от address space), которые представляет всё адресное пространство процесса – /proc/PID/as. С помощью вызова devctl() можно передавать команды менеджеру процессов для управления потоками, полный перечень поддерживаемых команд представлен ниже. Программный интерфейс работы с данной файловой системой имеет вид:

Функция Назначение
open() Установка соединения с /proc/PID/as
read() Чтение данных из адресного пространства процесса
write() Запись данных в адресное пространство процесса
stat() Получение статистической информации
lseek() Изменение позиции в адресном пространстве процесса для последующих операций
devctl() Управление процессом или его потоками
close() Освобождение файлового дескриптора адресного пространства

Вспомогательные функции вроде readdir() и opendir() также поддерживаются файловой системой /proc, что позволяет функционировать POSIX утилитам (например, ls).

Рассмотрим ключевые операции подробнее.

Установка соединения

Для этого должна использоваться функция open(). Полученный файловый дескриптор позволяет осуществить доступ непосредственно к процессу.


Note: Открывать следует файл /proc/PID/as, а не каталог /proc/PID.

При взаимодействии с процессами необходимо обладать следующими привилегиями в системе:


Caution: По умолчанию такое распределение прав может являться проблемой безопасности. Для более строгого разграничения прав следует использовать опцию -u процесса procnto-*. Она позволяет определить umask при создании записей в /proc/PID. Обратной стороной такого решения будет невозможность использования некоторых штатных возможностей отдельных утилит, например, pidin arg и плагина сетевого монитора shelf.

В зависимости от выполняемых действий, при закрытии файлового дескриптора с помощью close() будут производиться различные действия.

Чтение и модификация адресных пространств процессов

Функции read() и write() позволяют получать и передавать данные из/в адресное пространство другого процесса. С помощью lseek() может определять позицию в памяти процесса.

Виртуальный адрес в памяти целевого процесса интерпретируется как смещение в файловом дескрипторе. Так, например, для чтения из адресного пространства процесса с идентификатором 32113 одной страницы памяти (по умолчанию, 4096 байт) с виртуальным адресом 0x00021000 может использоваться следующий код:

int fd;
char buf[4096];
fd = open( "/proc/2259/as", O_RDONLY );
lseek( fd, 0x00021000, SEEK_SET );
read( fd, buf, 4096 );

Безусловно, в реальном коде обязательно следует контролировать возвращаемые функциями значения. Поскольку адресное пространство любого процесса не является непрерывным, операции доступа к нему могут как проходить успешно, так и завершаться с ошибкой. А также может быть возвращено меньшее число информации, чем было запрошено (если запрос пересек границу выделенной в процессе памяти).

Управление процессами и потоками

Все рассматриваемые далее операции выполняются посредством функции devctl().

Выбор потока для дальнейших операций
При открытии процесса текущим потоком выбирается основной поток (вызвавший функцию main()). Переключение потока выполянется с помощью команды DCMD_PROC_CURTHREAD, а определить общее их число можно через DCMD_PROC_INFO.
Остановка и запуск потоков и процессов
Если файловый дескриптор открыт для записи, становятся доступны следующие команды: DCMD_PROC_STOP, DCMD_PROC_RUN, DCMD_PROC_FREEZETHREAD и DCMD_PROC_THAWTHREAD.
Установка точек остановки (отладка процессов)
Если файловый дескриптор открыт для записи, становятся доступны следующие команды: DCMD_PROC_BREAK, DCMD_PROC_WAITSTOP и DCMD_PROC_GET_BREAKLIST.
Изучение атрибутов процессов и потков (многие команды относятся к отладке процессов)
К данной группе относятся следующие команды: DCMD_PROC_SYSINFO, DCMD_PROC_INFO, DCMD_PROC_MAPINFO, DCMD_PROC_MAPDEBUG, DCMD_PROC_MAPDEBUG_BASE, DCMD_PROC_SIGNAL, DCMD_PROC_STATUS, DCMD_PROC_TIDSTATUS, DCMD_PROC_GETGREG, DCMD_PROC_SETGREG, DCMD_PROC_GETFPREG, DCMD_PROC_SETFPREG, DCMD_PROC_GETREGSET, DCMD_PROC_SETREGSET, DCMD_PROC_EVENT, DCMD_PROC_SET_FLAG, DCMD_PROC_CLEAR_FLAG, DCMD_PROC_PAGEDATA, DCMD_PROC_GETALTREG, DCMD_PROC_SETALTREG, DCMD_PROC_TIMERS, DCMD_PROC_IRQS, DCMD_PROC_THREADCTL и DCMD_PROC_CHANNELS.
Получение информации о потоке (отладка процессов)
К данной группе относятся следующие команды: DCMD_PROC_STATUS, DCMD_PROC_STOP, DCMD_PROC_TIDSTATUS и DCMD_PROC_WAITSTOP.

Команды devctl(), поддерживаемые виртуальной файловой системой

Полный перечень команд менеджера процессов (см. функцию devctl()), обслуживаемых виртуальной файловой системой /proc/PID/as, и соответствующие им типы данных собраны в следующей таблице:

Статья Описание
Добавление идентификатора партиции памяти процесса
Установка или удаление точек остановки, которыми владеет отлаживаемый процесс
Определение каналов, которыми владеет отлаживаемый процесс
Изменение идентификатора партиции памяти процесса
Удаление debug-флагов процесса
Установка активного потока отлаживаемого процесса
Удаление идентификатора партиции памяти процесса
Определение события, которое будет доставлено при достижении процессом некоторой точки интереса
Заморозить поток отлаживаемого процесса
Получение информации об альтернативных регистрах текущего потока отлаживаемого процесса
Определение активных точек остановки, которыми владеет отлаживаемый процесс
Получение информации о регистрах FPU (Floating Point) текущего потока отлаживаемого процесса
Получение информации о регистрах CPU текущего потока отлаживаемого процесса
Получение списка партиций памяти процесса
Чтение заданного набора регистров
Получение информации об отлаживаемом процессе
Определение обработчиков прерываний, которыми владеет процесс
Получение информации об ELF-файле отлаживаемого процесса
Получение информации о пути, связанном с отлаживаемым процессом
Получение сегмент-специфичной информации о смапированной памяти процесса
Получение информации о смапированных страницах памяти процесса
Получение информации из таблицы страниц памяти MMU для указанного сегмента памяти процесса
Возобновление исполнения отлаживаемого процесса, если он был остановлен
Изменение состояния альтернативных регистров текущего потока отлаживаемого процесса
Установка debug-флага процессу
Изменение состояния регистров FPU (Floating Point) текущего потока отлаживаемого процесса
Изменение состояния регистров CPU текущего потока отлаживаемого процесса
Установка заданного набора регистров
Отправка сигнала отлаживаемому процессу
Получение состояния текущего потока отлаживаемого процесса
Остановить отлаживаемый процесс
Считывание системной страницы
Разморозить поток отлаживаемого процесса
Выполнение ThreadCtl() для произвольного процесса и потока
Получение состояния потока отлаживаемого процесса
Определение таймеров, которыми владеет отлаживаемый процесс
Заблокировать вызывающий процесс до достижения точки интереса отлаживаемым процессом
Структура данных характеризует точку остановки отлаживаемого процесса
Структура данных характеризует канал отлаживаемого процесса
Структура данных характеризует обработчик прерывания отлаживаемого процесса
Структура данных характеризует сведения об отлаживаемом процессе
Структура данных характеризует параметры возобновления исполнения отлаживаемого процесса
Структура данных характеризует состояние потока отлаживаемого процесса
Структура данных характеризует таймеры, которыми владеет отлаживаемый процесс
Структура данных характеризует информацию о сегментах ELF-файла отлаживаемого процесса
Структура данных характеризует информацию из таблицы страниц памяти MMU для указанного сегмента памяти процесса
Структура данных характеризует набора регистров
Структура данных характеризует отправляемый сигнал отлаживаемому процессу
Структура данных характеризует параметры вызова ThreadCtl()

Техническая поддержка

Для получения технической поддержки посетите раздел Поддержка сайта ( www.kpda.ru ). Вы обнаружите перечень предлагаемых способов оказания технической поддержки, включая публичный форум, форму обратной связи и контактные данные.

© 2005-2024, ООО "СВД ВС".




Предыдущий раздел: Руководство разработчика