Difference between revisions of "SysFn68/ru"

From KolibriOS wiki
Jump to navigation Jump to search
Line 19: Line 19:
 
выполнение возобновится.
 
выполнение возобновится.
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
 
* ebx = 1 - номер подфункции
 
* ebx = 1 - номер подфункции
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* функция не возвращает значения
 
* функция не возвращает значения
Line 31: Line 31:
 
=== Подфункция 2 - кэш + rdpmc. ===
 
=== Подфункция 2 - кэш + rdpmc. ===
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 41: Line 41:
 
* ecx = 3 - выключить кэш
 
* ecx = 3 - выключить кэш
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* для ecx=0:
 
* для ecx=0:
Line 59: Line 59:
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 66: Line 66:
 
* edx = адрес MSR
 
* edx = адрес MSR
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* ebx:eax = старший:младший dword результата
 
* ebx:eax = старший:младший dword результата
Line 82: Line 82:
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 94: Line 94:
 
* функция не возвращает значения
 
* функция не возвращает значения
  
Замечания:
+
''Замечания:''
  
 
* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
 
* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
Line 102: Line 102:
 
=== Подфункция 11 - инициализировать кучу процесса. ===
 
=== Подфункция 11 - инициализировать кучу процесса. ===
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
 
* ebx = 11 - номер подфункции
 
* ebx = 11 - номер подфункции
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* eax = 0 - неуспех
 
* eax = 0 - неуспех
 
* иначе размер созданной кучи
 
* иначе размер созданной кучи
  
Замечания:
+
''Замечания:''
  
 
* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения.
 
* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения.
Line 123: Line 123:
 
=== Подфункция 12 - выделить блок памяти. ===
 
=== Подфункция 12 - выделить блок памяти. ===
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 129: Line 129:
 
* ecx = требуемый размер в байтах
 
* ecx = требуемый размер в байтах
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* eax = указатель на выделенный блок
 
* eax = указатель на выделенный блок
  
Замечания:
+
''Замечания:''
  
 
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
 
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
Line 141: Line 141:
 
=== Подфункция 13 - освободить блок памяти. ===
 
=== Подфункция 13 - освободить блок памяти. ===
  
Параметры:
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 147: Line 147:
 
* ecx = указатель на блок памяти
 
* ecx = указатель на блок памяти
  
Возвращаемое значение:
+
''Возвращаемое значение:''
  
 
* eax = 1 - успешно
 
* eax = 1 - успешно
 
* eax = 0 - неудача
 
* eax = 0 - неудача
  
Замечания:
+
''Замечания:''
  
 
* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.
 
* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.
Line 159: Line 159:
 
=== Подфункция 14 - ожидать извещения от драйвера. ===
 
=== Подфункция 14 - ожидать извещения от драйвера. ===
  
'''Параметры''':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 165: Line 165:
 
* ecx = указатель на буфер для информации (8 байт)
 
* ecx = указатель на буфер для информации (8 байт)
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* буфер, на который указывает ecx, содержит следующую информацию:
 
* буфер, на который указывает ecx, содержит следующую информацию:
Line 171: Line 171:
 
* +4: dword: данные драйвера
 
* +4: dword: данные драйвера
  
''Замечания'':
+
''Замечания:''
  
 
* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.
 
* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.
Line 177: Line 177:
 
=== Подфункция 15 - установить обработчик исключений FPU. ===
 
=== Подфункция 15 - установить обработчик исключений FPU. ===
  
''Параметры'':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 183: Line 183:
 
* ecx = адрес нового обработчика исключений
 
* ecx = адрес нового обработчика исключений
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = адрес старого обработчика исключений (0, если он не был установлен)
 
* eax = адрес старого обработчика исключений (0, если он не был установлен)
Line 189: Line 189:
 
=== Подфункция 16 - загрузить драйвер. ===
 
=== Подфункция 16 - загрузить драйвер. ===
  
''Параметры'':
+
''Параметры:''
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
 
* ebx = 16 - номер подфункции
 
* ebx = 16 - номер подфункции
 
* ecx = указатель на ASCIIZ-строку с именем драйвера
 
* ecx = указатель на ASCIIZ-строку с именем драйвера
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = 0 - неудача
 
* eax = 0 - неудача
 
* иначе eax = хэндл драйвера
 
* иначе eax = хэндл драйвера
  
''Замечания'':
+
''Замечания:''
  
 
* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
 
* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
Line 207: Line 207:
 
=== Подфункция 17 - управление драйвером. ===
 
=== Подфункция 17 - управление драйвером. ===
  
''Параметры'':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 219: Line 219:
 
** +20 = +0x14: dword: размер выходных данных
 
** +20 = +0x14: dword: размер выходных данных
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = определяется драйвером
 
* eax = определяется драйвером
  
''Замечания'':
+
''Замечания:''
  
 
* Коды функций и структура входных/выходных данных определяются драйвером.
 
* Коды функций и структура входных/выходных данных определяются драйвером.
Line 230: Line 230:
 
=== Подфункция 18 - установить обработчик исключений SSE. ===
 
=== Подфункция 18 - установить обработчик исключений SSE. ===
  
''Параметры'':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 236: Line 236:
 
* ecx = адрес нового обработчика исключений
 
* ecx = адрес нового обработчика исключений
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = адрес старого обработчика исключений (0, если он не был установлен)
 
* eax = адрес старого обработчика исключений (0, если он не был установлен)
Line 242: Line 242:
 
=== Подфункция 19 - загрузить DLL. ===
 
=== Подфункция 19 - загрузить DLL. ===
  
''Параметры'':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 248: Line 248:
 
* ecx = указатель на ASCIIZ-строку с полным путём к DLL
 
* ecx = указатель на ASCIIZ-строку с полным путём к DLL
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = 0 - неудача
 
* eax = 0 - неудача
 
* иначе eax = указатель на таблицу экспорта DLL
 
* иначе eax = указатель на таблицу экспорта DLL
  
''Замечания'':
+
''Замечания:''
  
 
* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.
 
* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.
Line 259: Line 259:
 
=== Подфункция 20 - перераспределить блок памяти. ===
 
=== Подфункция 20 - перераспределить блок памяти. ===
  
''Параметры'':
+
''Параметры':'
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 266: Line 266:
 
* edx = указатель на уже выделенный блок памяти
 
* edx = указатель на уже выделенный блок памяти
  
''Возвращаемое значение'':
+
''Возвращаемое значение:''
  
 
* eax = указатель на перераспределённый блок, 0 при ошибке
 
* eax = указатель на перераспределённый блок, 0 при ошибке
  
''Замечания'':
+
''Замечания:''
  
 
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
 
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
Line 280: Line 280:
 
=== Подфункция 22 - открыть именованую область памяти. ===
 
=== Подфункция 22 - открыть именованую область памяти. ===
  
''Параметры'':
+
''Параметры:''
  
 
* eax = 68 - номер функции
 
* eax = 68 - номер функции
Line 300: Line 300:
 
:*SHM_WRITE - доступ на чтение и запись.
 
:*SHM_WRITE - доступ на чтение и запись.
  
''Возвращаемые значения'':
+
''Возвращаемые значения:''
  
 
* eax = указатель на область памяти или ноль в случае ошибки
 
* eax = указатель на область памяти или ноль в случае ошибки
 
* edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки.
 
* edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки.
  
''Коды ошибок'':
+
''Коды ошибок:''
 
* E_NOTFOUND =  5
 
* E_NOTFOUND =  5
 
* E_ACCESS  = 10
 
* E_ACCESS  = 10
Line 311: Line 311:
 
* E_PARAM    = 33
 
* E_PARAM    = 33
  
''Замечания'':
+
''Замечания:''
 
* Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.  
 
* Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.  
 
* Родительский процесс всегда имеет доступ на запись.
 
* Родительский процесс всегда имеет доступ на запись.

Revision as of 16:45, 9 April 2010

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

Подфункция 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

Замечания:

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

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

Параметры:

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

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

  • не определено