Выделение памяти
-
Все правильно. free application memory. Свободная память приложения. У каждого процесса 2Гб юзерспейса. Соответственно максимальный размер кучи почти 2Гб.
А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.
Я тут вот ещё попробовал сделать, как ты говорил, пройтись с шагом 4к.
Вот исходникЯ сначала открываю BOARD, потом запускаю приложение. А потом через некоторое время BOARD исчезает(вылетает наверное). Потом снова открываю BOARD, и там такПочему pagefault в kernel?
Но это только если BOARD открыт перед запуском приложения. А если нет, то pagefault в application. Не исключено, конечно, что в моём коде где-то ошибка.
Я тут вот ещё попробовал сделать, как ты говорил, пройтись с шагом 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.
Spoiler:
Но это только если BOARD открыт перед запуском приложения. А если нет, то pagefault в application. Не исключено, конечно, что в моём коде где-то ошибка.
Потому что это виртуальная память. 18.6 количество свободной физ. памяти на данный момент. 18.7 общее кол-во физической памяти.А тогда SysFn18.16 и SysFn18.17 что возвращают? Размер физической? Просто получается, что размер свободной памяти приложения больше, чем размер всей имеющейся памяти.
Скорее всего BOARD где-то не хватает страницы. Ошибка в ядре, потому что происходит в обработчике страничной ошибки, когда он не может выделить страницу. Так и должно быть.
Вопрос вот возник.
Такой код:CPU показывает, что мой процесс использует всего 1 страницу. И обратите внимание, сколько свободной памяти показывают CPUID и GMON.А теперь я прибил свой процесс через CPU. Показания CPUID и GMON изменились.Это логично вроде, но почему CPU показывал так мало? Или тогда чью память я прочитал?
Такой код:
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:
Spoiler:
Spoiler:
CPU показывает кол-во памяти после загрузки приложения. Скорее всего это недостаток ф.9
Ничего подобного. И с чего ты только это взялSerge wrote:CPU показывает кол-во памяти после загрузки приложения.
0CodErr
Так по скриншоту получается. Образ test занимает в памяти одну страницу, что CPU и показывает.
Так по скриншоту получается. Образ test занимает в памяти одну страницу, что CPU и показывает.
А с другими приложениями, значит, по-другому? Как у нас ф.9 избирательно работает, оказываетсяSerge wrote:Так по скриншоту получается.
0CodErr
Ты меня с толку сбил. CPU всё показывает правильно - 08001000 = 128Гб+4Кб
Ты меня с толку сбил. CPU всё показывает правильно - 08001000 = 128Гб+4Кб
А, точно! Восьмёрка очень сильно на нолик похожаSerge wrote:CPU всё показывает правильно
Но зато ты про ф.9 так навыдумывал Можно же было исходники посмотреть http://websvn.kolibrios.org/filedetails ... #line-3200
... а я предлагал сделать ноль не перечёркнутым.
Pathoswithin, а он раньше был не перечёркнутым, но его можно было спутать с буквой "o". Потом его сделали перечёркнутым.
Надо просто переписать на большой шрифт и не портить глаза, не жележные ведь.
Из хаоса в космос
Это всё равно будет убрано. Если автор того кода не удосужится это сделать, то я сам лично это сделаю. Так как это тупо деоптимизация.Leency « Вт сен 12, 2017 1:22 pm » напомните, все еще нужно инициализировать кучу или это делается автоматически?
Его глупость заключается в том, что своим идиотским кодом он "наказывет" не только ленивых программистов(не вызвавших явно HeapCreate), но и всех остальных нормальных программистов.
Это пусть ленивый прогрмаммист делает у себя в своём исходнике обёртку над системной функцией.
А не ленивый вызовет один раз HeapCreate и всё на этом.
Больше никаких дополнительных проверок не нужно.
HeapAllocate не единственная функция, нуждающаяся в куче.
Получается, что все зависящие функции будут делать лишнюю проверку.
И, кстати, также этим был не доволен ashmew, однако ни автор кода, ни администрация не прислушались к этому.
Лично я подобный идиотизм буду по возможности выпиливать.
: а давайте не будем явно вызывать lib_init, а добавим в библиотеки дополнительные проверочки. Ну а что? А то ведь лень же?
Заметьте, никому не пришло в голову заниматся подобной хренью.
На лоре правильно подмечено было:[quote]Порой ЧСВ разработчиков крупных осей такое, что или никак не хотят с тобой соглашаться, или тянут согласование какого-то патча с каким-то разрабом, или у них своё виденье прожекта. А тут дадут доступ к репе за милое дело, как мне кажется[/quote] Вы им ещё про доолбанные префиксы расскажите. Вот смеху-то будет Но в проекте действительно не всё хорошо. Нас и так очень мало. А пододбные выходки только ухудшают ситуацию.
Инициализация 68.11 автоматом сделана не так давно.
Вот описать бы юзер-интерфейс к существующему микро аллокатору, чтобы было удобно пользоваться из АСМа
Который programs\system\os\kolibri.asm
Блин, это PE DLL, которую хз как использовать не из С
Вот описать бы юзер-интерфейс к существующему микро аллокатору, чтобы было удобно пользоваться из АСМа
Который programs\system\os\kolibri.asm
Блин, это PE DLL, которую хз как использовать не из С
Who is online
Users browsing this forum: No registered users and 36 guests