Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
Line 1,032: Line 1,032:


== Функция 68 ==
== Функция 68 ==
=== Подфункция 0 - получить счётчик переключений задач. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 0 - номер подфункции
Возвращаемое значение:
  * eax = число переключений задач с момента загрузки системы
    (по модулю 2^32)
=== Подфункция 1 - переключиться на следующий поток выполнения. ===
Функция завершает текущий квант времени, выделенный потоку,
и переключается на следующий.
(Какой поток какого процесса будет следующим, предсказать нельзя).
Позднее, когда до текущего потока дойдёт очередь,
выполнение возобновится.
Параметры:
  * eax = 68 - номер функции
  * ebx = 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:
    * функция не возвращает значения
=== Подфункция 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. Иначе возникнет уже другое исключение в ядре,
    которое всё равно прибьёт поток.
=== Подфункция 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. Иначе возникнет уже другое исключение в ядре,
    которое всё равно прибьёт поток.
=== Подфункция 11 - инициализировать кучу процесса. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 11 - номер подфункции
Возвращаемое значение:
  * eax = 0 - неуспех
  * иначе размер созданной кучи
Замечания:
  * Вызов функции инициализирует кучу, из которой впоследствии можно
    выделять и освобождать блоки памяти подфункциями 12 и 13.
    Размер кучи равен размеру всей свободной памяти приложения.
  * При повторном вызове функции тем же процессом функция вернёт
    размер существующей кучи.
  * После создания кучи вызовы функции 64 игнорируются.
=== Подфункция 12 - выделить блок памяти. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 12 - номер подфункции
  * ecx = требуемый размер в байтах
Возвращаемое значение:
  * eax = указатель на выделенный блок
Замечания:
  * Предварительно следует инициализировать кучу процесса вызовом
    подфункции 11.
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
    размер выделенного блока больше или равен запрошенному.
=== Подфункция 13 - освободить блок памяти. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 13 - номер подфункции
  * ecx = указатель на блок памяти
Возвращаемое значение:
  * eax = 1 - успешно
  * eax = 0 - неудача
Замечания:
  * Блок памяти должен быть ранее выделен подфункцией 12
    или подфункцией 20.
=== Подфункция 14 - ожидать извещения от драйвера. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 14 - номер подфункции
  * ecx = указатель на буфер для информации (8 байт)
Возвращаемое значение:
  * буфер, на который указывает ecx, содержит следующую информацию:
    * +0: dword: константа EV_INTR = 1
    * +4: dword: данные драйвера
Замечания:
  * Текущая реализация во время ожидания требует довольно "тяжёлых"
    операций переключения контекста.
=== Подфункция 15 - установить обработчик исключений FPU. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 15 - номер подфункции
  * ecx = адрес нового обработчика исключений
Возвращаемое значение:
  * eax = адрес старого обработчика исключений
    (0, если он не был установлен)
=== Подфункция 16 - загрузить драйвер. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 16 - номер подфункции
  * ecx = указатель на ASCIIZ-строку с именем драйвера
Возвращаемое значение:
  * eax = 0 - неудача
  * иначе eax = хэндл драйвера
Замечания:
  * Если драйвер ещё не загружен, он загружается;
    если драйвер уже загружен, ничего не меняется.
  * Имя драйвера чувствительно к регистру символов.
    Максимальная длина имени - 16 символов, включая завершающий
    нулевой символ, остальные символы игнорируются.
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
=== Подфункция 17 - управление драйвером. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 17 - номер подфункции
  * ecx = указатель на управляющую структуру:
    * +0: dword: хэндл драйвера
    * +4: dword: код функции драйвера
    * +8: dword: указатель на входные данные
    * +12 = +0xC: dword: размер входных данных
    * +16 = +0x10: dword: указатель на выходные данные
    * +20 = +0x14: dword: размер выходных данных
Возвращаемое значение:
  * eax = определяется драйвером
Замечания:
  * Коды функций и структура входных/выходных данных
    определяются драйвером.
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
=== Подфункция 18 - установить обработчик исключений SSE. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 18 - номер подфункции
  * ecx = адрес нового обработчика исключений
Возвращаемое значение:
  * eax = адрес старого обработчика исключений
    (0, если он не был установлен)
=== Подфункция 19 - загрузить DLL. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 19 - номер подфункции
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
Возвращаемое значение:
  * eax = 0 - неудача
  * иначе eax = указатель на таблицу экспорта DLL
Замечания:
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
    заканчивающийся нулём. Первый dword в структуре является
    указателем на имя функции, второй содержит адрес функции.
=== Подфункция 20 - перераспределить блок памяти. ===
Параметры:
  * eax = 68 - номер функции
  * ebx = 20 - номер подфункции
  * ecx = новый размер в байтах
  * edx = указатель на уже выделенный блок памяти
Возвращаемое значение:
  * eax = указатель на перераспределённый блок, 0 при ошибке
Замечания:
  * Предварительно следует инициализировать кучу процесса вызовом
    подфункции 11.