Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт сен 20, 2018 10:20 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу Пред. 1 2
Автор Сообщение
СообщениеДобавлено: Пт июл 06, 2018 10:01 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 323
0CodErr писал(а):
Похоже проблема только с выделением .bss, а HeapAlloc вроде отрабатывает.
Хмм... а какую конкретно помять имел в виду Serge?
Serge писал(а):
память, выделяемую для приложения

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


Вернуться к началу
СообщениеДобавлено: Пт июл 06, 2018 10:03 am 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: Пт июл 06, 2018 10:49 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1375
Siemargl писал(а):
Речь там шла о bss
Судя по этому примеру viewtopic.php?p=70878#p70878 как раз с bss проблема(как минимум где-то не нуль). Хотя у нас ещё стек есть, если только пример показывает не нуль на стеке — что вполне нормально после вызова нескольких процедур.
Siemargl писал(а):
очистка идет при запуске, как я понял
Запуск процесса у нас где-то там http://websvn.kolibrios.org/filedetails ... askman.inc
вот map_process_image http://websvn.kolibrios.org/filedetails ... c#line-772


Вернуться к началу
СообщениеДобавлено: Пт июл 06, 2018 11:38 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1375
Переделал свой пример без использования стека вообще.
В случае успеха приложение должно просто штатно завершиться.
Код:
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 будет:
Код:
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.


Вернуться к началу
СообщениеДобавлено: Пт июл 06, 2018 12:21 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 323
0CodErr, а ты сложи в регистр адрес обнаруженного ненуля, и на борде увидим. Хотя это наверное ECX


Вернуться к началу
СообщениеДобавлено: Пт июл 06, 2018 12:41 pm 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: Пт авг 03, 2018 12:02 am 
Не в сети
Kernel Developer

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу Пред. 1 2

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB