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

Applications development, KoOS API questions
  • А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.

    Я тут вот ещё попробовал сделать, как ты говорил, пройтись с шагом 4к.
    Вот исходник
    Spoiler:

    Code: Select all

    Unit Unit1;
    (* -------------------------------------------------------- *)
    Interface
    (* -------------------------------------------------------- *)
    Type
    
      Dword = Cardinal;
    
    Var
      hConsole: Pointer;
      ConsoleInit:       Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
      ConsoleExit:       Procedure(bCloseWindow: Cardinal); StdCall;
      printf:            Function(Const Format: PChar): Integer; CDecl VarArgs;
      getch:             Function: Char; StdCall;
    (* -------------------------------------------------------- *)
      Procedure Main; Forward;
      Procedure ThreadTerminate; Forward;
      Function  LoadLibrary(Path: PChar): Pointer; StdCall; Forward;
      Function  GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer; StdCall; Forward;
      Function  HeapCreate: Cardinal; Forward;
      Function  HeapAllocate(Bytes: Cardinal): Pointer; StdCall; Forward;
      Function  HeapFree(MemPtr: Pointer): Cardinal; StdCall; Forward;
      Function  GetFreeMemory: Dword; Forward;
      Function  GetAvailableMemory: Dword; Forward;
    (* -------------------------------------------------------- *)
    Implementation
    (* -------------------------------------------------------- *)
    Procedure Main();
    Var
       i: Cardinal;
       HeapSize: Dword;
       FreeMemory: Dword;
       AvailableMemory: Dword;
       MemPtr: PChar;   
    Begin
    
       hConsole          := LoadLibrary('/sys/lib/console.obj');
       ConsoleInit       := GetProcAddress(hConsole, 'con_init');
       ConsoleExit       := GetProcAddress(hConsole, 'con_exit');
       printf            := GetProcAddress(hConsole, 'con_printf');
       getch             := GetProcAddress(hConsole, 'con_getch');
    
       ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');
    
       FreeMemory      := GetFreeMemory();
       AvailableMemory := GetAvailableMemory();
       HeapSize        := HeapCreate();
    
       printf('Free memory            = %d kilobytes.'#10, FreeMemory);
       printf('Available memory       = %d kilobytes.'#10, AvailableMemory);
    
       If HeapSize = 0 Then
         printf('HeapCreate Error!'#10)
       Else Begin
         printf('Heap created. HeapSize = %d bytes.'#10, HeapSize);
    
         MemPtr := HeapAllocate(FreeMemory * 1024);
    
         If MemPtr = nil Then
           printf('HeapAllocate Error!'#10)
         Else
           printf('Allocated %d kilobytes. Pointer to memory = %#x'#10, FreeMemory, MemPtr);
    
         getch();  
         
         i := 0;
         While i < (FreeMemory * 1024) Do Begin
           MemPtr[i] := #0;
           Inc(i, 4096);
           printf('i = %d'#10, i);
         End;
           
         printf('Free memory            = %d kilobytes.'#10, GetFreeMemory());
         printf('Available memory       = %d kilobytes.'#10, GetAvailableMemory());
           
         getch();  
           
         If HeapFree(MemPtr) = 0 Then
           printf('HeapFree Error!'#10)
         Else
           printf('Memory freed.'#10);
    
       End;
    
       ConsoleExit(0);
       ThreadTerminate;
    End;
    (* -------------------------------------------------------- *)
    Function  HeapCreate: Cardinal;
    Asm
            push   ebx
            mov    eax, 68
            mov    ebx, 11
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    Function  HeapAllocate(Bytes: Cardinal): Pointer;
    Asm
            push   ebx
            mov    eax, 68
            mov    ebx, 12
            mov    ecx, Bytes
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    Function  HeapFree(MemPtr: Pointer): Cardinal;
    Asm
            push   ebx
            mov    eax, 68
            mov    ebx, 13
            mov    ecx, MemPtr
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    Function  GetFreeMemory: Dword;
    Asm
            push   ebx
            mov    eax, 18
            mov    ebx, 16
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    Function  GetAvailableMemory: Dword;
    Asm
            push   ebx
            mov    eax, 18
            mov    ebx, 17
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    Procedure ThreadTerminate();
    Asm
            mov    eax, $FFFFFFFF
            int    64
    End;
    (* -------------------------------------------------------- *)
    Function GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer;
    Asm
            push   esi
            push   edi
            push   ebx
            mov    edx, hLib
            xor    eax, eax
            test   edx, edx
            jz     @end
            mov    edi, ProcName
            mov    ecx, $FFFFFFFF
            repne scasb
            mov    ebx, ecx
            not    ebx
    @next:
            mov    esi, [edx]
            test   esi, esi
            jz     @end
            mov    ecx, ebx
            mov    edi, ProcName
            add    edx, 8
            repe cmpsb
            jne    @next
            mov    eax, [edx - 4]
    @end:
            pop    ebx
            pop    edi
            pop    esi
    End;
    (* -------------------------------------------------------- *)
    Function LoadLibrary(Path: PChar): Pointer;
    Asm
            push   ebx
            mov    eax, 68
            mov    ebx, 19
            mov    ecx, Path
            int    64
            pop    ebx
    End;
    (* -------------------------------------------------------- *)
    End.
    Я сначала открываю BOARD, потом запускаю приложение. А потом через некоторое время BOARD исчезает(вылетает наверное). Потом снова открываю BOARD, и там так
    Spoiler:Image
    Почему pagefault в kernel?
    Но это только если BOARD открыт перед запуском приложения. А если нет, то pagefault в application. Не исключено, конечно, что в моём коде где-то ошибка.
  • А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.
    Потому что это виртуальная память. 18.6 количество свободной физ. памяти на данный момент. 18.7 общее кол-во физической памяти.
    Скорее всего BOARD где-то не хватает страницы. Ошибка в ядре, потому что происходит в обработчике страничной ошибки, когда он не может выделить страницу. Так и должно быть.
  • Вопрос вот возник.
    Такой код:
    Spoiler:

    Code: Select all

    ORG 0
    BITS 32
    STACK_SIZE equ 256
    MEMORY_ALLOC_SIZE equ 1024 * 1024 * 128
            db     'MENUET01'
            dd     1
            dd     START
            dd     END
            dd     END + STACK_SIZE
            dd     END + STACK_SIZE
            dd     0
            dd     0
    START:
    ; HeapCreate
            mov    eax, 68
            mov    ebx, 11
            int    64
    ; HeapAllocate        
            mov    eax, 68
            mov    ebx, 12
            mov    ecx, MEMORY_ALLOC_SIZE
            int    64                     
            mov    esi, eax
            mov    ecx, MEMORY_ALLOC_SIZE / 4
            rep lodsd
    .loop:
            jmp    .loop
    END:
    CPU показывает, что мой процесс использует всего 1 страницу. И обратите внимание, сколько свободной памяти показывают CPUID и GMON.
    Spoiler:
    0.PNG
    0.PNG (46.09 KiB)
    Viewed 7426 times
    А теперь я прибил свой процесс через CPU. Показания CPUID и GMON изменились.
    Spoiler:
    1.PNG
    1.PNG (44.25 KiB)
    Viewed 7426 times
    Это логично вроде, но почему CPU показывал так мало? Или тогда чью память я прочитал?
  • CPU показывает кол-во памяти после загрузки приложения. Скорее всего это недостаток ф.9
  • Serge wrote:CPU показывает кол-во памяти после загрузки приложения.
    Ничего подобного. И с чего ты только это взял :lol: :lol:
  • 0CodErr
    Так по скриншоту получается. Образ test занимает в памяти одну страницу, что CPU и показывает.
  • Serge wrote:Так по скриншоту получается.
    А с другими приложениями, значит, по-другому? Как у нас ф.9 избирательно работает, оказывается :mrgreen:
  • 0CodErr
    Ты меня с толку сбил. CPU всё показывает правильно - 08001000 = 128Гб+4Кб
  • Serge wrote:CPU всё показывает правильно
    А, точно! Восьмёрка очень сильно на нолик похожа :)
    Но зато ты про ф.9 так навыдумывал :lol: Можно же было исходники посмотреть http://websvn.kolibrios.org/filedetails ... #line-3200
  • ... а я предлагал сделать ноль не перечёркнутым.
  • Pathoswithin, а он раньше был не перечёркнутым, но его можно было спутать с буквой "o". Потом его сделали перечёркнутым.
  • Надо просто переписать на большой шрифт и не портить глаза, не жележные ведь.
    Из хаоса в космос
  • Leency « Вт сен 12, 2017 1:22 pm » напомните, все еще нужно инициализировать кучу или это делается автоматически?
    Это всё равно будет убрано. Если автор того кода не удосужится это сделать, то я сам лично это сделаю. Так как это тупо деоптимизация.
    Его глупость заключается в том, что своим идиотским кодом он "наказывет" не только ленивых программистов(не вызвавших явно HeapCreate), но и всех остальных нормальных программистов.

    Это пусть ленивый прогрмаммист делает у себя в своём исходнике обёртку над системной функцией.
    А не ленивый вызовет один раз HeapCreate и всё на этом.
    Больше никаких дополнительных проверок не нужно.

    HeapAllocate не единственная функция, нуждающаяся в куче.
    Получается, что все зависящие функции будут делать лишнюю проверку.

    И, кстати, также этим был не доволен ashmew, однако ни автор кода, ни администрация не прислушались к этому.

    Лично я подобный идиотизм буду по возможности выпиливать.

    : а давайте не будем явно вызывать lib_init, а добавим в библиотеки дополнительные проверочки. Ну а что? А то ведь лень же?
    Заметьте, никому не пришло в голову заниматся подобной хренью.
    На лоре правильно подмечено было:[quote]Порой ЧСВ разработчиков крупных осей такое, что или никак не хотят с тобой соглашаться, или тянут согласование какого-то патча с каким-то разрабом, или у них своё виденье прожекта. А тут дадут доступ к репе за милое дело, как мне кажется[/quote] Вы им ещё про доолбанные префиксы расскажите. Вот смеху-то будет :lol: Но в проекте действительно не всё хорошо. Нас и так очень мало. А пододбные выходки только ухудшают ситуацию.
  • Инициализация 68.11 автоматом сделана не так давно.

    Вот описать бы юзер-интерфейс к существующему микро аллокатору, чтобы было удобно пользоваться из АСМа
    Который programs\system\os\kolibri.asm

    Блин, это PE DLL, которую хз как использовать не из С
  • Who is online

    Users browsing this forum: No registered users and 4 guests