Ru/api/kernel: Difference between revisions
Line 844: | Line 844: | ||
== Функция 65 - вывести изображение с палитрой в окно. == | == Функция 65 - вывести изображение с палитрой в окно. == | ||
Описание функции перенесено в отдельную статью: [[SysFn65/ru|Функция 65]] | |||
== Функция 66 - работа с клавиатурой. == | == Функция 66 - работа с клавиатурой. == |
Revision as of 07:30, 10 April 2010
СИСТЕМНЫЕ ФУНКЦИИ KolibriOS 0.7.7.0
Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.
Функция 0 - определить и нарисовать окно.
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую область. Для окон со скином определяет стандартные кнопки закрытия и минимизации.
Описание функции перенесено в отдельную статью: Функция 0
Функция 1 - поставить точку в окне.
Описание функции перенесено в отдельную статью: Функция 1
Функция 2 - получить код нажатой клавиши.
Извлекает из буфера код нажатой клавиши.
Описание функции перенесено в отдельную статью: Функция 2
Функция 3 - получить системное время.
Описание функции перенесено в отдельную статью: Функция 3
Функция 4 - вывести строку текста в окно.
Описание функции перенесено в отдельную статью: Функция 4
Функция 5 - пауза.
Задерживает выполнение программы на заданное время.
Описание функции перенесено в отдельную статью: Функция 5
Функция 6 - прочитать файл с рамдиска.
Описание функции перенесено в отдельную статью: Функция 6
Функция 7 - вывести изображение в окно.
Описание функции перенесено в отдельную статью: Функция 7
Функция 8 - определить/удалить кнопку.
Описание функции перенесено в отдельную статью: Функция 8
Функция 9 - информация о потоке выполнения.
Описание функции перенесено в отдельную статью: Функция 9
Функция 10 - ожидать события.
Если очередь сообщений пуста, то ждет появления сообщения в очереди. В таком состоянии поток не получает процессорного времени. Затем считывает сообщение из очереди.
Описание функции перенесено в отдельную статью: Функция 10
Функция 11 - проверить, есть ли событие, без ожидания.
Если в очереди сообщений есть какое-то событие, то считывает и возвращает его. Если очередь пуста, возвращает нуль.
Описание функции перенесено в отдельную статью: Функция 11
Функция 12 - начать/закончить перерисовку окна.
Подфункция 1 - начать перерисовку окна. Подфункция 2 - закончить перерисовку окна.
Перенесены в отдельную статью: Функция 12
Функция 13 - нарисовать прямоугольник в окне.
Функция перенесена в статью Функция 13
Функция 14 - получить размеры экрана.
Описание функции перенесено в отдельную статью: Функция 14
Функция 15 - работа с фоновой графикой
Описание функции перенесено в отдельную статью: Функция 15
Функция 16 - сохранить рамдиск на дискету.
Описание функции перенесено в отдельную статью: Функция 16
Функция 17 - получить код нажатой кнопки.
Описание функции перенесено в отдельную статью: Функция 17
Функция 18 - системные настройки и информация
Описание функции перенесено в отдельную статью: Функция 18
Функция 20 - интерфейс MIDI.
Описание функции перенесено в отдельную статью: Функция 20
Функция 21 - установка системных параметров
Описание функции перенесено в отдельную статью: Функция 21
Функция 22 - установить системную дату/время.
Описание функции перенесено в отдельную статью: Функция 22
Функция 23 - ожидать события с таймаутом.
Описание функции перенесено в отдельную статью: Функция 23
Функция 24 - работа с проигрывателем компакт-дисков
Описание функции перенесено в отдельную статью: Функция 24
Функция 25 - установить громкость SBPro.
Удалена
Функция 26 - аппаратный сервис
Описание функции перенесено в отдельную статью: Функция 26
Функция 27
сведения об этой функции отсутствуют
Функция 28 - установить громкость SB16.
Удалена
Функция 29 - получить системную дату.
Описание функции перенесено в отдельную статью: Функция 29
Функция 30 - работа с текущей папкой.
Описание функции перенесено в отдельную статью: Функция 30
Функция 31
сведения об этой функции отсутствуют
Функция 32
Системная функция с этим номером использовалась в ранних версиях КОС для удаления файла с рамдиска. удалена
Функция 33
Системная функция с этим номером использовалась в ранних версиях КОС для записи файла на рамдиск. удалена
Функция 34
сведения об этой функции отсутствуют
Функция 35 - прочитать цвет точки на экране.
Описание функции перенесено в отдельную статью: Функция 35
Функция 36 - прочитать область экрана.
Описание функции перенесено в отдельную статью: Функция 36
Функция 37 - работа с мышью.
Описание функции перенесено в отдельную статью: Функция 37
Функция 38 - нарисовать отрезок.
Описание функции перенесено в отдельную статью: Функция 38
Функция 39 - чтение фона.
Описание функции перенесено в отдельную статью: Функция 39
Функция 40 - установить маску для ожидаемых событий.
Описание функции перенесено в отдельную статью: Функция 40
Функция 41 - узнать владельца IRQ.
Описание функции перенесено в отдельную статью: Функция 41
Функция 42 - работа с данными, полученными по IRQ.
Описание функции перенесено в отдельную статью: Функция 42
Функция 43 - ввод/вывод в порт.
Описание функции перенесено в отдельную статью: Функция 43
Функция 44 - определить действия при поступлении IRQ.
Описание функции перенесено в отдельную статью: Функция 44
Функция 45 - зарезервировать/освободить IRQ.
Описание функции перенесено в отдельную статью: Функция 45
Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
Внимание: Эта функция устарела и может быть удалена в следующих версиях ядра.
Описание функции перенесено в отдельную статью: Функция 46
Функция 47 - вывести число в окно.
Описание функции перенесено в отдельную статью: Функция 47
Функция 48 - стили отображения окон
Описание функции перенесено в отдельную статью: Функция 48
Функция 49 - Advanced Power Management (APM).
Описание функции перенесено в отдельную статью: Функция 49
Функция 50 - установка формы окна.
Описание функции перенесено в отдельную статью: Функция 50
Функция 51 - создать поток.
Описание функции перенесено в отдельную статью: Функция 51
Функция 52 - сетевой сервис.
Описание функции перенесено в отдельную статью: Функция 52
Функция 53 - работа с сетевым сокетами.
Описание функции перенесено в отдельную статью: Функция 53
Функция 54
Описание сисфункции с этим номером отсутствует.
Функция 55 - аудио сервис.
Подфункция 0 - загрузить данные для SB16.
Параметры:
* eax = 55 - номер функции * ebx = 0 - номер подфункции * ecx = указатель на данные (копируется 64 килобайта, используется столько, сколько установлено подфункцией 2)
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Формат и размер данных устанавливаются подфункцией 2.
Подфункция 1 - начать проигрывать данные на SB16.
Параметры:
* eax = 55 - номер функции * ebx = 1 - номер подфункции
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Предварительно данные должны быть загружены подфункцией 0 и определён их формат подфункцией 2. * Функция возвращает управление, когда началось проигрывание данных; после этого проигрывание идёт независимо от приложения (и вообще не требует загрузки процессора). * Предварительно должны быть определены базовый порт SB16 (подфункцией 4 функции 21) и канал DMA (подфункцией 10 функции 21).
Подфункция 2 - установить формат данных SB16.
Параметры:
* eax = 55 - номер функции * ebx = 2 - номер подфункции * ecx = 0 - установить разрядность * edx = 1 - 8бит моно * edx = 2 - 8бит стерео * ecx = 1 - установить размер данных * edx = размер в байтах * ecx = 2 - установить частоту проигрывания * edx = частота
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* При загрузке системы устанавливаются следующие параметры по умолчанию: разрядность - 8 бит моно, размер - 64 Кб, частота 44100 Гц. Тем не менее рекомендуется явно устанавливать необходимые значения, поскольку они могли быть переустановлены какой-нибудь программой.
Подфункция 55 - начать проигрывать данные на встроенном спикере.
Параметры:
* eax = 55 - номер функции * ebx = 55 - номер подфункции * esi = указатель на данные
Возвращаемое значение:
* eax = 0 - успешно * eax = 55 - ошибка (спикер отключён или занят)
Данные - это массив элементов переменной длины. Формат каждого элемента определяется первым байтом:
* 0 = конец данных * 1..0x80 = задаёт длительность звучания в сотых долях секунды ноты, определяемой непосредственным значением частоты * следующее слово (2 байта) содержит делитель частоты; частота определяется как 1193180/divider * 0x81 = invalid * 0x82..0xFF = нота, определяемая октавой и номером: * длительность в сотых долях секунды = (первый байт)-0x81 * присутствует ещё один байт; * (второй байт)=0xFF - пауза * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1 до 12, a=номер октавы (считая с 0)
Замечания:
* Пищание спикером может быть запрещено/разрешено подфункцией 8 функции 18. * Функция возвращает управление, сообщив куда следует информацию о запросе. Само проигрывание идёт независимо от программы. * Данные должны сохраняться в памяти по крайней мере до конца проигрывания.
Функция 57 - PCI BIOS.
Параметры:
* eax = 57 - номер функции * ebp соответствует регистру al в спецификации PCI BIOS * остальные регистры - по спецификации PCI BIOS
Возвращаемое значение:
* CF не определён * остальные регистры - по спецификации PCI BIOS
Замечания:
* Многих результатов этой функции можно также добиться вызовом соответствующих подфункций функции 62. * Функция вызывает расширение PCI32 BIOS, документированное, например, в http://alpha1.dyns.net/files/PCI/bios21.pdf. * Если BIOS не поддерживает это расширение, поведение функции эмулируется (через аналоги подфункций функции 62 режима ядра).
Функция 58 - работа с файловой системой.
Параметры:
* eax = 58 * ebx = указатель на информационную структуру
Возвращаемое значение:
* eax = 0 - успешно; иначе код ошибки файловой системы * в зависимости от подфункции может возвращаться значение и в других регистрах
Общий формат информационной структуры:
* +0: dword: номер подфункции * +4: dword: номер блока * +8: dword: размер * +12 = +0xC: dword: указатель на данные * +16 = +0x10: dword: указатель на память для работы системы (4096 байт) * +20 = +0x14: n db: ASCIIZ-строка с именем файла
Уточнения - в документации на соответствующую подфункцию. Имя файла нечувствительно к регистру латинских букв, русские буквы должны быть заглавными. Формат имени файла: /base/number/dir1/dir2/.../dirn/file, где /base/number идентифицирует устройство, на котором ищется файл: одно из
* /RD/1 = /RAMDISK/1 для доступа к рамдиску * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу, /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску (в этом случае база определяется подфункцией 7 функции 21), x - номер раздела (считая с 1) * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно к устройствам IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave); x - номер раздела на выбранном винчестере, изменяется от 1 до 255 (на каждом из винчестеров нумерация начинается с 1)
Замечания:
* В первых двух случаях допускается использование FIRST вместо 1, SECOND вместо 2, но использовать эту возможность не рекомендуется для удобства перехода на будущие расширения. * Накладывается ограничение n<=39. * Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3: имя не более 8 символов, точка, расширение не более 3 символов. Хвостовые пробелы игнорируются. Других пробелов быть не должно. Если имя занимает ровно 8 символов, точку можно опустить (хотя пользоваться этим не рекомендуется для удобства перехода на будущие расширения). * Функция не поддерживает папок на рамдиске.
Примеры:
* '/RAMDISK/FIRST/KERNEL.ASM',0 '/rd/1/kernel.asm',0 * '/HD0/1/kernel.asm',0 * '/hd0/1/menuet/pics/tanzania.bmp',0
Доступные подфункции:
* подфункция 0 - чтение файла/папки * подфункция 8 - LBA-чтение с устройства * подфункция 15 - получение информации о файловой системе
Подфункция 0 - прочитать файл/папку.
Параметры:
* eax = 58 * ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 0 = номер подфункции * +4: dword: номер блока для чтения (считая с 0) * +8: dword: число блоков для чтения * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании
Возвращаемое значение:
* eax = 0 - успешно, иначе код ошибки файловой системы * ebx = размер файла (в байтах) или -1=0xffffffff, если файл не найден
Замечания:
* Размер блока - 512 байт. * Эта функция устарела, для чтения файлов используйте подфункцию 0 функции 70, для чтения папок - подфункцию 1 функции 70. * Функция позволяет читать содержимое папки. Из файловых систем поддерживается только FAT. Формат FAT-папки описан в любой документации по FAT. * Размер папки определяется по размеру цепочки кластеров в FAT. * Если файл кончился раньше, чем был прочитан последний запрошенный блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но в первых двух случаях текущая реализация не следует установленным правилам: для /rd/1: * если указано 0 блоков для чтения, считается, что запрашивается 1; * если запрашивается больше 14 блоков или начальный блок не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1; * размер корневого каталога рамдиска = 14 блоков, 0x1C00=7168 байт; но возвращается ebx=0 (за исключением случая предыдущего пункта); * как ни странно, можно прочитать 14-й блок (там, вообще говоря, мусор - напоминаю, счёт ведётся с 0); * если был запрошен хотя бы один блок с номером, не меньшим 14, то возвращается eax=6(EOF); иначе eax=0. Для /fd/x: * если начальный блок не меньше 14-го, то возвращается eax=5 (not found) и ebx=0; * кстати говоря, формат FAT12 допускает дискеты с размером корневого каталога меньше или больше 14 блоков; * проверки длины не делается; * если удалось прочитать данные с дискеты, возвращается eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1. * Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n]; но результат не соответствует ожидаемому (по работе с обычными файлами/папками), не следует установленным правилам, может измениться в следующих версиях ядра и потому не описывается. Для получения информации об оборудовании используйте подфункцию 11 функции 18 или читайте соответствующие папки подфункцией 1 функции 70.
Подфункция 8 - LBA-чтение с устройства.
Параметры:
* eax = 58 - номер функции * ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 8 = номер подфункции * +4: dword: номер блока для чтения (считая с 0) * +8: dword: игнорируется (устанавливайте в 1) * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные (512 байт) * +16 = +0x10: dword: указатель на буфер для работы системы (4096 байт) * +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру, одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n, 1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3. Вместо цифр допускается, хотя и не рекомендуется для удобства перехода на будущие расширения, использование 'first','second','third','fourth'.
Возвращаемое значение:
* если указано имя устройства /hd/xxx, где xxx не находится в списке выше: * eax = ebx = 1 * если указано неправильное имя устройства (за исключением предыдущего случая): * eax = 5 * ebx не меняется * если LBA-доступ запрещён подфункцией 11 функции 21: * eax = 2 * ebx разрушается * для рамдиска: попытка чтения блока за пределами рамдиска (18*2*80 блоков) приводит к * eax = 3 * ebx = 0 * при успешном чтении: * eax = ebx = 0
Замечания:
* Размер блока - 512 байт; читается один блок. * Не следует полагаться на возвращаемое значение, оно может измениться в следующих версиях. * Требуется, чтобы был разрешён LBA-доступ к устройствам подфункцией 11 функции 21. Узнать это можно вызовом подфункцией 11 функции 26. * LBA-чтение дискеты не поддерживается. * Функция считывает данные физического жёсткого диска; если по каким-то причинам нужны данные конкретного раздела, придётся определять начальный сектор этого раздела (либо напрямую через MBR, либо из расширенной структуры, возвращаемой той же подфункцией 11 функции 18). * Функция не проверяет код ошибки жёсткого диска, так что запрос несуществующего сектора всё равно что-то прочитает (вероятнее всего, нули, но это определяется устройством) и это будет считаться успехом (eax=0).
= Функция 58, подфункция 15 - получить информацию о файловой системе.
Параметры:
* eax = 58 - номер функции * ebx = указатель на информационную структуру
Формат информационной структуры:
* +0: dword: 15 = номер подфункции * +4: dword: игнорируется * +8: dword: игнорируется * +12 = +0xC: dword: игнорируется * +16 = +0x10: dword: игнорируется * +20 = +0x14: (проверяется только второй символ, сразу после слэша) /rd=/RAMDISK или /hd=/HARDDISK
Возвращаемое значение:
* если второй символ не принадлежит множеству {'r','R','h','H'}: * eax = 3 * ebx = ecx = dword [fileinfo] = 0 * для рамдиска: * eax = 0 (успех) * ebx = общее число кластеров = 2847 * ecx = число свободных кластеров * dword [fileinfo] = размер кластера = 512 * для жёсткого диска: база и раздел определяются подфункциями 7 и 8 функции 21: * eax = 0 (успех) * ebx = общее число кластеров * ecx = число свободных кластеров * dword [fileinfo] = размер кластера (в байтах)
Замечания:
* Не удивляйтесь странному расположению 4-го возвращаемого параметра - когда писался этот код, при системных вызовах приложению возвращались только регистры eax,ebx,ecx (из pushad-структуры, передающейся как аргумент системной функции). Теперь это исправлено, так что, возможно, имеет смысл возвращать размер кластера в edx, пока эту функцию не начали использовать. * Вообще-то ещё существует подфункция 11 функции 18, возвращающая информацию о файловой системе. По расширенной таблице дисковой подсистемы можно определить размер кластера (там он хранится в секторах) и общее число кластеров для жёстких дисков.
Функция 60 - Inter Process Communication (IPC).
IPC применяется для посылок сообщений от одного процесса/потока другому. При этом следует предварительно договориться о том, как интерпретировать конкретное сообщение.
Подфункция 1 - установить область для получения IPC
Вызывается процессом-приёмником. Параметры:
* eax = 60 - номер функции * ebx = 1 - номер подфункции * ecx = указатель на буфер * edx = размер буфера
Возвращаемое значение:
* eax = 0 - всегда успешно
Формат IPC-буфера:
* +0: dword: если здесь не 0, то буфер считается заблокированным; блокируйте/разблокируйте буфер, когда вы с ним активно работаете и вам надо, чтобы извне не изменялись данные буфера (не поступали новые сообщения) * +4: dword: занято места в буфере (в байтах) * +8: первое сообщение * +8+n: второе сообщение * ...
Формат сообщения:
* +0: dword: PID процесса/потока, пославшего сообщение * +4: dword: длина сообщения (не считая этот заголовок) * +8: n*byte: данные сообщения
=== Подфункция 2 - послать сообщение IPC. ===- Вызывается процессом-инициатором. Параметры:
* eax = 60 - номер функции * ebx = 2 - номер подфункции * ecx = PID приёмника * edx = указатель на данные сообщения * esi = длина сообщения (в байтах)
Возвращаемое значение:
* eax = 0 - успешно * eax = 1 - приёмник не определил буфер для IPC-сообщений (может быть, ещё не успел, а может быть, это не тот поток, который нужен) * eax = 2 - приёмник заблокировал IPC-буфер; попробуйте немного подождать * eax = 3 - переполнение IPC-буфера приёмника * eax = 4 - процесса/потока с таким PID не существует
Замечания:
* Система сразу после записи IPC-сообщения в буфер посылает потоку-приёмнику событие с кодом 7 (см. коды событий).
Функция 61 - получить параметры для прямого доступа к графике.
Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs:
mov eax, [gs:0]
поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих).
mov [gs:0], eax
при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). Для интерпретации данных графического экрана требуется знание некоторых параметров, которые возвращаются этой функцией. Замечания:
* Параметры графики очень редко меняются при работе системы, а именно, только в случаях, когда пользователь работает с программой VRR. * При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима. * При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши.
Разрешение экрана
Параметры:
* eax = 61 - номер функции * ebx = 1 - номер подфункции
Возвращаемое значение:
* eax = [разрешение по оси x]*65536 + [разрешение по оси y]
Замечания:
* Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ.
Число бит на пиксель
Параметры:
* eax = 61 - номер функции * ebx = 2 - номер подфункции
Возвращаемое значение:
* eax = число бит на пиксель (24 или 32)
Число байт на строку
Параметры:
* eax = 61 - номер функции * ebx = 3 - номер подфункции
Возвращаемое значение:
* eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране)
Функция 62 - пользовательский доступ к PCI.
Подфункция 0 - получить версию PCI-интерфейса.
Параметры:
* eax = 62 - номер функции * bl = 0 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия) * старшее слово eax обнулено
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение ax неопределено.
Подфункция 1 - получить номер последней PCI-шины.
Параметры:
* eax = 62 - номер функции * bl = 1 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Если PCI BIOS не поддерживается, то значение al неопределено.
Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI.
Параметры:
* eax = 62 - номер функции * bl = 2 - номер подфункции
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; иначе * al = механизм (1 или 2); прочие байты eax разрушаются
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм обращения выбирается в соответствии с характеристиками оборудования. * Подфункции чтения и записи автоматически работают с выбранным механизмом.
подфункции 4,5,6 - прочитать PCI-регистр.
Параметры:
* eax = 62 - номер функции * bl = 4 - читать байт * bl = 5 - читать слово * bl = 6 - читать двойное слово * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства * cl = номер регистра (должен быть чётным для bl=5, делиться на 4 для bl=6)
Возвращаемое значение:
* eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры); иначе * al/ax/eax (в зависимости от запрошенного размера) содержит данные; оставшаяся часть регистра eax разрушается
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2. * Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown (http://www.pobox.com/~ralf/files.html, ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/); список вторых должен быть указан в документации по устройству.
подфункции 8,9,10 - записать в PCI-регистр.
Параметры:
* eax = 62 - номер функции * bl = 8 - писать байт * bl = 9 - писать слово * bl = 10 - писать двойное слово * bh = номер PCI-шины * ch = dddddfff, где ddddd = номер устройства на шине, fff = номер функции устройства * cl = номер регистра (должен быть чётным для bl=9, делиться на 4 для bl=10) * dl/dx/edx (в зависимости от запрошенного размера) содержит данные для записи
Возвращаемое значение:
* eax = -1 - ошибка (запрещён доступ к PCI или неподдерживаемые параметры) * eax = 0 - успешно
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Механизм доступа 2 поддерживает только 16 устройств на шине и игнорирует номер функции. Получить механизм доступа можно вызовом подфункции 2. * Некоторые регистры стандартны и существуют для всех устройств, некоторые определяются конкретным устройством. Список первых входит, например, в известный Interrupt List by Ralf Brown; список вторых должен быть указан в документации по устройству.
подфункция 11 - инициализировать доступ к MMIO
Параметры:
* eax = 62 - номер функции * bl = 11 - номер подфункции * cx = адрес PCI-устройства
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; * eax = -2 - доступ к MMIO-блокам устройства не разрешён; * eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе * eax = размер доступной динамической памяти.
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * адрес PCI-устройства должен совпадать с системной переменной mmio_pci_addr
подфункция 12 - получить линейный адрес MMIO-блока
Параметры:
* eax = 62 - номер функции * bl = 12 - номер подфункции * bh = номер BAR-регистра в конфигурационной зоне PCI * ecx = размер MMIO-блока (в байтах) * edx = смещение относительно начала MMIO-блока (в 4K-страницах!)
Возвращаемое значение:
* eax = -1 - доступ к PCI запрещён; * eax = -2 - неверный номер BAR-регистра; * eax = -3 - BAR не содержит адреса IO; * eax = -4 - BAR адресует порты IO; * eax = -5 - ошибка аллокации; иначе * eax = начальный адрес MMIO в адресном пространстве приложения.
Замечания:
* Предварительно должен быть разрешён низкоуровневый доступ к PCI для приложений подфункцией 12 функции 21. * Адрес PCI-устройства задается системной переменной mmio_pci_addr. * Предоставленный диапазон линейных адресов должен освобождаться посредством вызова функции 62:13
подфункция 13 - освободить линейные адреса MMIO
Параметры:
* eax = 62 - номер функции * bl = 12 - номер подфункции * ecx = начальный адрес освобождаемого MMIO-блока в адресном пространстве приложения
Возвращаемое значение:
* eax = 1 - блок успешно освобожден;
Замечания:
* Предварительно приложению должен быть выделен uMMIO-блок (fn62:12)
Функция 63 - работа с доской отладки.
Описание функции перенесено в отдельную статью: Функция 63
Функция 64 - перераспределить память приложения.
Описание функции перенесено в отдельную статью: Функция 64
Функция 65 - вывести изображение с палитрой в окно.
Описание функции перенесено в отдельную статью: Функция 65
Функция 66 - работа с клавиатурой.
Описание функции перенесено в отдельную статью: Функция 66
- Подфункция 1 - установить режим ввода с клавиатуры.
- Подфункция 2 - получить режим ввода с клавиатуры.
- Подфункция 3 - получить состояние управляющих клавиш.
- Подфункция 4 - установить общесистемную "горячую клавишу".
- Подфункция 5 - удалить установленную "горячую клавишу".
Функция 67 - изменить положение/размеры окна.
Описание функции перенесено в отдельную статью: Функция 67
Функция 68 - внутренние системные службы
Описание функции перенесено в отдельную статью: Функция 68
- Подфункция 0 - получить счётчик переключений задач.
- Подфункция 1 - переключиться на следующий поток выполнения.
- Подфункция 2 - кэш + rdpmc.
- Подфункция 3 - прочитать MSR-регистр.
- Подфункция 4 - записать в MSR-регистр.
- Подфункция 11 - инициализировать кучу процесса.
- Подфункция 12 - выделить блок памяти.
- Подфункция 13 - освободить блок памяти.
- Подфункция 14 - ожидать извещения от драйвера.
- Подфункция 15 - установить обработчик исключений FPU.
- Подфункция 16 - загрузить драйвер.
- Подфункция 17 - управление драйвером.
- Подфункция 18 - установить обработчик исключений SSE.
- Подфункция 19 - загрузить DLL.
- Подфункция 20 - перераспределить блок памяти.
- Подфункция 22 - открыть именованую область памяти.
- Подфункция 23 - закрыть именованую область памяти.
Функция 69 - отладка.
Описание функции перенесено в отдельную статью: Функция 69
- Подфункция 0 - определить область данных для отладочных сообщений.
- Подфункция 1 - получить состояние регистров отлаживаемого потока.
- Подфункция 2 - установить состояние регистров отлаживаемого потока.
- Подфункция 3 - отключиться от отлаживаемого процесса.
- Подфункция 4 - приостановить поток.
- Подфункция 5 - возобновить выполнение потока.
- Подфункция 6 - прочитать из памяти отлаживаемого процесса.
- Подфункция 7 - записать в память отлаживаемого процесса.
- Подфункция 8 - завершить отлаживаемый поток.
- Подфункция 9 - установить/снять аппаратную точку останова.
Функция 70 - работа с файловой системой с поддержкой длинных имён.
Описание функции перенесено в отдельную статью: Функция 70
- Подфункция 0 - чтение файла с поддержкой длинных имён.
- Подфункция 1 - чтение папки с поддержкой длинных имён.
- Подфункция 2 - создание/перезапись файла с поддержкой длинных имён.
- Подфункция 3 - запись в существующий файл с поддержкой длинных имён.
- Подфункция 4 - установка размера файла.
- Подфункция 5 - получение информации о файле/папке.
- Подфункция 6 - установка атрибутов файла/папки.
- Подфункция 7 - запуск программы.
- Подфункция 8 - удаление файла/папки.
- Подфункция 9 - создание папки.
Функция 72 - послать сообщение окну.
Описание функции перенесено в отдельную статью: Функция 72
Подфункция 1 - послать сообщение с параметром активному окну.
Функция -1 - завершить выполнение потока/процесса
Описание функции перенесено в отдельную статью: Функция -1
Список событий
Очередное событие можно получить вызовом одной из функций 10 (ожидать события), 11 (проверить без ожидания), 23 (ожидать в течение заданного времени). Эти функции возвращают только те события, которые входят в маску, устанавливаемую функцией 40. По умолчанию это первые три, чего вполне достаточно для многих приложений. Коды событий:
* 1 = сообщение о перерисовке (сбрасывается при вызове функции 0) * 2 = нажата клавиша на клавиатуре (поступает, только когда окно активно) или нажата "горячая клавиша"; сбрасывается, когда все клавиши из буфера считаны функцией 2 * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка закрытия, созданная неявно функцией 0; кнопка минимизации обрабатывается системой и о ней сообщения не приходит; поступает, только когда окно активно; сбрасывается, когда все кнопки из буфера считаны функцией 17) * 4 = зарезервировано (в текущей реализации никогда не приходит даже при размаскировке функцией 40) * 5 = перерисовывается фон рабочего стола (сбрасывается автоматически после перерисовки, так что если во время перерисовки фона программа не ждёт и не проверяет события, то этого события она не заметит) * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) * 7 = произошло событие IPC (смотри функцию 60 - Inter Process Communication; сбрасывается при прочтении) * 8 = произошло сетевое событие (сбрасывается при прочтении; смотри работу с сетью) * 9 = произошло отладочное событие (сбрасывается при прочтении; смотри отладочную подсистему) * 16..31 = произошло событие с соответствующим IRQ (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
Коды ошибок файловой системы
* 0 = успешно * 1 = не определена база и/или раздел жёсткого диска (подфункциями 7, 8 функции 21) * 2 = функция не поддерживается для данной файловой системы * 3 = неизвестная файловая система * 4 = зарезервировано, никогда не возвращается в текущей реализации * 5 = файл не найден * 6 = файл закончился * 7 = указатель вне памяти приложения * 8 = диск заполнен * 9 = таблица FAT разрушена * 10 = доступ запрещён * 11 = ошибка устройства
При запуске программы возможны также следующие коды ошибок:
* 30 = 0x1E = недостаточно памяти * 31 = 0x1F = файл не является исполнимым * 32 = 0x20 = слишком много процессов