Page 7 of 10

Posted: Tue May 15, 2007 4:22 pm
by diamond
Mario79 wrote:Кстати, а Diamond согласился с переписыванием KFAR? Он вообще в курсе.
Скажем так: я в курсе (как и практически всего происходящего в svn-репозитории), но возражаю. Причём это относится не только к kfar, но и ко всем программам вообще. По следующим причинам:
1) Команда "int 0x40" занимает 2 байта. Макрос "mcall" для sysenter в типичной ситуации - 12 байт. Для syscall - 4 байта. Напоминаю, что Колибри позиционируется не только как быстрая ОС, но и как маленькая ОС. При замене "int 0x40" -> "mcall" быстрая система медленной определённо не станет, а вот раздувание всех приложений, причём на существенную величину (10 байт на каждый системный вызов, а таких вызовов даже в банальном "Hello, World" около десятка - что уж говорить о серьёзных приложениях), не пройдёт незамеченным.
2) Не имеет смысла все системные вызовы оптимизировать по скорости. В среднем 90% времени программы уходит на 10% её кода, так? То есть в 90% кода заведомо не нужна предельная скорость, а вот размер...
3) Системный вызов заключается не только в переходе между 3-кольцом и 0-кольцом, а ещё и производит некоторую работу в 0-кольце. Если это обращение к дискете (функции 58 и 70), то нет абсолютно никакой выгоды в "fast system call".
4) Макросы - это только макросы и не учитывают текущей ситуации. Простейший пример: для syscall есть команды "push ecx/pop ecx". Допустим, мы вызываем сисфункцию, не использующую ecx (а таких довольно много - скажем, 10/11/23, 12.1/12.2, 2, 17 - основной цикл большинства программ, между прочим). Тогда нам не нужно сохранять/восстанавливать ecx, а достаточно иметь на стеке зарезервированный dword. Если идёт серия таких вызовов, то достаточно сделать "push ecx" в начале и "pop ecx" в конце. Другая ситуация: мы явно инициализируем ecx, например, константой 4. Тогда получится "mov ecx,4/push ecx" при "purge mov" или даже "push 4/pop ecx/push ecx" без "purge mov", в то время как достаточно обычного "push 4".
5) Совместимость страдает. Кстати к вопросу о совместимости: на каком минимальном процессоре работает Колибри? Вроде бы сейчас требуется наличие rdtsc, т.е. минимум Пень, и его достаточно. Это так?
6) При таком подходе требуется ко всем программам подключать macros.inc. Допустим, некто оптимизировал какую-нибудь программу по скорости до такта (или не всю программу, а некоторый цикл - это выглядит более реалистично), а потом некто другой просто подключил macros.inc. И вот результат - mov,add,sub превратились в непонятно что и скорость уменьшилась, а размер, естественно, увеличился (см. пункт 1). Кроме того, лично я, когда пишу "mov", хочу быть уверенным, что это именно "mov", если я хочу видеть "push x/pop y", я так и напишу. Конечно, можно везде писать "purge mov,add,sub", но неудобно же...

Конструктивное предложение: создать файл, скажем, fastcall.inc с единственным макросом mcall_fast. В критических участках приложений (и только в них) заменить "int 0x40"/"mcall" на "mcall_fast", а "mcall" оставить синонимом "int 0x40". По крайней мере, это решает пункты 2,3,6 и снимает остроту пункта 1.

Posted: Tue May 15, 2007 5:46 pm
by Heavyiron
Поэкспериментировал немного: размер всех программ на свн при "int 0x40" и при SYSENTER отличается где-то ~ на 30 kb в несжатом виде и ~ 14 кб после сжатия kpack-ом. После запихивания их всех в образ, разница составила еще меньше - 7 кб. Вроде не такое уж и страшное раздувание для сотни программ даже в пределах дискеты, от которой уже начали по-немногу уходить.

Posted: Wed May 16, 2007 4:34 pm
by diamond
Пересказываю свой предыдущий пост вкратце:
1) Происходит раздувание программ.
2)3) Происходит ненужное раздувание программ.
4) Происходит лишнее раздувание программ.
5) Теряется совместимость.
6) Наличествуют теневые эффекты.

Posted: Thu May 17, 2007 6:04 am
by Heavyiron
Залил исправления для fasm, period, sysxtree, https, chess, pong, некоторые косметические изменения исходников (благодарю diamond-а за замечания).
По поводу vrr - повторить не удалось, вроде все работает; skinsel окна не имеет и меняет скин только при наличии нескольких скинов в образе, которые к тому же должны быть прописаны в файле настроек. Со scrshoot пока ситуация подвисает... либо полностью переписывать программу на общий скин, либо менять editbox, чтобы он не использовал макросы.
diamond
В принципе, я согласен с тем, что быстрый вызов нужен не везде, но теперь менять все назад и заниматься выбором критических мест, где ускорение нужно 1) самому как-то не хочется; 2) учитывая объем работы, не думаю, что кто-то другой за это возьмется
По поводу пункта 6:
при простой замене int 0x40 на пустой mcall в принципе ничего не изменилось - если использовать ключ "р5", то на выходе получится абсолютно идентичный код, со всеми оптимизациями. А если бояться несовместимости и ненужного раздувания, то можно просто не использовать быстрые вызовы в официальном дистрибутиве, а оставить их как возможность для желающих чуть увеличить скорость за счет некоторого увеличения размеров бинарников.

Posted: Thu May 17, 2007 7:26 am
by Mario79
Heavyiron
С VRR вопрос не в твоих изменения похоже, он и в обычном виде не запускается.

Posted: Thu May 17, 2007 10:16 am
by DmitrySokolowsky
Heavyiron, даже если официальный дистрибутив не будет использовать быстрые вызовы, лично для меня ничего не изменится, потому что я каждый день обновляю систему с svn

Posted: Thu May 17, 2007 3:45 pm
by Heavyiron
Mario79, а ты не забыл обновить vmode.mdr на тот, что требуется для плоского ядра? Просто реально у меня vrr работает в любом виде: хоть с быстрыми вызовами, хоть без них.

Posted: Thu May 17, 2007 3:50 pm
by Mario79
Heavyiron
Не помню точно, но вроде обновлял. Вечером проверю, возможно дело в этом.

Posted: Thu May 17, 2007 4:35 pm
by diamond
Heavyiron wrote:В принципе, я согласен с тем, что быстрый вызов нужен не везде, но теперь менять все назад
Отменить всё назад как раз-таки несложно: "svn merge -r 485:484 programs programs" (из корневого каталога локальной копии репозитория с последующим "svn commit").

Posted: Thu May 17, 2007 4:49 pm
by Heavyiron
Ну так блин, я же там не только int 0x40 на mcall менял...

Posted: Fri May 18, 2007 12:33 pm
by Mario79
Heavyiron
Вопрос с VRR снят, на ядре 506 все запустилось. Правда проверял без FAST CALL, но думаю проблем не будет.

Posted: Fri May 18, 2007 9:00 pm
by DmitrySokolowsky
Ревизия 510

Fasm при попытке скомпилировать ppp.asm просто вырубился без всяких сообщений.
Kfm при попытке запустить неподдерживаемый файл (avi) так же вырубился без сообщений.
Подозреваю, что при более внимательном тестировании может всплыть ещё несколько подобных глюков с другими программами

Posted: Sat May 19, 2007 11:53 pm
by Leency
Ревизия 511, может и на предыдущих это наблюдается (скорее всего).

Решил провести такой вот эксперимент - захожу в КФМ (сс...ка масдайная языковая панель), оттуда запускаю 3Д\teapot.3ds нажатием энтера. Курсор в окне. После открытия спустя секунду жму Альт+Ф4. Такое проделываю 3 раза. И каждый раз после третьего раза закрытия исчерает курсор. Проделано 3 раза. Случайность?
Тоже самое с house.3ds
Далее я открыл 3dcube2 и опять нажал Альт+Ф4, курсор исчез сразу (на этом моменте мне надоело "эксперементировать" и я пошол сюда писать этот пост)

Posted: Sun May 20, 2007 10:33 am
by Heavyiron
Leency, к фастколам этот баг не имеет отношения, причем он довольно древний.

Posted: Mon May 21, 2007 7:22 am
by Mario79
Leency
Это древний как сама Колибри баг. :-)
Возникает если в момент завершения приложения курсор отключен. Для устранения требуется полное переписывание кода вывода курсора.