Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Oct 20, 2019 4:11 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 65 posts ]  Go to page 1 2 3 4 5 Next
Author Message
PostPosted: Mon Aug 15, 2011 5:24 am 
Offline

Joined: Sat Aug 13, 2011 1:48 pm
Posts: 49
Сейчас для того, чтобы загрузить одну/несколько библиотек, различные приложения используют либо сущеcтвующие макросы (например, "load_lib.mac"), либо каждый раз пишут свой велосипед в виде кода, который подгружает нужные DLL-ки. А может лучше вынести код_загрузки_нужных_библиотек_по_таблице_импорта в ядро, т.е. в сифункцию? Ведь очевидно будут плюсы:
• программы станут легче на 5-10%, их код станет более компактным и удобочитаемым
• ядро сможет выводить стандартное сообщение об отстуствующих/устаревших библиотека в случае ошибки при загрузке (сейчас же,в такой ситуации, многие приложения тупо падают без всяких объяснений, и это мягко говоря "озадачивает" пользователя
• со временем можно будет обновить формат MENUETxx-экзешников, добавив в заголовок поле с указателем на таблицу импорта - таким образом ядро при загрузке будет вызывать уже существующую процедуру


Top
   
PostPosted: Mon Aug 15, 2011 5:45 am 
Offline

Joined: Sun Nov 04, 2007 2:46 am
Posts: 390
Честно говоря, несмотря на то, что я за то, чтобы максимально высвободить ядро от функций, которые оно делать не должно, но эта функция представляется мне как раз той, что действительно необходима в ядре.

Впрочем, я и сейчас не вижу особых проблем.
К примеру, вот пару дней назад я переписал вызов fontslib с использования loadlib.mac на dll.inc, синтаксис работы с библиотеками в котором мне нравится больше. Сделал быстро и код вполне читабелен:

Code:
START:
   mcall   68,11
   stdcall dll.Load,@IMPORT
   or   eax,eax
   jnz   exit
   ; Инциализация библиотеки fontslib
   invoke fonts.init   ; инициализация списка шрифтов
   invoke fonts.get_font

...

@IMPORT:
library \
   fontslib,'fonts_lib.obj'

import fontslib, \
   fonts.init            ,'initialization_font',\
   fonts.get_font         ,'get_font',\
   fonts.free_fulder_info   ,'free_fulder_info',\
   fonts.free_font         ,'free_font',\
   fonts.draw_string      ,'font_draw_on_string',\
   fonts.show_all         ,'show_all_glif',\
   fonts.version         ,'version_fn'


Готово, все нужные функции доступны через invoke.


Last edited by maximYCH on Mon Aug 15, 2011 8:39 am, edited 2 times in total.

Top
   
PostPosted: Mon Aug 15, 2011 6:02 am 
Offline

Joined: Sat Aug 13, 2011 1:48 pm
Posts: 49
maximYCH wrote:
Честно говоря, несмотря на то, что я за то, чтобы максимально высвободить ядро от функций, которые оно делать не должно, но эта функция представляется мне как раз той, что действительно необходима в ядре.

Я тоже за "облегчение" ядра посредством переноса всех левыхъ функций В библиотеки и именно поэтому предложил эту идею.
Также использование макросов/велосипедного кода имеет минус для небольших, крошечных программ, имхо. Ибо код загружающий библиотеку в них может занимать места больше, чем основной код программы. С использованием же системного вызова он будет занимать 8-15 байт.


Top
   
PostPosted: Mon Aug 15, 2011 1:26 pm 
Offline

Joined: Wed Dec 26, 2007 5:09 am
Posts: 214
Загрузчику, как и "тяжёлым" драйверам (вроде файловых систем) в ядре делать нечего: они его прилично раздувают и усложняют, а выигрыша в плане скорости такое решение практически не даёт (в связи с медленной работой "по определению" этих компонентов: оно настолько превосходит время переключения контекста, что им можно смело пренебречь). Целесообразнее их делать в виде задач режима пользователя, общающихся с ядром через стандартизированный интерфейс. Помимо всего прочего, это прилично облегчит написание и отладку таких компонентов, а также обеспечит лёгкость их расширения. Наконец, поведение ядра, и, в частности, время его работы станет предсказуемее (время работы загрузчика или какого-нибудь тяжёлого драйвера предсказать вообще невозможно, поскольку оно зависит от внешних факторов, например, расположения файлов на диске). В случае с загрузчиком его вынос из ядра позволяет легко обеспечить загрузку и COFF, и ELF, и ещё каких-нибудь форматов, какие кому-то понадобятся, без каких-либо изменений в ядре. Другое дело, что надо проектировать, а потом реализовывать этот самый стандартный интерфейс, а также функции управления памятью (загрузчик-то должен иметь доступ к адресному пространству чужой задачи), да и вообще сначала думать, а потом писать... :)


Top
   
PostPosted: Mon Aug 15, 2011 1:47 pm 
Offline

Joined: Sat Aug 13, 2011 1:48 pm
Posts: 49
Ну ничто не мешает сделать такую функцию для загрузки только COFF-библиотек (как стандартных и нативных для Колибри), а поддержку других исполняемых/линкуемых форматов переложить на загрузчики для user mode.


Top
   
PostPosted: Mon Aug 15, 2011 2:02 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Выносить код загрузки библиотек из приложений, разумеется, нужно, но не в ядро, а в системную user-mode библиотеку, которая будет грузиться автоматически, получать управление до основного приложения и всё настраивать. Например, это позволяет без проблем вызывать функции инициализации в библиотеках - которые, естественно, должны выполняться в user-mode - и существенно разгружает ядро от деталей, которые там не нужны.

Длинный флейм по вопросам формата и загрузки динамических библиотек был на форуме здесь и здесь. В конечном счёте вроде активные на тот момент ядерщики согласились на формат PE с урезанным заголовком, но, как это часто бывает с флеймами, всё загнулось.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Aug 15, 2011 3:01 pm 
Offline

Joined: Sat Aug 13, 2011 1:48 pm
Posts: 49
Если вытащить загрузку программ/библиотек из нулевого кольца, то можно будет вовсе отказаться от идеи "Каждой ОС свои форматы экзешников и либ". Программист будет выбирать тот формат, который ему по душе и/или с которым он лучше_знаком/привык_работать.


Top
   
PostPosted: Mon Aug 15, 2011 4:00 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
Точнее, с которым умеет работать его любимый компилятор.

_________________
Разработчик языка программирования Кантор


Top
   
PostPosted: Mon Aug 15, 2011 4:03 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Загрузка из user-mode создаёт некоторые проблемы с расшареными библиотеками.


Top
   
PostPosted: Mon Aug 15, 2011 4:03 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
Joaquin: много форматов, тоже не очень хорошо.


Top
   
PostPosted: Mon Aug 15, 2011 4:30 pm 
Offline

Joined: Wed Dec 26, 2007 5:09 am
Posts: 214
Serge wrote:
Загрузка из user-mode создаёт некоторые проблемы с расшареными библиотеками.


Собственно, нужно нормальное управление памятью, и в частности, её совместным использованием несколькими задачами. Если такового нет, то реализовать загрузчик в режиме пользователя не получится (ну, не считая включения его кода в каждую задачу -- пускай и в виде системной библиотеки, автоматически загружаемой ядром при запуске задачи).


Top
   
PostPosted: Mon Aug 15, 2011 6:14 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1347
:?

Это просто общая шиза какая-то: выносить из ядра всё, что работает...

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков


Top
   
PostPosted: Mon Aug 15, 2011 7:09 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
art_zh, в данном случае проблема в том, что сейчас загрузка библиотек не работает. По крайней мере, нормально. По причинам, которые изложил Joaquin в первом же посте этой темы.
SII, я, конечно, понимаю, что вам лишь бы поругать отсутствие проектирования и документации на внутреннее устройство ядра где-либо, кроме мозгов разработчиков, и что вам безразлично, что на самом деле уже есть, но для вновь прибывших я считаю своим долгом сообщить о существовании расшаренной памяти на уровне API - функции 68.22 и 68.23. К которым нет принципиальных проблем прикрутить примочки типа copy-on-write. Если, конечно, не считать того, что делать это некому, но указанная проблема не является специфичной для обсуждаемой темы.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Wed Aug 17, 2011 3:19 pm 
Offline

Joined: Sat Aug 13, 2011 1:48 pm
Posts: 49
art_zh wrote:
:?

Это просто общая шиза какая-то: выносить из ядра всё, что работает...

Кстати о "выносить из ядра всё, что работает"... Это только мне одному кажется, что LZMA-распакеру в ядре делать нечего?


Top
   
PostPosted: Wed Aug 17, 2011 3:35 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Ядро же запакованное, как оно само себя распаковывать будет?


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

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


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:  
cron
Powered by phpBB® Forum Software © phpBB Limited