Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Sep 22, 2019 3:26 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 22 posts ]  Go to page Previous 1 2
Author Message
PostPosted: Fri Jul 06, 2018 10:01 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
0CodErr wrote:
Похоже проблема только с выделением .bss, а HeapAlloc вроде отрабатывает.
Хмм... а какую конкретно помять имел в виду Serge?
Serge wrote:
память, выделяемую для приложения

Речь там шла о bss


Top
   
PostPosted: Fri Jul 06, 2018 10:03 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
floppy121 wrote:
Siemargl wrote:
ОСистема заботится о стирании и недоступности данных из других/новых процессов
Если бы это было действительно так, то в дампе памяти виртуальной машины, снятой после закрытия приложения IRCC, я бы ничего не обнаружил (и этой темы бы не было). Но к сожалению там осталось по крайней мере три буфера, а это значит: после закрытия IRCC система не стала занулять память освобождённую IRCC, а просто пометила её страницы как доступные для использования новыми процессами
В дампе - вполне возможно, очистка идет при запуске, как я понял. Но выделить эту же память другой программе неочищенной?


Top
   
PostPosted: Fri Jul 06, 2018 10:49 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Siemargl wrote:
Речь там шла о bss
Судя по этому примеру 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


Top
   
PostPosted: Fri Jul 06, 2018 11:38 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Переделал свой пример без использования стека вообще.
В случае успеха приложение должно просто штатно завершиться.
Code:
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:
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.


Top
   
PostPosted: Fri Jul 06, 2018 12:21 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
0CodErr, а ты сложи в регистр адрес обнаруженного ненуля, и на борде увидим. Хотя это наверное ECX


Top
   
PostPosted: Fri Jul 06, 2018 12:41 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Siemargl , адрес в edi. В ecx — количество.
Там, скорее всего, физической памяти не хватило.
Размер буфера был 64 Mb, а размер ОЗУ в VirtualBox был 256 Mb.
То есть, 4-ёх запущенных копий было достаточно.


Top
   
PostPosted: Fri Aug 03, 2018 12:02 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Ядро всегда очищает предоставляемую приложению память. И bss и размещаемую динамически. Единственное отличие - bss выделяется и обнуляется функцией map_process_image сразу при запуске приложения, а страницы динамической памяти выделяются в обработчике страничных ошибок при первом обращении к странице.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 22 posts ]  Go to page Previous 1 2

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited