Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт окт 19, 2017 2:04 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 21 сообщение ]  На страницу 1 2 След.
Автор Сообщение
СообщениеДобавлено: Ср сен 19, 2012 8:43 pm 
Не в сети

Зарегистрирован: Ср сен 15, 2010 7:22 pm
Сообщения: 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. Реакция на эту дискуссию, а также на чат в следующем сообщении.


Вернуться к началу
СообщениеДобавлено: Ср сен 19, 2012 8:49 pm 
Не в сети

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

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

Файл kernel.asm :

Спойлер: Показать
Код:
; 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 :
Код:
; 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

Спойлер: Показать
Код:
; 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.


Вложения:
kos_kernel_syfn_check.7z [106.1 КБ]
99 скачиваний
Вернуться к началу
СообщениеДобавлено: Ср сен 19, 2012 8:54 pm 
Не в сети

Зарегистрирован: Ср сен 15, 2010 7:22 pm
Сообщения: 101
Добавлю ещё некоторые замечания:

(3) Если посмотреть на
Код:
 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

Код:
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 :
Код:
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 (это просто пример) сейчас приходится вызывать, например так:
Код:
xor   eax, eax
mov   ebx, eax
mov   al, 86
mov   bl, 15
int   40h

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


Вернуться к началу
СообщениеДобавлено: Ср сен 19, 2012 9:34 pm 
Не в сети
Kernel Developer
Аватара пользователя

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

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

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

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


Вернуться к началу
СообщениеДобавлено: Чт сен 20, 2012 11:48 am 
Не в сети

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

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

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

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

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

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


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


Вернуться к началу
   
СообщениеДобавлено: Чт сен 20, 2012 1:14 pm 
Не в сети

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

P.S.

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


Вернуться к началу
СообщениеДобавлено: Чт сен 20, 2012 6:11 pm 
FireWall писал(а):
Есть ещё одно хитрое решение:
удалить из документации, реально не удаляя :D

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


Вернуться к началу
   
СообщениеДобавлено: Чт сен 20, 2012 8:40 pm 
Не в сети

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

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


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


Вернуться к началу
   
СообщениеДобавлено: Пт сен 21, 2012 2:41 pm 
Не в сети

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

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

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

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

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

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

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


Последний раз редактировалось FireWall Пт сен 21, 2012 8:52 pm, всего редактировалось 1 раз.

Вернуться к началу
СообщениеДобавлено: Пт сен 21, 2012 3:23 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 25, 2009 4:45 pm
Сообщения: 788
Рекомендую оформить это в виде багов - bugs.kolibrios.org


Вернуться к началу
СообщениеДобавлено: Пт сен 21, 2012 3:26 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
FireWall
SysFn64 аналог sbrk(). Без неё надо править malloc menuetlibc.


Вернуться к началу
СообщениеДобавлено: Пт сен 21, 2012 4:58 pm 
Еще KFM завязан на 64 функцию.


Вернуться к началу
   
СообщениеДобавлено: Пт сен 21, 2012 8:49 pm 
Не в сети

Зарегистрирован: Ср сен 15, 2010 7:22 pm
Сообщения: 101
Цитата: "Рекомендую оформить это в виде багов - bugs.kolibrios.org"

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

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

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

P.S.

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 21 сообщение ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB