Page 3 of 6

Re: Выделение памяти

Posted: Mon Oct 17, 2016 3:18 pm
by //DG
Siemargl wrote:В gcc действительно свой субаллокатор, в tcc я делать пока не стал - используется системный.

Но прикрутить libc от gcc (в виде PE DLL) к не си- программам будет нетривиально.
А выкусить только аллокатор в объектный файл нереально?

Re: Выделение памяти

Posted: Mon Oct 17, 2016 3:26 pm
by 0CodErr
//DG, я вообще-то написал по дефолту. А если кому-то нужно сделать подмену. Например, для тестирования или отладки, то вот тогда и lib_init вызывать лишь при необходимости.
А то сейчас программы вынуждены из-за прихоти разработчиков таких библиотек таскать с собой вот это http://websvn.kolibrios.org/filedetails ... %2Fdll.inc А так бы GetProcAddress было бы достаточно.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 3:29 pm
by Serge
Там в левом нижнем углу написано Free memory(KB): 203716, а это меньше, чем запрошено(203716 < 1048576).
Это не мешает выделить виртуальную память, т.е. диапазон адресов. Если ты начнёшь эту память обнулять, получишь страничную ошибку, когда физическая память закончится.
Я проверял в VBox и VMware Player c 256 Мб

Re: Выделение памяти

Posted: Mon Oct 17, 2016 3:37 pm
by 0CodErr
Serge, попробую по-другому тогда объяснить.
Приложение1 резервирует всю память,
Приложение2 резервирует всю память,
..............
потом, когда приложения начнут её использовать, кто-то словит pagefault.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:05 pm
by Serge
0CodErr
Словит, когда свободные страницы закончатся. Но в твоём случае вылезает не страничное нарушение, a gpf - общее нарушение защиты.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:10 pm
by 0CodErr
Serge wrote:Но в твоём случае вылезает не страничное нарушение, a gpf - общее нарушение защиты.
Да это, похоже, не к этой теме относится.
Словит, когда свободные страницы закончатся.
Хорошо, как перед использованием какой-либо страницы определить, свободна она, или её уже кто-то другой использует?
Ты говорил, что надо В цикле с шагом в 4Кб пройти по всем страницам. Это закрепит физ. страницы по адресам. Так почему бы ядру самому не закрепить страницы?

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:21 pm
by //DG
0CodErr wrote://DG, я вообще-то написал по дефолту. А если кому-то нужно сделать подмену. Например, для тестирования или отладки, то вот тогда и lib_init вызывать лишь при необходимости.
А то сейчас программы вынуждены из-за прихоти разработчиков таких библиотек таскать с собой вот это http://websvn.kolibrios.org/filedetails ... %2Fdll.inc А так бы GetProcAddress было бы достаточно.
Так и я говорю: по дефолту ты просто прокидываешь адрес стандартных процедур. То, что надо с собой что-то таскать - совсем другой вопрос.


Ококок, я воспринял "lib_init" как абстрактный вызов для инициализации данной библиотеки. А ты о конкретном lib_init, извини. еще не привык к вашему языку :D

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:23 pm
by //DG
0CodErr wrote:
Serge wrote:Но в твоём случае вылезает не страничное нарушение, a gpf - общее нарушение защиты.
Да это, похоже, не к этой теме относится.
Словит, когда свободные страницы закончатся.
Хорошо, как перед использованием какой-либо страницы определить, свободна она, или её уже кто-то другой использует?
Ты говорил, что надо В цикле с шагом в 4Кб пройти по всем страницам. Это закрепит физ. страницы по адресам. Так почему бы ядру самому не закрепить страницы?
В Колибри есть что-то типа MEM_RESERVE/MEM_COMMIT? Ну, вызываешь ты функцию "дай мне памяти, ядро и закрепи-ка физические сразу" или просто "зарезервируй мне диапазон".
А то если нет подкачки, резервирование без закрепления - странная штука.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:45 pm
by Serge
Хорошо, как перед использованием какой-либо страницы определить, свободна она, или её уже кто-то другой использует?
Ты про физическую страницу ? Физический адрес которой не имеет смысла в виртуальном адресном пространстве процесс ? А что это тебе даст ?

Re: Выделение памяти

Posted: Mon Oct 17, 2016 4:50 pm
by 0CodErr
Serge, нет, я про виртуальную, которую будет использовать процесс в юзермоде.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 5:02 pm
by Serge
Страница выделяется при первом обращении к ней. И остаётся закреплённой, пока процесс её не вернёт ядру.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 5:10 pm
by 0CodErr
Serge, первое обращение может совершить и любой другой процесс, зарезервировавший эту память. Получается, кто первый встал — того и тапки? :lol: А остальные pagefault поймают.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 5:15 pm
by Pathoswithin
Ну обсуждалось же уже, тему перечитай.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 6:03 pm
by Serge
первое обращение может совершить и любой другой процесс, зарезервировавший эту память.
Нет, не может. У другого процесса другое адресное пространство. Общее только пространство ядра, юзерспейс индивидуальный.

Re: Выделение памяти

Posted: Mon Oct 17, 2016 6:08 pm
by 0CodErr
Обсуждалось-то оно обсуждалось, а толку? Мне больше всего "понравился" 3-ий пункт алгоритма Serge viewtopic.php?f=2&t=3297&start=15#p65652
Ну разве кто-то будет использовать эту ОС для серьёзных вещей? Представьте, что от этого зависила бы работа дорогостоящего оборудования. Я уж не говорю про жизнь людей. А тут, понимаешь, Скрестить пальцы.
Так и представляю, пишет кто-то багрепорт, а Serge ему: "Пальцы скрещивали?" :)
Нет, не может. У другого процесса другое адресное пространство.
А я и не про это вовсе. Если 2 приложения зарезервируют каждый всю свободную память, то при обращении к ней рано или поздно у кого-то будет pagefault.