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

Applications development, KoOS API questions
  • Выделил соответствующие сообщения в отдельную тему.
    to infinity and beyond
  • Думаю, сюда относится.
    Вот код
    Spoiler:

    Code: Select all

    ORG 0
    BITS 32
    ; -------------------------- ;
    STACK_SIZE equ 256
    ; -------------------------- ;
    MEMORY_ALLOC_SIZE equ 1024 * 1024 * 1024
    ; -------------------------- ;
            db     'MENUET01'
            dd     1
            dd     START
            dd     END
            dd     END + STACK_SIZE
            dd     END + STACK_SIZE
            dd     0
            dd     0
    ; -------------------------- ;
    START:
    ; heap create:
            mov    eax, 68
            mov    ebx, 11
            int    64
    ; heap allocate        
            mov    eax, 68
            mov    ebx, 12
            mov    ecx, MEMORY_ALLOC_SIZE
            int    64                
    ; thread terminate
            mov    eax, -1
            int    64        
    END:
    Запустил под отладчиком. Почему-то exeption(ещё до запроса памяти, судя по debugger-у), но на BOARD — ничего. Как видно, памяти(Free memory) меньше, чем запрошено, но в eax, похоже, вернулся указатель на память.
    Spoiler:Image
  • Есть какой-нибудь субаллокатор (второго уровня), которым пользуются в проекте? С гранулярностью меньше страницы, разумеется.
  • Я видел programs\system\os
    http://websvn.kolibrios.org/listing.php ... em%2Fos%2F

    Не знаю текущий статус.
    Но грабли вижу я, библиотеки местами полагаются на то, что память выделяется системным аллокатором
  • Siemargl wrote:Я видел programs\system\os
    http://websvn.kolibrios.org/listing.php ... em%2Fos%2F

    Не знаю текущий статус.
    Но грабли вижу я, библиотеки местами полагаются на то, что память выделяется системным аллокатором
    Ну, это не проблема, интерфейс-то примерно одинаковый. Библиотек полно, интересно, чем уже тут пользуются.
  • 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 же есть, емнип.
  • В gcc действительно свой субаллокатор, в tcc я делать пока не стал - используется системный.

    Но прикрутить libc от gcc (в виде PE DLL) к не си- программам будет нетривиально.
  • Siemargl wrote:В gcc действительно свой субаллокатор, в tcc я делать пока не стал - используется системный.

    Но прикрутить libc от gcc (в виде PE DLL) к не си- программам будет нетривиально.
    А выкусить только аллокатор в объектный файл нереально?
  • //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.
  • Who is online

    Users browsing this forum: No registered users and 1 guest