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 (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.kexCode: 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 (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 (29.41 KiB)
Viewed 4577 times
Заметно, что cpu-usage у @icon больше, чем обычно. Я решил запустить пример на реальной системе. Вот скриншот CPU:
Spoiler:

-
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
RECEIVESpoiler:
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:Тем, что во время загрузки файла может его распаковать?
Да.