SysFn68/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Функция 68 - внутренние системные службы

Подфункция 0 - получить счётчик переключений задач.

Параметры:

  • eax = 68 - номер функции
  • ebx = 0 - номер подфункции

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

  • eax = число переключений задач с момента загрузки системы (по модулю 2^32)

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_GET_TASK_SWITCH_COUNT (0)

Подфункция 1 - переключиться на следующий поток выполнения.

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

Параметры:

  • eax = 68 - номер функции
  • ebx = 1 - номер подфункции

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

  • функция не возвращает значения

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SWITCH_TASK (1)

Подфункция 2 - кэш + rdpmc.

Параметры:

  • eax = 68 - номер функции
  • ebx = 2 - номер подфункции
  • ecx = требуемое действие:
  • ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters)
  • ecx = 1 - узнать, включён/выключен кэш
  • ecx = 2 - включить кэш
  • ecx = 3 - выключить кэш

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

  • для ecx=0:
    • eax = значение cr4
  • для ecx=1:
    • eax = (cr0 and 0x60000000):
  • eax = 0 - кэш включён
  • eax <> 0 - кэш выключен
  • для ecx=2 и ecx=3 функция не возвращает значения

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_PERFORMANCE (2)
ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)

Подфункция 3 - прочитать MSR-регистр.

MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); каждое семейство процессоров имеет своё подмножество MSR-регистров.

Параметры:

  • eax = 68 - номер функции
  • ebx = 3 - номер подфункции
  • ecx игнорируется
  • edx = адрес MSR

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

  • ebx:eax = старший:младший dword результата

Замечания:

  • Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
  • Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_READ_MSR (3)

Подфункция 4 - записать в MSR-регистр.

MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); каждое семейство процессоров имеет своё подмножество MSR-регистров.

Параметры:

  • eax = 68 - номер функции
  • ebx = 4 - номер подфункции
  • ecx игнорируется
  • edx = адрес MSR
  • esi:edi = старший:младший dword

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

  • функция не возвращает значения

Замечания:

  • Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
  • Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_WRITE_MSR (4)

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

Параметры:

  • eax = 68 - номер функции
  • ebx = 11 - номер подфункции

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

  • eax = 0 - неуспех
  • иначе размер созданной кучи

Замечания:

  • Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
  • Если куча уже создана, функция вернёт размер существующей кучи. Размер кучи равен размеру всей свободной памяти приложения.
  • После создания кучи вызовы функции 64 игнорируются.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_HEAP_INIT (11)

Подфункция 12 - выделить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 12 - номер подфункции
  • ecx = требуемый размер в байтах

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

  • eax = указатель на выделенный блок

Замечания:

  • Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_ALLOC (12)

Подфункция 13 - освободить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 13 - номер подфункции
  • ecx = указатель на блок памяти

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

  • eax = 1 - успешно
  • eax = 0 - неудача

Замечания:

  • Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE (13)

Подфункция 14 - ожидать извещения от драйвера.

Параметры:

  • eax = 68 - номер функции
  • ebx = 14 - номер подфункции
  • ecx = указатель на буфер для информации (8 байт)

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

  • буфер, на который указывает ecx, содержит следующую информацию:
  • +0: dword: константа EV_INTR = 1
  • +4: dword: данные драйвера

Замечания:

  • Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_WAIT_SIGNAL (14)

Подфункция 16 - загрузить драйвер.

Параметры:

  • eax = 68 - номер функции
  • ebx = 16 - номер подфункции
  • ecx = указатель на ASCIIZ-строку с именем драйвера

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

  • eax = 0 - неудача
  • иначе eax = хэндл драйвера

Замечания:

  • Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
  • Имя драйвера чувствительно к регистру символов. Максимальная длина имени - 16 символов, включая завершающий нулевой символ, остальные символы игнорируются.
  • Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER (16)

Подфункция 17 - управление драйвером.

Параметры:

  • eax = 68 - номер функции
  • ebx = 17 - номер подфункции
  • ecx = указатель на управляющую структуру:
    • +0: dword: хэндл драйвера
    • +4: dword: код функции драйвера
    • +8: dword: указатель на входные данные
    • +12 = +0xC: dword: размер входных данных
    • +16 = +0x10: dword: указатель на выходные данные
    • +20 = +0x14: dword: размер выходных данных

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

  • eax = определяется драйвером

Замечания:

  • Коды функций и структура входных/выходных данных определяются драйвером.
  • Предварительно должен быть получен хэндл драйвера подфункцией 16.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_CONTROL_DRIVER (17)

Подфункция 18 - загрузить DLL с указанием кодировки.

Параметры:

  • eax = 68 - номер функции
  • ebx = 18 - номер подфункции
  • ecx = указатель на строку с путём к DLL
  • edx = кодировка строки, подробности указаны в описании функции 80.

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

  • eax = 0 - неудача
  • иначе eax = указатель на таблицу экспорта DLL

Замечания:

  • Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.

Подфункция 19 - загрузить DLL.

Параметры:

  • eax = 68 - номер функции
  • ebx = 19 - номер подфункции
  • ecx = указатель на строку с путём к DLL, правила формирования строки указаны в описании функции 70.

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

  • eax = 0 - неудача
  • иначе eax = указатель на таблицу экспорта DLL

Замечания:

  • Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DLL (19)

Подфункция 20 - перераспределить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 20 - номер подфункции
  • ecx = новый размер в байтах
  • edx = указатель на уже выделенный блок памяти

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

  • eax = указатель на перераспределённый блок, 0 при ошибке

Замечания:

  • Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
  • Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
  • Если edx=0, то вызов функции эквивалентен выделению памяти подфункцией 12. В противном случае блок памяти по адресу edx должен быть ранее выделен подфункцией 12 или описываемой подфункцией.
  • Если ecx=0, то функция освобождает блок памяти по адресу edx и возвращает 0.
  • Содержимое памяти вплоть до наименьшего из старого и нового размеров сохраняется.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_REALLOC (20)

Подфункция 21 - загрузка PE драйвера

Параметры:

  • eax = 68 - номер функции
  • ebx = 21 - номер подфункции
  • ecx = указатель на ASCIIZ-строку с именем драйвера
  • edx = указатель на командную строку

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

  • eax = 0 - неудача
  • иначе eax = хэндл драйвера

Замечания:

  • Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER_PE (21)

Подфункция 22 - открыть именованную область памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 22 - номер подфункции
  • ecx = указатель на имя области. Максимум 32 символа включая завершающий ноль
  • edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
  • esi = флаги открытия и доступа
SHM_OPEN = 0x00
SHM_OPEN_ALWAYS = 0x04
SHM_CREATE = 0x08
SHM_READ = 0x00
SHM_WRITE = 0x01
  • SHM_CREATE - создать новую область памяти. Если область с таким именем уже существует функция вернёт код ошибки E_ACCESS
  • SHM_OPEN_ALWAYS - открывает существующую или создаёт новую область памяти.
  • SHM_OPEN - открывает существующую область памяти. Если область с таким именем не существует функция вернёт код ошибки E_NOTFOUND.
  • SHM_READ - доступ только на чтение.
  • SHM_WRITE - доступ на чтение и запись.

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

  • eax = указатель на область памяти или ноль в случае ошибки
  • edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки.

Коды ошибок:

  • E_NOTFOUND = 5
  • E_ACCESS = 10
  • E_NOMEM = 30
  • E_PARAM = 33

Замечания:

  • Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
  • Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.
  • Родительский процесс всегда имеет доступ на запись.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_OPEN (22)

Подфункция 23 - закрыть именованную область памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 23 - номер подфункции
  • ecx = указатель на имя области. Максимум 31 символ включая завершающий ноль

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

  • разрушается

Замечания:

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

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_CLOSE (23)

Подфункция 24 - установить обработчик исключений

Параметры:

  • eax = 68 - номер функции
  • ebx = 24 - номер подфункции
  • ecx = адрес нового обработчика исключений
  • edx = маска обрабатываемых исключений

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

  • eax = адрес старого обработчика исключений (0, если не установлен)
  • ebx = маска старого обработчика исключений

Замечания:

  • Номер бита в маске исключений соответствует номеру исключения по спецификации на процессор (Intel-PC). Так, например, исключения FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
  • В данной реализации игнорируется запрос на перехват исключения 7 - система обрабатывает #NM самостоятельно.
  • Пользовательский обработчик получает номер исключения параметром в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат при этом производится на команду, вызвавшую исключение.
  • При передаче управления обработчику исключений сбрасывается соответствующий бит в маске исключений. Возникновение этого же исключения впоследствии приведёт к умолчальной обработке такового. А именно: к завершению работы приложения в отсутствии отладчика, приостановка с уведомлением отлаживающего приложения иначе.
  • После завершения критических действий в обработчике пользователя восстановление бита маски данного исключения можно сделать подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_HANDLER (24)

Подфункция 25 - изменить состояние активности сигнала

Параметры:

  • eax = 68 - номер функции
  • ebx = 25 - номер подфункции
  • ecx = номер сигнала
  • edx = значение устанавливаемой активности (0/1)

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

  • eax = -1 - задан неверный номер сигнала
  • иначе eax = старое значение активности сигнала (0/1)

Замечания:

  • В текущей реализации изменяется только маска пользовательского обработчика исключений, установленного подфункцией 24. При этом номер сигнала соответствует номеру исключения.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_STATE (25)

Подфункция 26 - освободить страницы памяти

Параметры:

  • eax = 68 - номер функции
  • ebx = 26 - номер подфункции
  • ecx = указатель на блок памяти выделенный подфункцией 12
  • edx = смещение от начала блока
  • esi = размер высвобождаемого блока памяти, в байтах

Примечания:

  • функция освобождает страницы с ecx+edx по ecx+edx+esi и устанавливает виртуальную память в зарезервированное состояние.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE_EXT (26)

Подфункция 27 - загрузить файл

Параметры:

  • eax = 68 - номер функции
  • ebx = 27 - номер подфункции
  • ecx = указатель на строку с путём к файлу, правила формирования строки указаны в описании функции 70.

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

  • eax = адрес области памяти, содержащей загруженный файл
  • edx = размер файла

Замечания:

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

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_FILE (27)

Подфункция 28 - загрузить файл с указанием кодировки

Параметры:

  • eax = 68 - номер функции
  • ebx = 28 - номер подфункции
  • ecx = указатель на строку с путём к файлу
  • edx = кодировка строки, подробности указаны в описании функции 80.

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

  • eax = указатель на загруженный файл или 0
  • edx = размер загруженного файла или 0

Примечания:

  • функция загружает и, при необходимости, распаковывает файл (kpack)

Подфункция 31 - получить данные драйвера

Параметры:

  • eax = 68 - номер функции
  • ebx = 31 - номер подфункции
  • ecx = функция (1 - получить начальные значения списка, 2 - получить элемент списка)
  • edx = Если ecx=2 указатель на структуру.
  • edi = Если ecx=2 указатель на память под структуру

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

  • Если ecx = 1, то
    • ebx = fd
    • ecx = bk
  • Если ecx = 2, то
    • eax = 0 операция прошла успешно
    • eax = -1 ошибка

Примечания:

  • возвращаемая структура
    • data_service:
      • .name: rb 16
      • .fd: rd 1
      • .bk: rd 1
      • .base: rd 1
      • .entry: rd 1
      • .srv_proc: rd 1