1

Тема: Куча в KolibriOS

Реализована ли в KolibriOS куча для прикладных программ? Раньше таковой не было или я про нее не знал. Было только страничное выделение памяти ядром, аналог VirtualAlloc из Windows. Но в Windows также есть функции HeapCreate, HeapAlloc, HeapReAlloc и HeapFree, которые можно использовать из программ, не ломая голову, как реализовать свой менеджер кучи.

Есть ли нечто подобное в KolibriOS? Описано ли в заголовках для Delphi?

2

Re: Куча в KolibriOS

Freeman пишет:

Реализована ли в KolibriOS куча для прикладных программ?

Вообще она как бы есть, вот из справки

======================================================================
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
======================================================================
Параметры:
  * eax = 68 - номер функции
  * ebx = 11 - номер подфункции
Возвращаемое значение:
  * eax = 0 - неуспех
  * иначе размер созданной кучи
Замечания:
  * Вызов функции инициализирует кучу, из которой впоследствии можно
    выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
  * Если куча уже создана, функция вернёт размер существующей кучи.
    Размер кучи равен размеру всей свободной памяти приложения.
  * После создания кучи вызовы функции 64 игнорируются.
Freeman пишет:

Было только страничное выделение памяти ядром, аналог VirtualAlloc из Windows.

Но выделение действительно   страничное, из справки

======================================================================
========== Функция 68, подфункция 12 - выделить блок памяти. =========
======================================================================
Параметры:
  * eax = 68 - номер функции
  * ebx = 12 - номер подфункции
  * ecx = требуемый размер в байтах
Возвращаемое значение:
  * eax = указатель на выделенный блок
Замечания:
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
    размер выделенного блока больше или равен запрошенному.
Freeman пишет:

Описано ли в заголовках для Delphi?

Так как работа идёт с кучей, то я и назвал их соответственно HeapCreate, HeapAllocate, HeapReallocate и HeapFree, тем не менее, выделение там страничное.

{68.11}   Function  HeapCreate: Dword; StdCall; External 'KolibriOS';
{68.12}   Function  HeapAllocate(Bytes: Dword): Pointer; StdCall; External 'KolibriOS';
{68.13}   Function  HeapFree(MemPtr: Pointer): Dword; StdCall; External 'KolibriOS';
{68.20}   Function  HeapReallocate(MemPtr: Pointer; Bytes: Dword): Pointer; StdCall; External 'KolibriOS';

3

Re: Куча в KolibriOS

0CodErr пишет:

выделение там страничное.

Это никуда не годится. Кто бы портировал FastMM?

4

Re: Куча в KolibriOS

Секция импорта BorlndMM.dll, собранного на основе FastMM4 с облегченными {$DEFINE Tricks} системными модулями:

Imports from kernel32.dll
                  LeaveCriticalSection
                  EnterCriticalSection
                  GetCurrentThreadId
                  ExitProcess
                  UnhandledExceptionFilter
                  RtlUnwind
                  RaiseException
                  TlsSetValue
                  TlsGetValue
                  TlsFree
                  TlsAlloc
                  LocalFree
                  LocalAlloc
                  FreeLibrary

Imports from kernel32.dll
                  VirtualQuery
                  VirtualFree
                  VirtualAlloc
                  Sleep

Мне кажется, не так сложно портировать. Поддержку исключений пока не делать, пусть падает.

5

Re: Куча в KolibriOS

Смотря ещё как это использовать: как библиотеку(MSCOFF, а когда-то будет StrippedPE) или же подключать как модуль.
Вот здесь https://github.com/pleriche/FastMM4/blo … astMM4.pas
используется VirtualAlloc, VirtualFree, но нет LocalAlloc и LocalFree.

Эти функции можно заменить на аналоги из проекта PELoad
http://board.kolibrios.org/viewtopic.php?f=9&t=2318

align 16
;**********************************************************************************
VirtualAlloc: ;////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpAddress             [esp +  4 +1*4]
%define dwSize                [esp +  8 +1*4]
%define flAllocationType      [esp + 12 +1*4]
%define flProtect             [esp + 16 +1*4]
        push   ebx

        mov    eax, 68
        mov    ebx, 12
        mov    ecx, dwSize
        int    64

        pop    ebx
        ret    16
%undef lpAddress
%undef dwSize
%undef flAllocationType
%undef flProtect
align 16
;**********************************************************************************
VirtualFree: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpAddress             [esp +  4 +1*4]
%define dwSize                [esp +  8 +1*4]
%define dwFreeType            [esp + 12 +1*4]
        push   ebx

        mov    eax, 68
        mov    ebx, 13
        mov    ecx, lpAddress
        int    64

        pop    ebx
        ret    12
%undef lpAddress
%undef dwSize
%undef dwFreeType

Sleep тоже там есть, ExitProcess нет, но есть ExitThread — для однопоточного приложения эффект будет одинаковый.
System.Move и  System.FillChar можно оставить как есть.

Насчёт

                  TlsSetValue
                  TlsGetValue
                  TlsFree
                  TlsAlloc

не нашёл в исходнике, но если используется, то тогда надо разбираться, я с этим пока не работал, в PELoad не было реализовано(вообще могу выложить самую последнюю версию PELoad, хотя там уже форк есть, но всё равно, если интересно, конечно)

6

Re: Куча в KolibriOS

Первая секция импорта — модуль System, вторая — непосредственно сам FastMM. Delphi так и не научился их сливать, палится.

0CodErr пишет:

нет LocalAlloc и LocalFree.

В исходник не заглядывал, но на память эти функции используются для каких-то специальных назначений. Возможно, что и для исключений.

0CodErr пишет:

ExitProcess нет, но есть ExitThread — для однопоточного приложения эффект будет одинаковый.

А что тогда делает функция с кодом -1?

0CodErr пишет:

(вообще могу выложить самую последнюю версию PELoad, хотя там уже форк есть, но всё равно, если интересно, конечно)

Это надо не по форумам выкладывать, а залить на GitHub и делать там релизы. На форумах давать только ссылки на скачивание.

7

Re: Куча в KolibriOS

Freeman пишет:
0CodErr пишет:

нет LocalAlloc и LocalFree.

В исходник не заглядывал, но на память эти функции используются для каких-то специальных назначений. Возможно, что и для исключений.

Ну это же всё равно выделение\освобождение памяти. Хотя если

Freeman пишет:

Первая секция импорта — модуль System, вторая — непосредственно сам FastMM.

то для FastMM вообще только 4 функции нужны(надеюсь). Надо попробовать заменить в исходнике. Только вот аналога VirtualQuery для KolibriOS нет.
Вот, например, гле используется

        {Get the VM status for the pointer}
        LMemInfo.RegionSize := 0;
        VirtualQuery(APAddress,  LMemInfo, SizeOf(LMemInfo));
      end;
      {Check the readability of the memory address}
      Result := (LMemInfo.RegionSize >= 4)
        and (LMemInfo.State = MEM_COMMIT)
        and (LMemInfo.Protect and (PAGE_READONLY or PAGE_READWRITE or PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_EXECUTE_WRITECOPY) <> 0)
and (LMemInfo.Protect and PAGE_GUARD = 0);

Ну если здесь, допустим, можно вообще зарезервировать сразу всю память и потом считать, что вся она PAGE_EXECUTE_READWRITE, то в других случаях этого может быть не достаточно. Ну или в ядро проще добавить такую функцию, не знаю пока.
Вот тут размер нужен блока, а ядро не даёт такую информацию

        {Get the size of the current segment}
        VirtualQuery(LCurrentSegment, LMemInfo, SizeOf(LMemInfo));
        {Free the segment}
        if not VirtualFree(LCurrentSegment, 0, MEM_RELEASE) then
        begin
          Result := -1;
          Break;
        end;
        {Done?}
if NativeUInt(LMemInfo.RegionSize) >= LRemainingSize then

Так что, не знаю, может и можно как-то обойтись без VirtualQuery, но надо придумать как.
Вообще там эти функции используются в случае

{$ifndef POSIX}

а в противном случае

{$else}
begin
  {Not currently supported under Linux / OS X}
Result := nil;

вот так всё просто :-) фича не поддерживается просто.

Freeman пишет:
0CodErr пишет:

ExitProcess нет, но есть ExitThread — для однопоточного приложения эффект будет одинаковый.

А что тогда делает функция с кодом -1?

Это завершение потока.
В однопоточном приложении процесс имеет только один поток, поэтому такая функция в этом случае автоматически завершит и процесс.
Поэтому сейчас там так

align 16
;**********************************************************************************
ExitThread: ;//////////////////////////////////////////////////////////////////////
;**********************************************************************************
        mov    eax, -1
        int    64
        ; ret not need
align 16
;**********************************************************************************
ExitProcess: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
; actually need to exit ALL threads of process
        mov    eax, -1
        int    64
        ; ret not need
Freeman пишет:
0CodErr пишет:

(вообще могу выложить самую последнюю версию PELoad, хотя там уже форк есть, но всё равно, если интересно, конечно)

Это надо не по форумам выкладывать, а залить на GitHub и делать там релизы. На форумах давать только ссылки на скачивание.

Ну до релиза там далеко вообще. Просто я говорю, что, если это интересно будет(ну код там какой-нибудь), то можно выложить(тему создать?).

8

Re: Куча в KolibriOS

0CodErr пишет:

Просто я говорю, что, если это интересно будет(ну код там какой-нибудь), то можно выложить(тему создать?).

А версии отслеживать как? Лучше всё же по-взрослому — через GitHub. Он же не только для релизов, но и для разработки. Я подпишусь на проект, буду смотреть коммиты и качать, если найду что интересное. Сам FastMM теперь тоже на GitHub.

9

Re: Куча в KolibriOS

Freeman пишет:
0CodErr пишет:

Просто я говорю, что, если это интересно будет(ну код там какой-нибудь), то можно выложить(тему создать?).

А версии отслеживать как? Лучше всё же по-взрослому — через GitHub.

Да, это всё правильно, конечно. Но это ж сколько на всё тогда времени надо будет...
Я даже не знаю, будет ли продолжаться разработка, и если да, то какими темпами.
Ну я выложу на форум, а там уже по ситуации, если и вправду найдётся время для каких-то серьёзных улучшений и доработок, то тогда уже, конечно, нужно будет загрузить на GitHub.

10 (изменено: Freeman, 09.05.2020 в 15:28)

Re: Куча в KolibriOS

Я так и понял. Хочешь результата — сделай сам. Загрузил к себе. Тема про GitHub создана.