Page 1 of 4

Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Thu Sep 16, 2010 8:45 pm
by FireWall
Решил потренироваться в системном программировании. Возможно косвенные результаты этой тренировки смогут быть полезными для кого-то, кто также решит потренироваться, а возможно и не только.

При первом тренировочном заезде возникли некоторые вопросы и комментарии. Буду очень признателен, если кто-то ответит на вопросы, или поправит меня раньше, чем я разберусь в этом самостоятельно :wink:

Компиляция ядра KolibriOS приводит к файлу размером около 140кб, в то время как в дистрибутиве примерно 80 кб: в дистрибутиве применено сжатие средствами kerpack/Kpack? Или надо отключить отладочную информацию? Как это сделать? (Я использую /kernel/build.bat в MS WindowsXP, fasm.exe [1.68] просто помещён в C:/MinGW/bin, включённый в PATH. Другими способыми (например, из MSys) собрать ядро KolibriOS мне не удалось.)

В файле /kernel/core/syscall.inc имеется две таблицы: servetable и servetable2. Насколько я понимаю, в первую очередь используется servetable2. Обработчики функций, описанные в этой (новой) таблице, уже
- используют неротированные регистры,
- используют иной способ засылки ответов(на 4 меньше) (для eax: mov [esp+32],eax вместо mov [esp+36],eax, как это было указано в статье из первого выпуска e-zine_2006 «Модификация ядра Kolibri OS. Часть 1. Добавление новых функций в ядро »).
Порядок регистров соответствует порядку их загрузки в стек командой pushad:
eax <- [esp+32]
ecx <- [esp+28]
edx <- [esp+24]
ebx <- [esp+20]
esp <- [esp+16] ; esp на момент перед pushad
ebp <- [esp+12]
esi <- [esp+8]
edi <- [esp+4]

[flat assembler 1.68 Programmer's Manual (Tomasz Grysztar):стр.21 ]

Насколько верны эти утверждения?

Насколько я понял, на данный момент происходит постепенный перевод всех обработчиков на новый стиль и работа уже выполнена примерно на 70%. Поэтому ещё не переведенные на новый стиль обработчики вызываются с использованием servetable, посредством вызова функции cross_order. После окончания этой работы таблица servetable будет удалена.
Также в статье нет никаких рекомендаций по поводу того, где размещать саму функцию – обработчик (пока в соответствии с вышеназванной статьёй):

Code: Select all

$Revision: 0001 $

align 4
sys_serverops:
        mov     eax,0x00101010
        mov     [esp+32],eax
        mov     ebx,0x00202020
        mov     [esp+20],ebx
        mov     ecx,0x00303030
        mov     [esp+28],ecx
        mov     edx,0x00404040
        mov     [esp+24],edx
        ret 

На мой взгляд правильным будет вариант, выражающийся в новой строке файла kernel/kernel32.inc :

Code: Select all

; load server base function
include "mickbase/mickbase.inc" 

Таким образом получается, что статья «Модификация ядра Kolibri OS. Часть 1. Добавление новых функций в ядро » нуждается в существенной коррекции.
Может быть уже существует откорректированный - обновлённый вариант этой статьи?

P.S.

(1) Я тестирую KolibriOS на виртуальной машине Oracle VM VirtualBox. Образ диска с разделом FAT виден только если его поместить в виртуальной машине на SATA. Даже собственную дивкету видеть не хочет ... (Версия 0.7.7 ru)

(2) Выход из системы по пункту Home приводит к исключительной ситуации Oracle VM VirtualBox, приводящей к завершению сеанса работы с KolibriOS.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Thu Sep 16, 2010 9:12 pm
by Mario
Компиляция ядра KolibriOS приводит к файлу размером около 140кб, в то время как в дистрибутиве примерно 80 кб: в дистрибутиве применено сжатие средствами kerpack/Kpack?
Для приложений kpack, для ядра kerpack. Kerpack только для среды Колибри -в настоящее время без вариантов. Kpack есть не только для Колибри.
В файле /kernel/core/syscall.inc имеется две таблицы: servetable и servetable2. Насколько я понимаю, в первую очередь используется servetable2.
Если я не ошибаюсь, то одна из таблиц позволяет переопределять вызовы для использования драйверов.
Насколько верны эти утверждения?
Информация склонна устаревать, особенно для ядра и особенно за 4 года - надо смотреть в первую очередь исходники ядра.

Вот здесь http://diamond.kolibrios.org/nightbuild/ выкладываются ночные сборки, стабильность их не всегда высока, но лучше работать с ними при написании кода, поскольку это актуальная версия.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Fri Sep 17, 2010 2:10 am
by art_zh
В файле /kernel/core/syscall.inc имеется две таблицы: servetable и servetable2. Насколько я понимаю, в первую очередь используется servetable2.
Mario wrote:Если я не ошибаюсь, то одна из таблиц позволяет переопределять вызовы для использования драйверов.
Mario: Ошибаешься.

FireWall: Обе таблицы нужны для обращения к сисфункциям из пользовательских программ.
Для драйверов (только в Ring 0) ядро предоставляет расширенный системный сервис - см. /core/exports.inc.

Некоторые их этих функций доступны и из Круга Третьего, с одним "но":
- по прихоти Отца-Основателя (заложившего в систему, помимо всего прочего, замечательную традицию чихать на мнение коллег, если оно не совпадает с твоим собственным)
параметры при экспортируемых и внутриядерных вызовах передавались в регистрах начиная с eax,
тогда как при вызове соответствующей сисфункции eax использовался для передачи ее номера.

Для решения этой (пустяковой, в сущности) проблемки Основатель закрутил в обработчике системных вызовов карусель ротации содержимого ВСЕХ регистов общего назначения, причем раскручивать эту карусель народу приходится до сих пор.

servetable - это рудимент оригинальной менуэтовской таблицы, жить которой (надеюсь) осталось недолго. Управление ей передается через новую таблицу servetable2 (см. поля cross_order последних явно ротируемых сисфункций 53, 58 и 63). Неявная ротация все равно сохранилась во многих местах, но теперь она более-менее оптимизирована под специфику конкретных функций.
Так что если где-нибудь встретишь странный код типа

Code: Select all

mov eax, ebx
mov ebx, ecx
mov ecx, edx
....
знай что это оно и есть.

С возвращаемыми параметрами (если они есть) своя заморочка - внутри ядра и между ядром и драйвером они передаются в тех же регистрах.
А из ядра в приложение их надо передавать в стеке в силу специфики входа в Ring0 по int 40 (метка i40: в core/syscall.inc).
Обрати внимание, что "старые" (ротируемые) сисфункции имеют лишний call, а значит и стек у них будет на 4 байта глубже...

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Fri Sep 17, 2010 4:06 am
by <Lrz>
to FireWall
Уточню некоторые моменты: Упаковать ядро можно и под Windows см мой пост viewtopic.php?f=23&t=1511&p=29044#p29044.
Особенность упаковки в том, что kerpack нужно поместить на fdd, это особенность этой программы. Программа не дает никакого лога. Об успешном выполнении можно судить только по размеру сжатого ядра.

Попробую использовать QEMU.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Fri Sep 17, 2010 9:37 am
by Mario
art_zh
Mario: Ошибаешься.
Так ведь я и не настаивал. А вообще когда я ошибаюсь - я честно признаю свои ошибки.
(заложившего в систему, помимо всего прочего, замечательную традицию чихать на мнение коллег, если оно не совпадает с твоим собственным)
Можно так подумать ты сам не следуешь такому же правилу. А вообще между "чихать на мнение коллег" и "отсутсвует желание реализовывать чужие идеи" есть некоторая и весьма существенная разница. Генеральное различие в политике основателия и политике сообщества Колибри - в Колибри никто не запрещает и никто не отказывается принимать уже готовый код. Это между прочим весьма существенная разница.

<Lrz>
Все-же KlbrInWin не совсем запуск под Виндовс (в отличие от Kpack который таки имеет настоящую версию под Виндовс) - эмуляция ведь, плюс с учетом того что его (эмулятор) некоторые антивирусы объявляют зараженным реализовать приведенную методику будет проблемно, к сожалению.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Fri Sep 17, 2010 10:34 am
by <Lrz>
Mario
Напоминает анекдот про оптимистов и пессимистов. Один считает, что стакан на половину пуст, другой, что на половину полон.
KlbrInWin, это именно запуск используя основную Windows систему, используя эмулятор. На мой взгляд, это единственная возможность упаковать ядро, не в среде Kolibri OS.
И все равно данная методика осуществима, несмотря на "злостное отторжение не кошерного кода KlbrInWin".

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Fri Sep 17, 2010 10:40 am
by Mario
Я не говорил, что "не кошерно", так частное замечание о чистоте метода.
Жаль только, что эмулятор разработчики антивирусов объявили вне закона. :(

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Tue Sep 21, 2010 7:46 pm
by FireWall
Спасибо за уточнения!

Прокомментирую только одно :

Когда я спрашивал по поводу размера ядра, меня прежде всего интересовало, почему у меня 140кб, а в дистрибутиве 70кб (очень примерно). Я беспокоился, что разница обусловлена отладочным кодом. Для меня kerpack легче применить внутри kolibri.img , а затем перенести при помощи редактора образов дискеты. Так что kerpack в MS Windows пока не актуален.

Пока есть ещё один уточняющий вопрос:
Кто нибуть экспериментировал по включению кода на C (грубо говоря) в код ядра KolibriOS?

P.S.

Это я уже спрашиваю в контексте KolibriOS[ia-32-generic] :wink:

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Tue Sep 21, 2010 8:09 pm
by Mario
Никто не мешает писать драйвера на Си. И если я не ошибаюсь именно так Serge делал драйвера видеокарт Ати.

Прямое включение Си кода в ядро не возможно - сомневаюсь, что Fasm скушает такой винегрет. Разве что исхитриться линковкой объектного кода, но я тут не специалист.

А вообще исключительно по моему мнению если переписать ядро Колибри на Си оно возможно не сильно может потерять в скорости, но разбухнет в размерах и потеряет привлекательность - станет серой обыденностью. Все-же Колибри достаточно уникальная ОС.

Я не отрицаю есть много хороших Сишных программистов и они умеют писать свой код хорошо, но также есть много откровенных быдлокодеров при этом свято верующих, что они держатся правильной политики -большое количество мусорного кода (памяти много - че жалеть?) и написание программ стабильная работа которых обеспечивается постоянными снапшотами (компер быстрый - че жалеть?)... грустно это все.

Особенно меня "впечатлило" заявление в интервью («Chaos Constructions-2010») о том что потеря отдельных объектов не смертельна для объектного кода. Было это сказано с весьма убедительным видом.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Tue Sep 21, 2010 11:06 pm
by Serge
FireWall

Kolibri Pe была таким экспериментом. Вполне успешным в плане компиляции. asm часть оформлялась в PE COFF и линковалась с сишным кодом. Потом всё запускалось GRUB. Порядком устаревшие исходники есть на svn в kernel/branches.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Wed Sep 22, 2010 8:14 pm
by FireWall
Цитата:
А вообще исключительно по моему мнению если переписать ядро Колибри на Си оно возможно не сильно может потерять в скорости, но разбухнет в размерах и потеряет привлекательность - станет серой обыденностью.
Идея состоит не в том, чтобы переписать KolibriOS на C, а в том, чтобы использовать C-версию как трамплин при переходе на другую архитектуру (хоть ту же ia-64).

P.S.

Вообще-то у меня есть ещё такая (возможно сомнительная с моральной точки зрения :wink: ) очень отдалённая цель - запустить графическую подсистему KolibriOS в качестве сервера в Minix3 (это отдельное приложение, поэтому "вирус GPL" не распространится на всю Minix3)

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Sat Sep 03, 2011 4:10 pm
by maximYCH
Мммм, как запаковать Виндовской версией kpack'a ядро? В КОСовском варианте есть галочка "Kernel", а вот как быть с виндузятским вариантом?

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Sat Sep 03, 2011 4:29 pm
by Serge
Ядро пакуется kerpack-ом.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Sat Sep 03, 2011 4:35 pm
by maximYCH
Я знал, но я не нашел kerpack для Windows. Я подумал, что раз kpack в KOS имеет галочку "kernel", то его научили паковать и приложения, и ядро.

Re: Модификация ядра Kolibri OS: уточняющие вопросы

Posted: Sat Sep 03, 2011 4:42 pm
by Serge
kerpack для Windows не делали.