Page 61 of 77

Re: Помогите новичку

Posted: Sat Nov 02, 2013 1:54 pm
by Mario_r4
0CodErr wrote:Покажи тогда, в каком месте это происходит.
Ты сначала напиши нормальный пример с выделением нормального стека под первый процесс и выделением независимых стеков под остальные. Докажи, что я не прав, а потом будем разбираться дальше.

Re: Помогите новичку

Posted: Sat Nov 02, 2013 1:56 pm
by 0CodErr
Mario_r4, зачем выделять память, если она не используется?

Re: Помогите новичку

Posted: Sat Nov 02, 2013 3:34 pm
by 0CodErr
Mario_r4, вот такой ещё вариант:
Spoiler:

Code: Select all

ORG 0
BITS 32
; --------------------------- ;
STACK_SIZE     equ 256
; --------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd START
program.end    dd END
program.memory dd END + STACK_SIZE
program.stack  dd END + STACK_SIZE
program.params dd 0
program.path   dd 0
; --------------------------- ;
START:
; heap.initialize
        mov    eax, 68
        mov    ebx, 11
        int    64   
NEXT:
; memory.allocate
        mov    eax, 68
        mov    ebx, 12
        mov    ecx, 4096
        int    64
; thread.create
        lea    edx, [eax + 2048]
        mov    eax, 51
        mov    ebx, 1
        mov    ecx, THREAD
        int    64
        jmp    NEXT
THREAD:
; memory.free
        mov    eax, 68
        mov    ebx, 13
        lea    ecx, [esp - 2048]
        int    64    
        or     eax, -1
        int    64
; --------------------------- ;
END:
В Qemu вылетело:
Spoiler:
1.PNG
1.PNG (28.85 KiB)
Viewed 4601 times
Я ещё не написал, что после вылета ни мышь, ни клавиатура не работают, но в CPU продолжается отрисовка.

Другой пример, в отличие от предыдущего, он запускает приложение, а не создаёт поток:
Spoiler:

Code: Select all

ORG 0
BITS 32
; --------------------------- ;
STACK_SIZE     equ 256
; --------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd START
program.end    dd END
program.memory dd END + STACK_SIZE
program.stack  dd END + STACK_SIZE
program.params dd 0
program.path   dd 0
; --------------------------- ;
START:
; file.run
        mov    ebx, .file_info
        mov    eax, 70
        int    64
        jmp    START
; --------------------------- ;
.file_info:
        dd     7
        dd     0
.params:
        dd     sz_empty
        dd     0
        dd     0
        db     0
.file_path:
        dd     sz_just_terminate
; --------------------------- ;
sz_empty  db 0
sz_just_terminate  db "/sys/just_terminate.kex",0
; --------------------------- ;
END:
Ниже код just_terminate.kex

Code: Select all

ORG 0
BITS 32
; --------------------------- ;
MENUET01       db 'MENUET01'
version        dd 1
program.start  dd START
program.end    dd END
program.memory dd END
program.stack  dd END
program.params dd 0
program.path   dd 0
; --------------------------- ;
START:
        or     eax, -1
        int    64
; --------------------------- ;
END:
Этот пример у меня до сих пор работает в VirtualBox без вылетов:
Spoiler:
2.PNG
2.PNG (40.74 KiB)
Viewed 4601 times

Re: Помогите новичку

Posted: Sat Nov 02, 2013 7:28 pm
by 0CodErr
0CodErr wrote:Этот пример у меня до сих пор работает в VirtualBox без вылетов:
Вылетов так и не было. Последний скриншот CPU оттуда:
Spoiler:
CPU(VirtualBox).PNG
CPU(VirtualBox).PNG (29.41 KiB)
Viewed 4577 times
Заметно, что cpu-usage у @icon больше, чем обычно. Я решил запустить пример на реальной системе. Вот скриншот CPU:
Spoiler:
CPU(real).PNG
CPU(real).PNG (22.58 KiB)
Viewed 4577 times
Также в VirtualBox в это время заметно мерцание указателя мыши даже в неподвижном состоянии. Я думаю, связано это с тем, что даже не имеющий окна запускаемый поток вызывает «деактивацию» активного в текущий момент окна приложения, а это влечёт за собой смену указателя мыши на указатель по умолчанию и его перерисовку. Например, нажав среднюю кнопку мыши в fNav, можно заметить, как изменяется указатель мыши.
Такая «деактивация» делает проблематичным нажатие на кнопки в приложениях даже на реальной системе.

Re: Помогите новичку

Posted: Sat Nov 02, 2013 7:54 pm
by Mario_r4
1) Вот зачем удалять память выделенную под стек потока, если он еще не завершен? Ты сам себе противоречишь. Если уж хочешь сэкономить память, то сделай мьютекс - потоки будут запускаться друг за другом, последовательно используя одну область памяти.
2) В случае запуска постороннего приложения используется другое адресное пространство приложения и оно никак не пересекается с адресным пространством запускающего.

Re: Помогите новичку

Posted: Sat Nov 02, 2013 8:41 pm
by 0CodErr
Mario_r4 wrote:Ты сам себе противоречишь.
По-моему всё-таки ты :)
viewtopic.php?f=2&t=2157&start=15#p43922
Mario_r4 wrote:johnfound писал(а):
Но поток не может освободит свой собственный стек.
А другие потоки приложения просто не знают что поток завершился. Как быть?

Отчего же?
Код:
mcall 68,13,[thread_stack_2]
mcall -1 ; close this program

В zSea у меня это вполне работает.

Re: Помогите новичку

Posted: Sat Nov 02, 2013 8:57 pm
by Mario_r4
0CodErr wrote:По-моему всё-таки ты
Точно я? Ну, ладно - ты меня подловил.

Тогда остается предположение, что количество порожденных потоков на родительский поток величина конечная. Можно сделать счетчик выводящий на доску отладки сообщение о том какой это номер порожденного потока, чтобы установить ограничение если оно есть. А генерацию потоков ограничить циклом в пару тысяч повторений - вероятно этого будет достаточно.

Re: Помогите новичку

Posted: Mon Nov 04, 2013 8:15 pm
by Serge
Тогда остается предположение, что количество порожденных потоков на родительский поток величина конечная
Таких ограничений нет.

Re: Помогите новичку

Posted: Thu Nov 07, 2013 10:15 pm
by Akyltist
SEND:
Spoiler:

Code: Select all

    mov     eax,68
    mov     ebx,11
    int     0x40

    mov     eax,68
    mov     ebx,22
    mov     ecx,share_area
    mov     edx,4
    mov     esi,0x04; SHM_OPEN_ALWAYS
    int     0x40

    mov     [share_ptr],eax
    mov     eax,[share_send]
    mov     [share_size],edx
;======================
    share_size   dd 0
    share_ptr    dd 0
    share_send   dd 0x274854
RECEIVE
Spoiler:

Code: Select all

    mov     eax,68
    mov     ebx,11
    int     0x40

    mov     eax,68
    mov     ebx,22
    mov     ecx,share_area
    mov     edx,4
    mov     esi,0x00    ;SHM_READ
    int     0x40

    mov     [share_ptr],eax
    mov     eax,share_ptr
    mov     [share_rec],eax
    mov     [share_size],edx
;======================
    share_size   dd 0
    share_ptr    dd 0
    share_rec    dd 0
Вопрос: в каком месте мне руки отрубать)))

Re: Помогите новичку

Posted: Thu Nov 07, 2013 10:28 pm
by Mario_r4
Akyltist
А в чем проблема? В обоих случаях область подключена.
А если ты к тому что ничего не засылается и не считывается, так ты в обоих примерах ничего в область не засылаешь и ничего не считываешь.

Re: Помогите новичку

Posted: Sun Nov 10, 2013 7:39 pm
by Unusual
Как запустить программу на ассемблере там функция 70 а что посылать не знаю?

Re: Помогите новичку

Posted: Sun Nov 10, 2013 7:50 pm
by 0CodErr
Unusual, ты параметры что ли хочешь послать?
Например, исходник Run:http://websvn.kolibrios.org/filedetails ... %2Frun.asm

Re: Помогите новичку

Posted: Sun Nov 10, 2013 7:53 pm
by e-andrew

Code: Select all

    mov     dword[fi.p00], 7
    mov     dword[fi.p08], sz_param
    mov     dword[fi.p21], sz_file

    mcall   70, fi
 
; =========================
sz_file:
    db      "@notify", 0
sz_param:
    db      "Hello, world!!!", 0
; =========================
fi:
 .p00:
    rd	    1
 .p04:
    rd	    1
 .p08:
    rd	    1
 .p12:
    rd	    1
 .p16:
    rd	    1
 .p20:
    rb	    1
 .p21:
    rd	    1

Re: Помогите новичку

Posted: Mon Nov 11, 2013 11:52 pm
by Leency

Code: Select all

======================================================================
= Функция 68, подфункция 27 - загрузить файл ===================
======================================================================
Параметры:
  * eax = 68 - номер функции
  * ebx = 27 - номер подфункции
  * ecx = указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
  * eax = указатель на загруженный файл или 0
  * edx = размер загруженного файла или 0
Примечания:
  * функция загружает и, при необходимости, распаковывает файл (kunpack)
Кто-то может объяснить, что делает эта функция? Чем она отличается от "70.0 - чтение файла с поддержкой длинных имён"? Тем, что во время загрузки файла может его распаковать?

Re: Помогите новичку

Posted: Tue Nov 12, 2013 12:04 am
by Mario_r4
Leency wrote:Тем, что во время загрузки файла может его распаковать?
Да.