Ну и не забываем, что система многозадачная — пока наш процесс делал запрос, другой процесс уже взял и использует память.
А других вариантов нет.
Алгоритм такой:
1. Узнать объём свободной физ. памяти.
2. Зарезервировать память при помощи 68.12
3. Скрестить пальцы
4. В цикле с шагом в 4Кб пройти по всем страницам. Это закрепит физ. страницы по адресам.
Запустил под отладчиком. Почему-то exeption(ещё до запроса памяти, судя по debugger-у), но на BOARD — ничего. Как видно, памяти(Free memory) меньше, чем запрошено, но в eax, похоже, вернулся указатель на память.Spoiler:
Siemargl, а и при этом некоторые библиотеки хотят в lib_init указатели на alloc\free\realloc.
Проще, наверное было эти функции по дефолту в саму библиотеку впилить. А lib_init вызывать лишь при необходимости.
0CodErr
У меня не получилось воспроизвести ошибку. Судя по отладчику 68.12 отработала успешно, зарезервировав память начиная 0х2000. Как ты тестировал, в какой конфигурации ?
Serge, да, странное дело. Тестировал пока в эмуляторах. Exeption у меня появляется только в VirtualBox, а в Qemu и Bochs — всё нормально. Причём, это и с другими программами тоже так. Например, calc под отладчиком так же ведёт себя. Может ещё как-то с этим viewtopic.php?f=36&t=3395#p66407 связано? Там тоже сначала процесс становится "suspended", а потом продолжает работу. Надо на реальном железе попробовать тогда ещё.
Судя по отладчику 68.12 отработала успешно
Там в левом нижнем углу написано Free memory(KB): 203716, а это меньше, чем запрошено(203716 < 1048576).
0CodErr wrote:Siemargl, а и при этом некоторые библиотеки хотят в lib_init указатели на alloc\free\realloc.
Проще, наверное было эти функции по дефолту в саму библиотеку впилить. А lib_init вызывать лишь при необходимости.
Это наоборот замечательно, что не захардкожено напрямую, потому что можно сделать подмену. Например, для тестирования или отладки. Или если потребуется что-то отфильтровать и перенаправить в другой вызов и т.д.
Из переносимых проектов вижу FreshLib с отдельным менеджером памяти второго уровня. Но ведь чем-то пользуются ваши программы(кроме programs\system\os)? libc же есть, емнип.
//DG, я вообще-то написал по дефолту. А если кому-то нужно сделать подмену. Например, для тестирования или отладки, то вот тогда и lib_init вызывать лишь при необходимости.
А то сейчас программы вынуждены из-за прихоти разработчиков таких библиотек таскать с собой вот это http://websvn.kolibrios.org/filedetails ... %2Fdll.inc А так бы GetProcAddress было бы достаточно.
Там в левом нижнем углу написано Free memory(KB): 203716, а это меньше, чем запрошено(203716 < 1048576).
Это не мешает выделить виртуальную память, т.е. диапазон адресов. Если ты начнёшь эту память обнулять, получишь страничную ошибку, когда физическая память закончится.
Я проверял в VBox и VMware Player c 256 Мб
Serge, попробую по-другому тогда объяснить.
Приложение1 резервирует всю память,
Приложение2 резервирует всю память,
..............
потом, когда приложения начнут её использовать, кто-то словит pagefault.