Page 1 of 2

Добавить функцию в ядро

Posted: Fri Oct 28, 2005 11:46 am
by ealex
Расскажите, пожалуйста, как добавить свою функцию в ядро.

И еще вопрос, можно ли из самой программы (не из ядра) читать/писать в порты?

Posted: Fri Oct 28, 2005 5:21 pm
by Иван Поддубный
В файле core/syscall.inc после метки servetable по порядку заданы адреса всех системных функций.
Для добавления новой (69) функции, в конец списка (после dd sys_internal_services) следует добавить строчку вида
dd my_sys_function

Значения регистров в функции меняются следующим образом:
(в программе -> в обработчике)
eax -> edi
ebx -> eax
ecx -> ebx
edx -> ecx
esi -> edx
edi -> esi

Изменяемые в обработчике регистры ни на что не влияют, так что нет необходимости их сохранять.
Регистры eax, ebx, ecx программы можно изменять через [esp+36], [esp+32], [esp+24] соответственно.

Если в обработчик передается указатель (адрес), для использования его в ядре нужно прибавить std_application_base_address.

Posted: Fri Oct 28, 2005 7:13 pm
by ealex
Спасибо. Этот вопрос и ответ можно в FAQ добавить.

Posted: Fri Oct 28, 2005 9:29 pm
by Mario79
Работать с портами из приложений возможно. Нужно лишь зарезервировать их предварительно функцией 46.

Posted: Sat Oct 29, 2005 10:05 pm
by NoName
Только нужно обратить внимание на то что в документации кое где перепутано кое что.

Posted: Mon Oct 31, 2005 5:43 pm
by andrew_programmer
Совершенно верно,перепутано.
В описании 43 функции сказано,что для записи в порт нужно в bx записывать номер порта,а в cl данные.На самом деле все наоборот - в сх номер порта,а в bl данные.Нужно исправит ошибку,ато еще подумают,что в Меос/Колибри нельзя работать с портами.

Posted: Mon Oct 31, 2005 6:06 pm
by Иван Поддубный
Есть вариант - убрать эту функцию из документации, потому что можно пользоваться обычными in/out.

Posted: Mon Oct 31, 2005 6:39 pm
by andrew_programmer
Тогда начинающим МЕОС/Колибри программистам будет трудно понять исходники PPP звонилки от Майка Хаббета.

Posted: Thu Dec 08, 2005 11:44 am
by willow
Коллеги! Какой диапазон портов доступен для резервирования (мне нужны 70h и 71h). И можно ли использовать in/out? Разве приложение не умирает?

Posted: Thu Dec 08, 2005 12:03 pm
by NoName
Умирает. Поддубный наверное имел ввиду что все будут создавать свои фунции на 0 уровне %).

Posted: Thu Dec 08, 2005 5:54 pm
by Иван Поддубный
Порты от 0 до 0xFF и некоторые другие уже зарезервированы системой, и функция 46 должна возвращать соответствующий результат.
in/out пользовать можно и нужно, но только для зарезервированных портов.

Posted: Fri Dec 09, 2005 11:04 am
by willow
Ответьте, пожалуйста, по существу: я смогу записать байт в порты 0x70 и 0x71, и как это сделать в Ring-3?

Posted: Fri Dec 09, 2005 3:06 pm
by Иван Поддубный
willow
Ответ уже есть, но могу повторить еще раз:
Порты 0x70, 0x71 зарезервированы системой. Использовать их в пользовательском режиме нельзя.
И даже если захочется, то 46ая функция при попытке резервирования вернет ошибку.

Posted: Sat Dec 10, 2005 4:50 pm
by Mario79
Willow
Не знаю, зачем тебе порты 70 и 71 программировать из приложения, но если ты задумал сделать установку даты и времени, то такая функция уже есть. Так что не надо мучиться. Михаил Лисовин ее сделал. Она есть, в ядре начиная с K0500, точно не помню, но в К0510 уже точно есть, само собой есть и будет в последующих. Номер 22. В sysfuncr.txt есть описание.

Posted: Mon Dec 12, 2005 11:04 am
by willow
Да это я так, хотел из Menuet снять пароль BIOS :-)