Board.KolibriOS.org

Official KolibriOS board
It is currently Tue May 21, 2019 6:07 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 70 posts ]  Go to page Previous 1 2 3 4 5 Next
Author Message
PostPosted: Sat Oct 05, 2013 2:56 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
art_zh
А что это за зверь и с чем его едят ?
И как быть с многопоточными приложениями ?
Имхо потоку проще установить его системным вызовом.


Top
   
PostPosted: Sun Oct 06, 2013 12:53 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1328
Serge
Кольцевой буфер, в который приложение сможет записывать параметры mcall 47, mcall 4 и некоторых других системных вызовов, не требующих срочного исполнения и возврата результата.
Ядро будет прогонять всю очередь GUI-запросов за один вызов int40.

Quote:
Имхо потоку проще установить его системным вызовом.
имхо твою TLS-структуру тоже проще запросить системным вызовом.
Но если уж вводим новый заголовок чтобы упростить кому-то жизнь - тогда не забывай и об ассемблерщиках.


Top
   
PostPosted: Sun Oct 06, 2013 2:01 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
art_zh
Если приложение всё равно будет делать вызов 0х40, то что мешает передавать указатель в этом вызове ? Иначе как ты собираешься расшарить один глобальный буфер между несколькими потоками ?
TLS можно создавать системным вызовом, но это несколько муторно и чревато проблемами. Например процесс загружает DLL, та неявно для процесса создаёт несколько потоков, процесс создаёт TLS, ядро в панике.


Top
   
PostPosted: Sun Oct 06, 2013 2:18 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1328
Serge
имхо так асм-код будет проще.
Конкретную реализацию потом обсудим.
А сейчас - тебе что, так трудно зарезервировать одно поле DD для GUI-указателя?


Top
   
PostPosted: Sun Oct 06, 2013 2:30 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Quote:
А сейчас - тебе что, так трудно зарезервировать одно поле DD для GUI-указателя?
Если честно, да. Я ужал заголовок в 48 байт, оставив самое необходимое.
Хочется всё же описание хоть какой реализации, а пока я плохо представляю как такой единственный буфер будет работать в многооконном окружении.


Top
   
PostPosted: Sun Oct 06, 2013 5:32 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1328
Serge wrote:
Если честно, да. Я ужал заголовок в 48 байт, оставив самое необходимое.
Ну вот, прямой вопрос - конкретный ответ :D
Ладно, буфер действительно лучше будет на сисфункцию повесить, чтоб оставить совместимость со старым заголовком.


Top
   
PostPosted: Tue Oct 08, 2013 1:46 am 
Offline

Joined: Tue Jul 26, 2011 11:03 pm
Posts: 62
Serge wrote:
Я ужал заголовок в 48 байт,

compress it a bit more
Code:
header:
    db 'KOLIBRI',0     ; +0 8byte checksum for the entire file would be much better use
    dw _code-header    ; +8 size of this header = app entry point = number of supported features

    dw _data/4096      ;+10 data section in 4KB units to support execution-disable(XD,NX)
                       ;     = end of code = max 256MB code; max 256MB data

    ;+12 import section offset relative to data, if present, could be 4KB aligned to set read-only
    dd _import-_data   ; could be 2bytes instead, want more than 64KB of data - allocate

    ;+16 in 4KB units (why does ring3 programmer need precise size of "end of disk image" ? )
    dw (_unInit-_data)/4096       ; variable inside import can tell precise size

    dw 100h            ;+18 size of uninitialized data; naturally, in 4KB units

    dw 100h            ;+20 size of stack in 4KB units, or you got less than 4KB chunks ?
                       ;                   you want more than 256MB stack - make it initial stack

    ; you can put all these on stack as variables to be poped
    ; sometimes you need these inside variables, sometimes can get away with registers only
    dd 0               ;+22 address of tls info structure kernel-defined
    dd 0               ;+26 exec_path  kernel-defined
    dd 0               ;+30 cmdline    kernel-defined
    dd 0               ;+34 env        kernel-defined
_code:
        xor     eax, eax

align 4096
_data:
        db 0

_import:
        db 0

align 4096
_unInit:
        rb 0


Top
   
PostPosted: Tue Oct 08, 2013 10:08 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
ilya
Тебя сейчас с потрохами съедят за трату байт на выравнивании.
Я трамбовал заголовок не ради небольшого размера, а для выравнивания на 16 байт.


Top
   
PostPosted: Wed Oct 09, 2013 2:53 am 
Offline

Joined: Tue Jul 26, 2011 11:03 pm
Posts: 62
you can still have this as DWORD(simply change the variable) - no bytes lost but if it's 4KB aligned - please enforce restriction.
Quote:
а для выравнивания на 16 байт
Can't understand that, any alignment is meaningless unless you deal with SSE on modern computers.


Top
   
PostPosted: Wed Oct 09, 2013 12:21 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
ilya
А зачем задавать смещения относительно _data, лишние вычисления ведь.


Top
   
PostPosted: Wed Oct 09, 2013 1:15 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Serge wrote:
ilya
А зачем задавать смещения относительно _data, лишние вычисления ведь.

Так он же сказал, что все тут лохи, вот и разводит лохов.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Oct 13, 2013 12:56 am 
Offline

Joined: Tue Jul 26, 2011 11:03 pm
Posts: 62
Ты хотел меньший размер заголовка, я правда не знаю зачем
Я знаю почему я ограничиваю различные размеры. Гадайте...

лохи не те кто противоречят мне а кто отстаёт от остальных в поддержки технологий выгодных для пользователя - для меня включительно


Top
   
PostPosted: Sat Oct 26, 2013 8:46 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Serge
Заглохло?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sat Oct 26, 2013 8:50 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Займусь немного позже. Надо допилить драйверы.


Top
   
PostPosted: Sat Nov 23, 2013 6:45 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
Serge wrote:
Вот такой пример для наглядности
Code:
STACK_SIZE  equ 4096
include 'proc32.inc'
org 0

    db 'KOLIBRI',0     ;+00 banner + revision 0-255
    dd start           ;+08 application entry
    dd ecode           ;+12 end of code and constant data
    dd import          ;+16 import section, if present
    dd eimport         ;+20 end of import section
    dd edata           ;+24 end of initialized data, end of disk image
    dd emem            ;+28 end of uninitialized data
    dd STACKSIZE       ;+32 size of stack
    dd 0               ;+36 address of tls info structure kernel-defined
    dd 0               ;+38 exec_path  kernel-defined
    dd 0               ;+40 cmdline    kernel-defined
    dd 0               ;+44 env        kernel-defined

Два вопроса:
  • Где экспорты? Для библиотек потом еще один формат изобретать? Уж переделывать -- так сразу комплексно, не?
  • Зачем указывать начало и конец секций? На уровне формата в файле предполагаются дырки, заполненные чем угодно? Мне кажется, что секции должны быть пригнаны друг к другу плотно, но с учетом выравнивания, которое можно задать и отдельно.

Набросал свой вариант:
Code:
magic         db    'KOLIBRI', 0  ; sign, version
alignment     db    4   ; power of 2: 3 = 8 bytes, 4 = 16 bytes
reserved      db    3 dup 0
imagebase     dd    0   ; image base, for better flexibility
entrypoint    dd    0   ; entry point, for better flexibility
code          dd    0   ; size of code section
import        dd    0   ; size of import section, 0 = section is not present
export        dd    0   ; size of export section, 0 = application
data_         dd    0   ; size of initialized data section
mem           dd    0   ; size of uninitialized memory for application, as the same in MENUET01
stack_        dd    0   ; size of stack
cmdline       dd    -1  ; command line, kernel-defined; -1 = prompt for params
execpath      dd    ?   ; exec path, kernel-defined
env           dd    ?   ; environment variables, kernel-defined
tls           dd    ?   ; address of thread local storage (TLS), kernel-defined

Тоже 48 байт. Чёрт, я его FASM-ом компилил, он выдал мне 48 байт, отбросив хвост. На самом деле 60 байт. Отличия:
  • Выравнивание задается полем alignment, степенью двойки.
  • Есть поля imagebase и entrypoint для лучшей совместимости с неродными компиляторами.
  • Есть экспорты. Для библиотеки в поле export пишется размер секции, а у приложений оно равно нулю. По этому признаку можно отличить библиотеку от приложения, поэтому дополнительных флагов не требуется.
  • Для секций заданы только размеры. Подразумевается, что секции идут друг за другом сплошняком с учетом выравнивания.
  • В поле cmdline может стоять -1, что означает: "Мне нужны входные параметры". Пока флаг никак не используется, а в будущих версиях можно добавить автоматический запрос параметров для таких программ. Получится некий аналог консольных приложений, и тоже без дополнительных полей.

Осталось даже 3 неиспользованных байта после alignment, -- на будущие версии.

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


Last edited by Freeman on Sat Nov 23, 2013 10:28 pm, edited 1 time in total.

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

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 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:  
Powered by phpBB® Forum Software © phpBB Limited