8.5. Использование памяти DOS под расширителем Go32

Вверх  Предыдущий  Следующий

Поскольку Free Pascal для DOS – это 32-битный компилятор и используется расширитель DOS, доступ к памяти DOS является нетривиальным. Далее мы попытаемся объяснить, как получить доступ к памяти и использовать DOS или память в реальном режиме (спасибо за разъяснения Thomas Schatzl, E-mail: tom_at_work@geocities.com).

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

В Free Pascal указатель представляет собой смещение в селекторе DS, который указывает на данные вашей программы.

Для доступа к памяти DOS (в реальном режиме) вам нужен селектор. Который указывает на память DOS. Модуль go32 предоставляет вам такой селектор: переменную DosMemSelector, которая называется соответственно.

Вы также можете выделить память в пространстве памяти DOS, используя функцию global_dos_alloc модуля go32. Эта функция будет выделять память в области видимости DOS.В качестве примера здесь приведена функция, которая выделяет память в реальном режиме DOS и возвращает пару селектор:смещение (selector:offset).

procedure dosalloc(var selector : word; var segment : word; size : longint);
var result : longint;
begin
  result := global_dos_alloc(size);
  selector := word(result);
  segment := word(result shr 16);
end;

(Вам необходимо освободить эту память, используя функцию global_dos_free function).

Вы можете получить доступ к любому месту в памяти, используя селектор. Вы можете получить селектор, используя функцию:

function allocate_ldt_descriptors(count : word) : word;

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

function set_segment_base_address(d : word;s : longint) : boolean;

Её длина может быть установлена с помощью функции:

function set_segment_limit(d : word;s : longint) : boolean;

Вы можете управлять памятью, указанной в селекторе, используя функции модуля GO32. После использования селектора вы должны освободить его, снова используя функцию:

function free_ldt_descriptor(d : word) : boolean;

Подробности см. в описании модуля go32.