Ты сначала напиши нормальный пример с выделением нормального стека под первый процесс и выделением независимых стеков под остальные. Докажи, что я не прав, а потом будем разбираться дальше.0CodErr wrote:Покажи тогда, в каком месте это происходит.
Помогите новичку
-
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Mario_r4, зачем выделять память, если она не используется?
Mario_r4, вот такой ещё вариант:
В Qemu вылетело:
Я ещё не написал, что после вылета ни мышь, ни клавиатура не работают, но в CPU продолжается отрисовка.
Другой пример, в отличие от предыдущего, он запускает приложение, а не создаёт поток:Ниже код just_terminate.kex
Этот пример у меня до сих пор работает в VirtualBox без вылетов:
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:
Spoiler:
Другой пример, в отличие от предыдущего, он запускает приложение, а не создаёт поток:
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:
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:
Spoiler:
Вылетов так и не было. Последний скриншот CPU оттуда:0CodErr wrote:Этот пример у меня до сих пор работает в VirtualBox без вылетов:
Spoiler:
Spoiler:
Такая «деактивация» делает проблематичным нажатие на кнопки в приложениях даже на реальной системе.
1) Вот зачем удалять память выделенную под стек потока, если он еще не завершен? Ты сам себе противоречишь. Если уж хочешь сэкономить память, то сделай мьютекс - потоки будут запускаться друг за другом, последовательно используя одну область памяти.
2) В случае запуска постороннего приложения используется другое адресное пространство приложения и оно никак не пересекается с адресным пространством запускающего.
2) В случае запуска постороннего приложения используется другое адресное пространство приложения и оно никак не пересекается с адресным пространством запускающего.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
По-моему всё-таки ты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 у меня это вполне работает.
Точно я? Ну, ладно - ты меня подловил.0CodErr wrote:По-моему всё-таки ты
Тогда остается предположение, что количество порожденных потоков на родительский поток величина конечная. Можно сделать счетчик выводящий на доску отладки сообщение о том какой это номер порожденного потока, чтобы установить ограничение если оно есть. А генерацию потоков ограничить циклом в пару тысяч повторений - вероятно этого будет достаточно.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Таких ограничений нет.Тогда остается предположение, что количество порожденных потоков на родительский поток величина конечная
SEND:
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,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
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
- Attachments
-
-
error.png (3.44 KiB)Viewed 4282 times
-
Akyltist
А в чем проблема? В обоих случаях область подключена.
А если ты к тому что ничего не засылается и не считывается, так ты в обоих примерах ничего в область не засылаешь и ничего не считываешь.
А в чем проблема? В обоих случаях область подключена.
А если ты к тому что ничего не засылается и не считывается, так ты в обоих примерах ничего в область не засылаешь и ничего не считываешь.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Как запустить программу на ассемблере там функция 70 а что посылать не знаю?
Unusual, ты параметры что ли хочешь послать?
Например, исходник Run:http://websvn.kolibrios.org/filedetails ... %2Frun.asm
Например, исходник Run:http://websvn.kolibrios.org/filedetails ... %2Frun.asm
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
Code: Select all
======================================================================
= Функция 68, подфункция 27 - загрузить файл ===================
======================================================================
Параметры:
* eax = 68 - номер функции
* ebx = 27 - номер подфункции
* ecx = указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
* eax = указатель на загруженный файл или 0
* edx = размер загруженного файла или 0
Примечания:
* функция загружает и, при необходимости, распаковывает файл (kunpack)
Из хаоса в космос
Да.Leency wrote:Тем, что во время загрузки файла может его распаковать?
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Who is online
Users browsing this forum: No registered users and 10 guests