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

Applications development, KoOS API questions
  • Mario_r4, зачем выделять память, если она не используется?
  • 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 4409 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 4409 times
  • 0CodErr wrote:Этот пример у меня до сих пор работает в VirtualBox без вылетов:
    Вылетов так и не было. Последний скриншот CPU оттуда:
    Spoiler:
    CPU(VirtualBox).PNG
    CPU(VirtualBox).PNG (29.41 KiB)
    Viewed 4385 times
    Заметно, что cpu-usage у @icon больше, чем обычно. Я решил запустить пример на реальной системе. Вот скриншот CPU:
    Spoiler:
    CPU(real).PNG
    CPU(real).PNG (22.58 KiB)
    Viewed 4385 times
    Также в VirtualBox в это время заметно мерцание указателя мыши даже в неподвижном состоянии. Я думаю, связано это с тем, что даже не имеющий окна запускаемый поток вызывает «деактивацию» активного в текущий момент окна приложения, а это влечёт за собой смену указателя мыши на указатель по умолчанию и его перерисовку. Например, нажав среднюю кнопку мыши в fNav, можно заметить, как изменяется указатель мыши.
    Такая «деактивация» делает проблематичным нажатие на кнопки в приложениях даже на реальной системе.
  • 1) Вот зачем удалять память выделенную под стек потока, если он еще не завершен? Ты сам себе противоречишь. Если уж хочешь сэкономить память, то сделай мьютекс - потоки будут запускаться друг за другом, последовательно используя одну область памяти.
    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:
    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
    
    Вопрос: в каком месте мне руки отрубать)))
    Attachments
    error.png
    error.png (3.44 KiB)
    Viewed 4282 times
  • Akyltist
    А в чем проблема? В обоих случаях область подключена.
    А если ты к тому что ничего не засылается и не считывается, так ты в обоих примерах ничего в область не засылаешь и ничего не считываешь.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Как запустить программу на ассемблере там функция 70 а что посылать не знаю?
  • Unusual, ты параметры что ли хочешь послать?
    Например, исходник 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)
    Кто-то может объяснить, что делает эта функция? Чем она отличается от "70.0 - чтение файла с поддержкой длинных имён"? Тем, что во время загрузки файла может его распаковать?
    Из хаоса в космос
  • Leency wrote:Тем, что во время загрузки файла может его распаковать?
    Да.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Who is online

    Users browsing this forum: No registered users and 10 guests