Fast System Call

Internal structure and you change requests/suggestions
  • Heavyiron
    Не помню точно, но вроде обновлял. Вечером проверю, возможно дело в этом.
  • Heavyiron wrote:В принципе, я согласен с тем, что быстрый вызов нужен не везде, но теперь менять все назад
    Отменить всё назад как раз-таки несложно: "svn merge -r 485:484 programs programs" (из корневого каталога локальной копии репозитория с последующим "svn commit").
  • Ну так блин, я же там не только int 0x40 на mcall менял...
  • Heavyiron
    Вопрос с VRR снят, на ядре 506 все запустилось. Правда проверял без FAST CALL, но думаю проблем не будет.
  • Ревизия 510

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

    Решил провести такой вот эксперимент - захожу в КФМ (сс...ка масдайная языковая панель), оттуда запускаю 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
    ;-------------------------------------------------------------
    
    Теперь вызов системных функций из приложения - call k_scall

    А проги со старой шапкой по прежнему будут юзать 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, а значит если адрес системного входа будет фиксирован, то подгружаемые библиотеки и модули смогут обращаться непосредственно через него не мутя собственных определителей.
  • Появилась идея уйти от "заворачивания" регистров. Как показали испытания прирост по скорости получился не большим, но он всётаки есть....
    Итак, чтобы сделть переход более мягким и не перелопачивать всё ядро за раз была введена новая таблица системных вызовов servetable2, в которую помещаются адоптированные вызовы. В новой версии в обработчик регистры приходят в том виде в каком они устанавливаются в программе (т.е. eax в программе это eax в обработчике). Возвращаемые регистры сохраняются на 4 байта ниже чем раньше (eax - [esp + 32] а не [esp + 36]). Пока адоптировано мало функций (-1, 2, 10, 12, 19 и 23) поэтому на svn не выкладываю, взять модифицированные файлы для #667 можно здесь.
    Жду комментариев ).

    P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
  • P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
    ...но только до тех пор, пока число системных вызовов не превысит 256, а потом при таких "оптимизациях" начнутся жуткие проблемы... так что не стоит это использовать.
    Ушёл к умным, знающим и культурным людям.
  • Ghost
    Таблица вызовов подменяется при компиляции ядра?
    P.S. Может кому пригодится, номер системной функции (во всех версиях ядра) передаётся не через eax а через al, старшие 24 бита обнуляются ядром, на этом можно экономить размер программы.
    На это не стоит сильно расчитывать, все равно когда-нибудь кличество функций превысит 255, в результатае некоторые программы придется переписывать. Лучше уж сразу:
    xor eax,eax
    mov al, значение


    10.32 МСК
    P.S. Пересеклись с Diamond'ом не специально. :mrgreen:
  • Who is online

    Users browsing this forum: No registered users and 34 guests