Board.KolibriOS.org

Official KolibriOS board
It is currently Sun May 19, 2019 11:42 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 21 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Wed Sep 19, 2012 8:43 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
В результате сравнения дистрибутивов возникли следующие замечания (повторю их из соседней ветки «0.7.7.0 и текущее состояние: (1) сравнение API ядра»):

(1) Функция 43 - ввод/вывод в порт. Скорее всего должна быть объявлена устаревшей! (Ибо функция для резервирования портов (SysFn 46) уже объявлена устаревшей, а без предварительного резервирования портов, функция 43 неработоспособна.) .

Функция 46 - зарезервировать/освободить группу портов ввода/вывода. Объявлена устаревшей!

(2) На мой взгляд, некоторые функции должны быть также объявлены устаревшими, а может быть удалены:

Функция 6 - прочитать файл с рамдиска.
Функция 7 - вывести изображение в окно.
Функция 64 - перераспределить память приложения.

(3) Также, на мой взгляд, следует ещё раз обратить внимание на обращение к видео фрейм-буферу через селектор gs. (Может быть лучше просто добавить функцию, отображающую его в адресное пространство приложения. + (1) более стандартный способ доступа, + (2) в будущем возможность контролировать, например, единственность такого доступа в каждый данный момент)

(4) Следует также обратить внимание на:

Функция 26 (Получение параметров системы.) требует серьёзного рассмотрения на предмет устаревших подфункций.
Функция 58 (- работа с файловой системой ) возможно требует некоторой переработки.

Возникла также дискуссия по поводу SysFn 58. Реакция на эту дискуссию, а также на чат в следующем сообщении.


Top
   
PostPosted: Wed Sep 19, 2012 8:49 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
В целях проверки необходимости той или иной системной функции собрал модифицированное ядро KolibriOS :)

(1) Изменил поведение неопределённых системных функций:

Файл kernel.asm :

Spoiler: Show
Code:
; FireWall
paleholder:
       
        mov      esi, paleholder_data0
        call    sys_msg_board_str
       
        mov     eax, [CURRENT_TASK]
        call   sys_msg_board_byte
       
        mov      esi, paleholder_data1
        call    sys_msg_board_str
       
        mov      eax, [esp + 32]
        call   sys_msg_board_byte
       
        mov      esi, paleholder_data2
        call    sys_msg_board_str
        call    sys_end

        ret


paleholder_data0:
      db      'K: slot:[', 0
      
paleholder_data1:
      db      '] SysFn:[', 0

paleholder_data2:
        db      '] ERROR:paleholder!', 0x0d, 0x0a, 0
; END FireWall


Файл kernel.asm :
Code:
; FireWall
align 4

undefined_syscall:      ; Undefined system call
      ;push    esi
      ;push   eax
      
      mov      esi, paleholder_data0
        call    sys_msg_board_str
       
        mov     eax, [CURRENT_TASK]
        call   sys_msg_board_byte
       
        mov      esi, paleholder_data1
        call    sys_msg_board_str
       
        mov      eax, [esp + 32]
        call   sys_msg_board_byte
      
        mov      esi, wb_udf_sysc_date
        call    sys_msg_board_str
        call    sys_end
       
        ;pop      eax
        ;pop     esi
        mov     [esp + 32], dword -1
        ret

wb_udf_sysc_date:
        db      '] ERROR:Undefined syscall!',0x0d, 0x0a, 0
; END FireWall


Теперь применение неопределённых системных функций приводит к завершению потока с отладочным сообщением вроде: K: slot:[xx] SysFn:[xx] ERROR:Undefined syscall!


(2) Я попытался отключить SysFn 58 и отловить приложения, которые из за этого не будут работать. Скрупулёзно не проверял, но вроде все приложения из дистрибутива работают. Точно работают:
- Pig ;
- все трёхмерные демо;
- @panel , rtfreader, pong3, fasm, animage, Kpack.

P.S.

Для отключения SysFn 58 внёс изменения в core/syscall.inc

Spoiler: Show
Code:
; FireWall
      dd undefined_syscall       ; 56-reserved
      ;dd cross_order             ; 58-Common file system interface
; END FireWa
ll


Файл kos_kernel_syfn_check.7z содержит исходники модифицированных файлов ядра (против trunk , снятого 18.09.2012), а также само модифицированное ядро Kolibri OS.


Attachments:
kos_kernel_syfn_check.7z [106.1 KiB]
Downloaded 145 times
Top
   
PostPosted: Wed Sep 19, 2012 8:54 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
Добавлю ещё некоторые замечания:

(3) Если посмотреть на
Code:
 align 4
  servetable:
      dd socket                  ; 53-Socket interface
      dd 0
      dd 0
      dd 0
      dd 0
      dd file_system             ; 58-Common file system interface
      dd 0
      dd 0
      dd 0
      dd 0                       ; 62-PCI functions
      dd sys_msg_board           ; 63-System message board


то можно заметить, что только в трёх системных функциях не раскручена «карусель регистров». Если удалить SysFn 58 , раскрутить SysFn 63 (что не выглядит слишком сложным), crossorder переместить вместе с
align 4

Code:
socket:                                 ; Socket interface
        call    app_socket_handler

;     mov   [check_idle_semaphore],5    ; enable these for zero delay
;     call  change_task                 ; between sent packet

        mov     [esp+36], eax
        mov     [esp+24], ebx
        ret

в network/stack.inc , то «раскрутку карусели» можно считать практически законченной (особенно с учётом того, что пишется новый сетевой стек, а значит 53-Socket interface скоро станет устаревшей и тратить время на её модификацию большого смысла нет).

(4) Если посмотреть начальный код обработчика прерывания int 40h :
Code:
i40:
        pushad
        cld
        movzx   eax, al
        call    dword [servetable2 + eax * 4]
        popad
        iretd


- нельзя не заметить, что для номера функции реально используется только al , а не весь eax. Учитывая тот факт, что более чем 200 системных функций для KolibriOS вряд ли потребуется, то это поведение надо бы задокументировать. Это можно сделать, например, заменив текст документации:
«Перед вызовом следует указать в eax номер системной функции. »
на
«Перед вызовом следует указать в al номер системной функции. »
а также:
«Функция -1 - завершить выполнение потока/процесса
Параметры:
eax = -1 - номер функции

»
на
«Функция 0xff - завершить выполнение потока/процесса
Параметры:
al = 0xff - номер функции
[Примечание: вполне допустимо поместить в eax -1 ,например, кодом:
xor eax, eax
dec eax ]

»

Подобное изменение документации позволит для новых системных функций использовать ah, а также более старшие биты (байты) для чего-то ещё. Например, подфункцию 15 SusFn 86 (это просто пример) сейчас приходится вызывать, например так:
Code:
xor   eax, eax
mov   ebx, eax
mov   al, 86
mov   bl, 15
int   40h

Если для подфункций испоьзовать ah, то вызов можно сделать кодом:
Code:
mov   ax, 15*256 + 86  ; теперь старшие байты обнулять не нужно!
int   40h


Top
   
PostPosted: Wed Sep 19, 2012 9:34 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1328
FireWall wrote:
... позволит для новых системных функций использовать ah, а также более старшие биты (байты) для чего-то ещё. ...

не будет этого, аминь.
Code:
i40:
        pushad
        cld
        movzx   eax, al
        call    dword [servetable2 + eax * 4]
        popad
        iretd

FireWall wrote:
...; теперь старшие байты обнулять не нужно!

да их и сейчас вообще-то не обязательно обнулять (в "возвращаемых" функциях API их всё равно затрёт)


Top
   
PostPosted: Thu Sep 20, 2012 11:48 am 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
Цитата: "да их и сейчас вообще-то не обязательно обнулять (в "возвращаемых" функциях API их всё равно затрёт)"

Так вот это и надо задокументировать :) Иначе программист обязан следовать документации - обнулять старшие байты.

НО - это обязывающее решение: тем самым число системных функции ограничивается числом <255.

Цитата: "не будет этого, аминь."

Я не хотел сказать, что в будущем надо бы переделать имеющиеся функции так, чтобы номер подфункции был в ah. Но
- есть "нерасширяемые" функции, в которых ebx используется для чего-то другого (если позволить для них номер подфункции помещать в ah, то появляется возможность их расширения);
- в будущем будут новые функции ...

(Надеюсь, что Вы не хотели цитатой из кода сказать, что старшие байты затираются. Их можно восстановить, хоть тем же тупым
mov eax, [esp + 32] ; это по старому
точнее
mov eax, [esp + 28]
Это так - на всякий случай :wink: )


Top
   
PostPosted: Thu Sep 20, 2012 12:09 pm 
1) Я думаю менять сложившуюся систему будет огромным геморроем.
2) Не надо торопиться удалять функции - не такая уж большая экономия получится.
3) Приложения требуют гораздо большего внимания - много чего надо исправлять, переделывать и дополнять.


Top
   
PostPosted: Thu Sep 20, 2012 1:14 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
Моя реплика , соответственно :
1) Не менять, а дополнить, но обязательно задокументировать то, что есть de facto.
2) Торопиться удалять не надо, но нужно (торопиться) объявить устаревшими.
3) Раз уж Kolibri OS имеет монолитную архитектуру, то новая версия Kolibri OS - это (прежде всего) новая версия ядра, а не приложений.

P.S.

Есть ещё одно хитрое решение:
удалить из документации, реально не удаляя :D


Top
   
PostPosted: Thu Sep 20, 2012 6:11 pm 
FireWall wrote:
Есть ещё одно хитрое решение:
удалить из документации, реально не удаляя :D

Я против. Нам только не хватало искусственно созданных недокументированных возможностей.
Самый рациональный способ уже применялся - функция удаляется после переписывания всех приложений ее использующих.


Top
   
PostPosted: Thu Sep 20, 2012 8:40 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
Цитата: "Самый рациональный способ уже применялся - функция удаляется после переписывания всех приложений ее использующих."

На том и остановимся : ловим (пока безуспешно :) ) и исправляем для начала относительно SysFn 58 :(


Top
   
PostPosted: Fri Sep 21, 2012 7:06 am 
Если Quake кто-нибудь сподобится пересобрать (только не я! в силу известных причин), то вопрос с ней можно закрывать. А вот с 7-й функцией советую не торопиться - немало программ ее используют.


Top
   
PostPosted: Fri Sep 21, 2012 2:41 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
В начале нужно убедиться, что Quake не работает : где бы найти этот gfx.wad . Без него программа не работает, но для его поиска SysFn58 не используется (т.е. - я запускал эту программу, но без gfx.wad , так что поиграть не смог).

В контексте SysFn26 речь может идти только о некоторых подфункциях (признание их устаревшими). В целом она несомненно нужна.

SysFn7 действительно используется очень часто (в.т.ч. её использует Eolite). В контексте этой функции может быть только дискуссия по поводу её признания устаревшей.

Следующая, из выше названных функций по использованию : SysFn64. Вот её как раз использует и Pig, Quake, и трёхмерные демо (правда не все, но сам просмотрщик использует, что самое главное).

----------------- дополнение :

Цитата: "может быть только дискуссия"

На самом деле SysFn7 очень удобна для случая, когда надо отображать сгенерированные в памяти элементы изображения. Так что можно спорить по поводу того, признавать ли её устаревшей.


Last edited by FireWall on Fri Sep 21, 2012 8:52 pm, edited 1 time in total.

Top
   
PostPosted: Fri Sep 21, 2012 3:23 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 794
Рекомендую оформить это в виде багов - bugs.kolibrios.org


Top
   
PostPosted: Fri Sep 21, 2012 3:26 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
FireWall
SysFn64 аналог sbrk(). Без неё надо править malloc menuetlibc.


Top
   
PostPosted: Fri Sep 21, 2012 4:58 pm 
Еще KFM завязан на 64 функцию.


Top
   
PostPosted: Fri Sep 21, 2012 8:49 pm 
Offline

Joined: Wed Sep 15, 2010 7:22 pm
Posts: 101
Цитата: "Рекомендую оформить это в виде багов - bugs.kolibrios.org"

На самом деле это не баг - функция даже не была объявлена устаревшей.

Цитата: "Без неё надо править malloc menuetlibc."

malloc menuetlibc (и другие библиотеки, если они используют устаревшие функции) - это первое, что надо править. Всё остальное - потом

P.S.

И в контексте SysFn64 , к 0.8.0 сможем только объявить устаревшей.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 21 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited