Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср окт 18, 2017 4:15 pm

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




Начать новую тему  Ответить на тему  [ 77 сообщений ]  На страницу Пред. 1 2 3 4 5 6 След.
Автор Сообщение
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Сб окт 22, 2016 9:41 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Все правильно. free application memory. Свободная память приложения. У каждого процесса 2Гб юзерспейса. Соответственно максимальный размер кучи почти 2Гб.


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Сб окт 22, 2016 10:05 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.

Я тут вот ещё попробовал сделать, как ты говорил, пройтись с шагом 4к.
Вот исходник
Спойлер: Показать
Код:
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, и там так
Спойлер: Показать
Изображение
Почему pagefault в kernel?
Но это только если BOARD открыт перед запуском приложения. А если нет, то pagefault в application. Не исключено, конечно, что в моём коде где-то ошибка.


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Сб окт 22, 2016 10:47 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.
Потому что это виртуальная память. 18.6 количество свободной физ. памяти на данный момент. 18.7 общее кол-во физической памяти.
Скорее всего BOARD где-то не хватает страницы. Ошибка в ядре, потому что происходит в обработчике страничной ошибки, когда он не может выделить страницу. Так и должно быть.


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 9:03 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Вопрос вот возник.
Такой код:
Спойлер: Показать
Код:
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.
Спойлер: Показать
Вложение:
0.PNG
0.PNG [ 46.09 КБ | 649 просмотров ]
А теперь я прибил свой процесс через CPU. Показания CPUID и GMON изменились.
Спойлер: Показать
Вложение:
1.PNG
1.PNG [ 44.25 КБ | 649 просмотров ]
Это логично вроде, но почему CPU показывал так мало? Или тогда чью память я прочитал?


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 10:09 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
CPU показывает кол-во памяти после загрузки приложения. Скорее всего это недостаток ф.9


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 10:22 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Serge писал(а):
CPU показывает кол-во памяти после загрузки приложения.
Ничего подобного. И с чего ты только это взял :lol: :lol:


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 10:58 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
0CodErr
Так по скриншоту получается. Образ test занимает в памяти одну страницу, что CPU и показывает.


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 11:06 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Serge писал(а):
Так по скриншоту получается.
А с другими приложениями, значит, по-другому? Как у нас ф.9 избирательно работает, оказывается :mrgreen:


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Ср дек 21, 2016 11:55 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
0CodErr
Ты меня с толку сбил. CPU всё показывает правильно - 08001000 = 128Гб+4Кб


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

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Serge писал(а):
CPU всё показывает правильно
А, точно! Восьмёрка очень сильно на нолик похожа :)
Но зато ты про ф.9 так навыдумывал :lol: Можно же было исходники посмотреть http://websvn.kolibrios.org/filedetails ... #line-3200


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

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


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Пт дек 23, 2016 3:21 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Pathoswithin, а он раньше был не перечёркнутым, но его можно было спутать с буквой "o". Потом его сделали перечёркнутым.


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Пт дек 23, 2016 7:03 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
Надо просто переписать на большой шрифт и не портить глаза, не жележные ведь.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Вт сен 12, 2017 2:24 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Цитата:
Leency « Вт сен 12, 2017 1:22 pm » напомните, все еще нужно инициализировать кучу или это делается автоматически?
Это всё равно будет убрано. Если автор того кода не удосужится это сделать, то я сам лично это сделаю. Так как это тупо деоптимизация.
Его глупость заключается в том, что своим идиотским кодом он "наказывет" не только ленивых программистов(не вызвавших явно HeapCreate), но и всех остальных нормальных программистов.

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

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

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

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

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


Вернуться к началу
 Заголовок сообщения: Re: Выделение памяти
СообщениеДобавлено: Вт сен 12, 2017 3:07 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 268
Инициализация 68.11 автоматом сделана не так давно.

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

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


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

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


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

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


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

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