Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

2.3. Создание приложения, работающего с виртуальной памятью

Создайте приложение, изображенное на рисунке 2.1. Данное приложение демонстрирует работу перечисленных выше функций. Для работы с виртуальной памятью.

Для создания приложения выполните следующие действия:

  1. Создайте проект (New Application);

  2. Перенесите на форму компоненты, перечисленные в таблице 2.10.

.

Таблица 2.10 Компоненты создаваемого приложения

Компонент

Класс

Описание

Button1

TButton

Кнопка «SysInfo». Страница Standard палитры компонентов.

Button2

TButton

Кнопка «GlobalMemoryStatus»

Button3

TButton

Кнопка «VirtualQuery»

Button4

TButton

Кнопка «VirtualAlloc»

Button5

TButton

Кнопка «VirtualFree»

Button6

TButton

Кнопка «VirtualProtect»

Button7

TButton

Кнопка «Выход»

Label1

TLabel

Текст «Введите адрес виртуальной памяти». Страница Standard палитры компонентов.

Edit1

TEdit

Окно ввода адреса виртуальной памяти.

Memo1

TMemo

Окно для вывода информации.

  1. В блоке VAR введите переменную p:

var

Form1: TForm1;

p:pointer;

implementation

…………………………………

  1. Для события OnActivate формы Form1 запишите следующий программный код:

procedure TForm1.FormActivate(Sender: TObject);

begin

Memo1.Clear;

end;

  1. Для события OnClick кнопки Button1 («SysInfo») запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

VAR

// SysInf:TSystemInfo;

SysInf:SYSTEM_INFO;

begin

GetSystemInfo(SysInf);

Memo1.Clear;

memo1.Lines.Add('Размер страницы '+IntToStr(SysInf.dwPageSize)+' байт');

memo1.Lines.Add('Процессор '+IntToStr(SysInf.wProcessorArchitecture));

memo1.Lines.Add('Зарезервировано '+IntToStr(SysInf.wReserved));

memo1.Lines.Add('Количество процессоров '+IntToStr(SysInf.dwNumberOfProcessors));

memo1.Lines.Add('Маска активного процессора '+IntToStr(SysInf.dwActiveProcessorMask));

memo1.Lines.Add('Тип процессора '+IntToStr(SysInf.dwProcessorType));

memo1.Lines.Add('Гранулярность выделения ресурсов '+IntToStr(SysInf.dwAllocationGranularity));

memo1.Lines.Add(' '+IntToStr(SysInf.wProcessorLevel));

memo1.Lines.Add(' '+IntToStr(SysInf.wProcessorRevision));

end;

  1. Для события OnClick кнопки Button2 («GlobalMemoryStatus») запишите следующий программный код:

procedure TForm1.Button2Click(Sender: TObject);

VAR //ms:MEMORYSTATUS;

ms:TMEMORYSTATUS;

begin

ms.dwLength:=sizeof(MEMORYSTATUS);

GlobalMemoryStatus(ms);

Memo1.Clear;

Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');

Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');

Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');

Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');

Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');

Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');

Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');

end;

  1. Для события OnClick кнопки Button3 («VirtualQuery») запишите следующий программный код:

procedure TForm1.Button3Click(Sender: TObject);

VAR //mbi:MEMORY_BASIC_INFORMATION;

mbi:TMemoryBasicInformation;

dwRez:DWORD;

begin

if Edit1.GetTextLen<=0

then ShowMessage('Введите виртуальный адрес')

else

begin

dwRez:=VirtualQuery(pointer(StrToInt(Edit1.Text)),mbi,sizeof(MEMORY_BASIC_INFORMATION));

Memo1.Clear;

Memo1.Lines.Add('Базовый адрес '+IntToStr(integer(mbi.BaseAddress)));

Memo1.Lines.Add('Адрес размещения'+IntToStr(integer(mbi.BaseAddress)));

case mbi.AllocationProtect of

0: Memo1.Lines.Add('ВАП зарезервировано');

PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_NOACCESS');

PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');

PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');

PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');

PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');

PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');

PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');

PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');

end;

Memo1.Lines.Add('Размер региона '+IntToStr(mbi.RegionSize)+' байт');

case mbi.State of

MEM_COMMIT: Memo1.Lines.Add('Состояние ВАП MEM_COMMIT');

MEM_RESERVE: Memo1.Lines.Add('Состояние ВАП MEM_RESERVE');

MEM_FREE: Memo1.Lines.Add('Состояние ВАП MEM_FREE');

end;

case mbi.Protect of

0: Memo1.Lines.Add('зарезервировано');

PAGE_NOACCESS:Memo1.Lines.Add('Атрибут защиты физ.памяти PAGE_NOACCESS');

PAGE_READONLY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READONLY');

PAGE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_READWRITE');

PAGE_EXECUTE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE');

PAGE_EXECUTE_READ:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READ');

PAGE_EXECUTE_READWRITE:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_READWRITE');

PAGE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_WRITECOPY');

PAGE_EXECUTE_WRITECOPY:Memo1.Lines.Add('Атрибут защиты ВАП PAGE_EXECUTE_WRITECOPY');

end;

end;

end;

  1. Для события OnClick кнопки Button4 («VirtualAlloc») запишите следующий программный код:

procedure TForm1.Button4Click(Sender: TObject);

VAR ms:MEMORYSTATUS;

begin

If Edit1.GetTextLen=0

then p:=VirtualAlloc(nil,4096,MEM_COMMIT,PAGE_READWRITE)

else p:=VirtualAlloc(pointer(StrToInt64(Edit1.Text)),4096,MEM_COMMIT,PAGE_READWRITE);

Memo1.Clear;

ms.dwLength:=sizeof(MEMORYSTATUS);

GlobalMemoryStatus(ms);

Memo1.Clear;

Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');

Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');

Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');

Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');

Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');

Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');

Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');

end;

  1. Для события OnClick кнопки Button5 («VirtualFree») запишите следующий программный код:

procedure TForm1.Button5Click(Sender: TObject);

VAR

ms:MEMORYSTATUS;

begin

VirtualFree(p,4096,MEM_DECOMMIT);

VirtualFree(p,4096,MEM_RELEASE);

Memo1.Clear;

ms.dwLength:=sizeof(MEMORYSTATUS);

GlobalMemoryStatus(ms);

Memo1.Clear;

Memo1.Lines.Add('Загружено памяти '+IntToStr(ms.dwMemoryLoad)+' байт');

Memo1.Lines.Add('Всего физическая память '+IntToStr(ms.dwTotalPhys)+' байт');

Memo1.Lines.Add('Доступная физическая память '+IntToStr(ms.dwAvailPhys)+' байт');

Memo1.Lines.Add('Общий размер страничного файла '+IntToStr(ms.dwTotalPageFile)+' байт');

Memo1.Lines.Add('Доступный размер страничного файла '+IntToStr(ms.dwAvailPageFile)+' байт');

Memo1.Lines.Add('Общий размер виртуальной памяти '+IntToStr(ms.dwTotalVirtual)+' байт');

Memo1.Lines.Add('Доступный размер виртуальной памяти '+IntToStr(ms.dwAvailVirtual)+' байт');

end;

  1. Для события OnClick кнопки Button7 («Выход») запишите следующий программный код:

procedure TForm1.Button6Click(Sender: TObject);

begin

Form1.Close;

end;

  1. Откомпилируйте приложение и проверьте его работу.