Fast System Call
-
Mario79, а ты не забыл обновить vmode.mdr на тот, что требуется для плоского ядра? Просто реально у меня vrr работает в любом виде: хоть с быстрыми вызовами, хоть без них.
Heavyiron
Не помню точно, но вроде обновлял. Вечером проверю, возможно дело в этом.
Не помню точно, но вроде обновлял. Вечером проверю, возможно дело в этом.
Отменить всё назад как раз-таки несложно: "svn merge -r 485:484 programs programs" (из корневого каталога локальной копии репозитория с последующим "svn commit").Heavyiron wrote:В принципе, я согласен с тем, что быстрый вызов нужен не везде, но теперь менять все назад
Ну так блин, я же там не только int 0x40 на mcall менял...
Heavyiron
Вопрос с VRR снят, на ядре 506 все запустилось. Правда проверял без FAST CALL, но думаю проблем не будет.
Вопрос с VRR снят, на ядре 506 все запустилось. Правда проверял без FAST CALL, но думаю проблем не будет.
Ревизия 510
Fasm при попытке скомпилировать ppp.asm просто вырубился без всяких сообщений.
Kfm при попытке запустить неподдерживаемый файл (avi) так же вырубился без сообщений.
Подозреваю, что при более внимательном тестировании может всплыть ещё несколько подобных глюков с другими программами
Fasm при попытке скомпилировать ppp.asm просто вырубился без всяких сообщений.
Kfm при попытке запустить неподдерживаемый файл (avi) так же вырубился без сообщений.
Подозреваю, что при более внимательном тестировании может всплыть ещё несколько подобных глюков с другими программами
Ревизия 511, может и на предыдущих это наблюдается (скорее всего).
Решил провести такой вот эксперимент - захожу в КФМ (сс...ка масдайная языковая панель), оттуда запускаю 3Д\teapot.3ds нажатием энтера. Курсор в окне. После открытия спустя секунду жму Альт+Ф4. Такое проделываю 3 раза. И каждый раз после третьего раза закрытия исчерает курсор. Проделано 3 раза. Случайность?
Тоже самое с house.3ds
Далее я открыл 3dcube2 и опять нажал Альт+Ф4, курсор исчез сразу (на этом моменте мне надоело "эксперементировать" и я пошол сюда писать этот пост)
Решил провести такой вот эксперимент - захожу в КФМ (сс...ка масдайная языковая панель), оттуда запускаю 3Д\teapot.3ds нажатием энтера. Курсор в окне. После открытия спустя секунду жму Альт+Ф4. Такое проделываю 3 раза. И каждый раз после третьего раза закрытия исчерает курсор. Проделано 3 раза. Случайность?
Тоже самое с house.3ds
Далее я открыл 3dcube2 и опять нажал Альт+Ф4, курсор исчез сразу (на этом моменте мне надоело "эксперементировать" и я пошол сюда писать этот пост)
Leency, к фастколам этот баг не имеет отношения, причем он довольно древний.
Leency
Это древний как сама Колибри баг.
Возникает если в момент завершения приложения курсор отключен. Для устранения требуется полное переписывание кода вывода курсора.
Это древний как сама Колибри баг.
Возникает если в момент завершения приложения курсор отключен. Для устранения требуется полное переписывание кода вывода курсора.
Как я понял проблема в том что на разных процах разные команды системных вызовов.diamond wrote: ...Совместимость страдает...
А если внедрять процедуру вызова в тело приложения при загрузке, а затем использовать обыкновенным call-ом.
А для приложений для которых трата тактов проца на обработку call/ret покажется лишней, добавить в заголовок флаги для определения типа системного вызова т.е. запретить запуск таких прог на неподдерживаемом оборудовании.
Вот примерный набросок шапки для новых приложений.(Сильно не пинайте, я пока с ассемблером не очень)
Code: Select all
use32
org 0x0
;--------------------------------------------------------------
db 'KoOS__01' ; новый 8-байтный идентификатор KolibriOS
;--------------------------------------------------------------
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка
dd 0x0 ; адрес буфера для параметров (не используется)
dd 0x0 ; зарезервировано
;-------------------------------------------------------------
db 0 ; флаг использования системных вызовов
; служит для определения системой программ привязанных к железу
; тип xxxxxxBA (биты)
; A=1-возможно отдельное использование быстрого вызова для intel
; B=1-возможно использование быстрого вызова для amd
; x-пока не придумал
db 12 ; количество зарезервированных байтов
; для процедуры системного вызова
;-------------------------------------------------------------
k_scall: ; Резерв для процедуры системного вызова.
int 0x40 ; Здесь при загрузке приложения
ret ; система помещает тот вариант вызова,
nop ; который наиболее эффективен для
nop ; данного компа.
nop ; остальное заполняется 'nop'
nop
nop ; Размер резерва должен быть равен или чуть больше
nop ; размеру максимальной по обьему процедуре вызова.
nop
nop
ret
;-------------------------------------------------------------
А проги со старой шапкой по прежнему будут юзать int 0x40
Что думаете?
Alver
Тоже самое можно сделать и внутри программы
В таком случае на каждый вызов будет тратиться шесть байт
Тоже самое можно сделать и внутри программы
Code: Select all
mov eax, 1
cpuid
bt edx, CAPS_SEP
jnc @F
mov [sys_call], fast_call
@@:
.......
.......
.......
.......
call [sys_call]
align 4
int_call:
int 0x40
ret
align 4
fast_call:
......
......
......
sysenter
sys_call dd int_call
В таком случае на каждый вызов будет тратиться шесть байт
Вот незадача в моей шапке оказывается еще пару байтов перед k_scall надо всунуть, для кратности, если опять не обшибся.
Serge
Можно и так, только мне кажется будет лучше если
sys_call dd int_call
будет в шапке шаблона программы. Как я понял все проги компилируются под org 0x0, а значит если адрес системного входа будет фиксирован, то подгружаемые библиотеки и модули смогут обращаться непосредственно через него не мутя собственных определителей.
Serge
Можно и так, только мне кажется будет лучше если
sys_call dd int_call
будет в шапке шаблона программы. Как я понял все проги компилируются под org 0x0, а значит если адрес системного входа будет фиксирован, то подгружаемые библиотеки и модули смогут обращаться непосредственно через него не мутя собственных определителей.
Появилась идея уйти от "заворачивания" регистров. Как показали испытания прирост по скорости получился не большим, но он всётаки есть....
Итак, чтобы сделть переход более мягким и не перелопачивать всё ядро за раз была введена новая таблица системных вызовов servetable2, в которую помещаются адоптированные вызовы. В новой версии в обработчик регистры приходят в том виде в каком они устанавливаются в программе (т.е. eax в программе это eax в обработчике). Возвращаемые регистры сохраняются на 4 байта ниже чем раньше (eax - [esp + 32] а не [esp + 36]). Пока адоптировано мало функций (-1, 2, 10, 12, 19 и 23) поэтому на svn не выкладываю, взять модифицированные файлы для #667 можно здесь.
Жду комментариев ).
P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
Итак, чтобы сделть переход более мягким и не перелопачивать всё ядро за раз была введена новая таблица системных вызовов servetable2, в которую помещаются адоптированные вызовы. В новой версии в обработчик регистры приходят в том виде в каком они устанавливаются в программе (т.е. eax в программе это eax в обработчике). Возвращаемые регистры сохраняются на 4 байта ниже чем раньше (eax - [esp + 32] а не [esp + 36]). Пока адоптировано мало функций (-1, 2, 10, 12, 19 и 23) поэтому на svn не выкладываю, взять модифицированные файлы для #667 можно здесь.
Жду комментариев ).
P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
...но только до тех пор, пока число системных вызовов не превысит 256, а потом при таких "оптимизациях" начнутся жуткие проблемы... так что не стоит это использовать.P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
Ушёл к умным, знающим и культурным людям.
Ghost
Таблица вызовов подменяется при компиляции ядра?
xor eax,eax
mov al, значение
10.32 МСК
P.S. Пересеклись с Diamond'ом не специально.
Таблица вызовов подменяется при компиляции ядра?
На это не стоит сильно расчитывать, все равно когда-нибудь кличество функций превысит 255, в результатае некоторые программы придется переписывать. Лучше уж сразу:P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
xor eax,eax
mov al, значение
10.32 МСК
P.S. Пересеклись с Diamond'ом не специально.
Who is online
Users browsing this forum: No registered users and 37 guests