Узнать начало/размер области данных программы, чтобы всё стереть при выходе из неё?

Applications development, KoOS API questions
  • floppy121 wrote:
    Siemargl wrote:ОСистема заботится о стирании и недоступности данных из других/новых процессов
    Если бы это было действительно так, то в дампе памяти виртуальной машины, снятой после закрытия приложения IRCC, я бы ничего не обнаружил (и этой темы бы не было). Но к сожалению там осталось по крайней мере три буфера, а это значит: после закрытия IRCC система не стала занулять память освобождённую IRCC, а просто пометила её страницы как доступные для использования новыми процессами
    В дампе - вполне возможно, очистка идет при запуске, как я понял. Но выделить эту же память другой программе неочищенной?
  • Siemargl wrote:Речь там шла о bss
    Судя по этому примеру http://board.kolibrios.org/viewtopic.php?p=70878#p70878 как раз с bss проблема(как минимум где-то не нуль). Хотя у нас ещё стек есть, если только пример показывает не нуль на стеке — что вполне нормально после вызова нескольких процедур.
    Siemargl wrote:очистка идет при запуске, как я понял
    Запуск процесса у нас где-то там http://websvn.kolibrios.org/filedetails ... askman.inc
    вот map_process_image http://websvn.kolibrios.org/filedetails ... c#line-772
  • Переделал свой пример без использования стека вообще.
    В случае успеха приложение должно просто штатно завершиться.

    Code: Select all

    ORG 0
    BITS 32
    MEMORY_BUFFER_SIZE equ 1024 * 1024 * 64
    ; ------------------------------------------------- ;
    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:
            mov    edi, MemoryBuffer
            mov    ecx, MemoryBuffer.end - MemoryBuffer
            xor    eax, eax
            repe   scasb
            je     .ok
            mov    eax, 0xBADC0DE
            int3
    .ok:
    ; ------------------------------------------------- ;
            mov    eax, -1
            int    64
    ; ------------------------------------------------- ;
    SECTION .bss
    MemoryBuffer:
            resb MEMORY_BUFFER_SIZE
    .end:
    END:
    Иначе срабатывает int3 и в eax должно оказаться 0xBADC0DE.

    Похоже, действительно, раньше показывало "не нуль" на стеке, а теперь всё нормально.
    Но есть проблема: если запустить сразу несколько копий(нажать Enter в Файловом менеджере и удерживать), то в BOARD будет:

    Code: Select all

    K : Process - forced terminate PID: 00000053 [testmem]
    K : General protection fault
    K : EAX : 0BADC0DE EBX : 00000000 ECX : 03FFF043
    K : EDX : 00000000 ESI : 00000000 EDI : 00001001
    K : EBP : 00000000 EIP : 00000039 ESP : 04000044
    K : Flags : 00011297 CS : 0000001B (application)
    То есть, int3 в этом случае всё же сработало.
    Тестировал в VirtualBox с 256 Mb RAM.
  • 0CodErr, а ты сложи в регистр адрес обнаруженного ненуля, и на борде увидим. Хотя это наверное ECX
  • Siemargl , адрес в edi. В ecx — количество.
    Там, скорее всего, физической памяти не хватило.
    Размер буфера был 64 Mb, а размер ОЗУ в VirtualBox был 256 Mb.
    То есть, 4-ёх запущенных копий было достаточно.
  • Ядро всегда очищает предоставляемую приложению память. И bss и размещаемую динамически. Единственное отличие - bss выделяется и обнуляется функцией map_process_image сразу при запуске приложения, а страницы динамической памяти выделяются в обработчике страничных ошибок при первом обращении к странице.
  • Who is online

    Users browsing this forum: Bing [Bot] and 8 guests