Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт мар 28, 2017 11:09 am

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




Начать новую тему  Ответить на тему  [ 73 сообщения ]  На страницу 1 2 3 4 5 След.
Автор Сообщение
 Заголовок сообщения: Выделение памяти
СообщениеДобавлено: Пт июн 10, 2016 4:51 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 905
Кто-нибудь с этим разбирался?
viewtopic.php?f=2&t=684&start=885#p53130

Может быть, Serge разъяснит, что там за такой очень хитрый менеджер памяти
viewtopic.php?f=2&t=684&start=930#p57580
там суть в том, что система даёт памяти больше, чем есть. А если в неё произойдёт запись, то начинаются PageFault-ы.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт июн 10, 2016 10:57 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 429
Цитата:
Кто-нибудь с этим разбирался?
viewtopic.php?f=2&t=684&start=885#p53130

При int 40h разве не происходит записи в стек следующего адреса? Как при call? Вроде как происходит.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Сб июн 11, 2016 6:05 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1110
Вроде как ещё и флаги сохраняются. То-есть 8 байт в стеке.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Сб июн 11, 2016 7:09 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Цитата:
там суть в том, что система даёт памяти больше, чем есть. А если в неё произойдёт запись, то начинаются PageFault
Это спекулятивно оптимистичное поведение. Система позволяет программе зарезервировать из доступных адресов в userspace столько, сколько она просит. Физическая память выделяется после, страницами при обращении к адресам. Если в какой-то момент физической памяти не хватит, программа завершится со страничной ошибкой.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Сб июн 11, 2016 8:55 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1110
Кстати, винда тоже так делает, но у неё есть условно бездонный файл подкачки: не хватает — увеличивает.
Главный вопрос: в каких случаях программа берёт память и не использует её? Или конкретней: зачем нам этот баг эта сомнительная фича?


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 12:44 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Pathoswithin
Практически во всех программах, сложнее "Hello, world!" Там, кстати, тоже. Например программа рисует клиентскую область в битмап, чтобы избежать ненужных перерисовок. Если этот битмап фиксированного размера под текущий размер окна, его надо будет пересоздавать при растягивании окна. В этом случае лучше зарезервировать под битмап буфер максимально необходимого размера и управлять страничной памятью вручную.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 10:20 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1110
Ну надо сделать проверку, чтобы система хотя бы не выдавала больше памяти, чем есть на данный момент.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 12:17 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 905
GerdtR писал(а):
При int 40h разве не происходит записи в стек следующего адреса? Как при call? Вроде как происходит.
Pathoswithin писал(а):
Вроде как ещё и флаги сохраняются. То-есть 8 байт в стеке.
Да при чём здесь стек приложения?
Вот код с вершиной стека в нуле
Код:
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 0
program.params dd 0
program.path   dd 0
; --------------------------- ;
START:
        mov    eax, 15
        mov    ebx, 3
        int    64
        mov    eax, -1
        int    64
; --------------------------- ;
END:
Можете убедиться, что он работает, то есть, происходит перерисовка экрана, затем программа благополучно завершается.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 12:40 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Pathoswithin
Система не может выделить памяти больше, чем есть. Просто не надо путать резервирование адресов в userspace процесса и физ. память всей системы.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 5:51 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1110
Если я правильно понимаю, по адресам памяти от FFFFFFFFh и ниже проецируется видеобуфер и доступ туда открыт всем программам.

Serge
Я не путаю, я спрашиваю проверяет ли система количество свободной физической памяти в момент резервирования адресов в userspace процесса?


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вс июн 12, 2016 6:44 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3925
Pathoswithin
Нет, не проверяет. Это лишнее. Некоторые применения 68.12 не требуют немедленного выделения физической памяти. Например открытие расшаренной памяти, загрузка длл, маппинг текстуры в драйвере. Широко применяемая malloc традиционно запрашивает память блоками большого размера при этом реально может использоваться 10%. Под стек в приложениях (binutils, Fplay и все остальные с newlib) резервируется 2Mб и т.д.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 13, 2016 7:37 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 905
Pathoswithin писал(а):
Если я правильно понимаю
А если нет :)
Спойлер: Показать
Код:
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 0
program.params dd 0
program.path   dd 0
; --------------------------- ;
START
        mov    [0xFFFFFFFF], dword 0
        mov    eax, -1
        int    64
; --------------------------- ;
END
Спойлер: Показать
Изображение


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 13, 2016 9:13 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1110
General protection fault это не page fault. Попробуй FFFFFFF8h.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн июн 13, 2016 9:56 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 905
Вот возьми сам и попробуй. Тебе полезно будет. А я результат знаю.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пт июн 17, 2016 2:14 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 905
Pathoswithin писал(а):
проверяет ли система количество свободной физической памяти в момент резервирования адресов в userspace процесса?
Serge писал(а):
Нет, не проверяет. Это лишнее.
Serge, ты так и не сказал, как можно решить эту проблему. Посмотри ещё раз на картинку в посте viewtopic.php?f=2&t=684&start=930#p57580 и скажи, как нужно в этом случае действовать приложению, чтобы не нарваться на PageFault. Ведь, как видно, памяти выделено явно больше, чем имеется, только приложения об этом не знают. Если можно, то пример кода, как можно обойти такую проблему.


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

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


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

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


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

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