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.