система)
};
// получить количество блоков
DLLFUNC int GetPhysMemoryBlockCount();
// получить описание блоков
// lpBlockList - список описания блоков
DLLFUNC void GetPhysMemoryBlockList(PHYS_MEMORY_BLOCK *
lpBlockList);
//----------------------------------------
// получить информацию о состоянии диска (посекторно)
// 0 - свободный сектор
// 1-100 - сектор принадлежит файлу (номер совпадает с номером в
Каталоге)
// 255 - зарезервировано системой
DLLFUNC void GetDiskStatus(BYTE * lpStatusBuffer);
// получить каталог
// файлов на диске не более 100 (индексы с 1 по 100 включительно)
// lpFileNames - имена файлов
// lpFirstSectors - номера первых секторов
// lpSizes - размеры файлов
DLLFUNC void GetDiskCatalog(char lpFileNames[] [20], int *
lpFirstSectors, int * lpSizes);
//-------------------------------------------------------------
// методы для подсистемы управления процессами
//-------------------------------------------------------------
// создать процесс
// nData - дополнительные параметры для процесса (зависит от
алгоритма планирования)
// 1. Гарантированное планирование - номер пользователя от имени
Которого запущен процесс
// 2. SJF с предсказанием - не используется
// 3. Вытесняющий SJF - полное время выполнения процесса
// 4. Приоритетное планирование с абсолютным приоритетом - номер
Приоритета
// 5. Многоуровневая очередь (2 уровня: (1)высокий приоритет – Round
Robin, (2)низкий приоритет – FCFS) - номер приоритета
// функция должна вернуть номер для созданного процесса
DLLFUNC int osCreateProcess(int nData);
// удалить процесс с указанным номером
DLLFUNC void osDeleteProcess(int nProcess);
// пустая команда для процесса
// команда без обращения к памяти и диску
DLLFUNC void osMakeEmptyCommand(int nProcess);
//-------------------------------------------------------------
// методы для подсистемы управления памятью
//-------------------------------------------------------------
// создать адресное пространство для указанного процесса
// nProcess - номер процесса для которого создается адресное
Пространство
// bBlockCount - количество блоков адресного пространства
// для страничного распределения bBlockCount всегда равен 1
// для сегментного и сегментно-страничного распределения -
Количество сегментов
// lpBlockLength - длины блоков аресного пространства
DLLFUNC void osMakeAddressSpace(int nProcess, int bBlockCount, int *
lpBlockLength);
enum MEMORY_OPERATION { MemoryRead = 0, MemoryWrite = 1};
// выволнить трансляцию адреса
// nProcess - номер процесса, в адресном пространстве которого
выполняется преобразование
// nVirtualAdress - виртуальный адрес, по которому пытаемся
Произвести обращение
// nOperationType - выполняемая операция при доступе к ячейке памяти
(MemoryRead или MemoryWrite)
// функция должна вернуть номер физ. ячейки или
// -1 если необходимая часть адресного пространства отсутствует в
Оперативной памяти
DLLFUNC int osTranslateAddress(int nProcess, int nVirtualAdress, int
nOperationType);
// выволнить трансляцию адреса
// nProcess - номер процесса, в адресном пространстве которого
выполняется преобразование
// nSegment - номер сегмента, к которому пытаемся произвести
Обращение
// nOffset - смещение в сегменте
// nOperationType - выполняемая операция при доступе к ячейке памяти
(MemoryRead или MemoryWrite)
// функция должна вернуть номер физ. ячейки или
// -1 если необходимая часть адресного пространства отсутствует в
Оперативной памяти
DLLFUNC int osTranslateAddress2(int nProcess, int nSegment, int nOffset,
int nOperationType);
//-------------------------------------------------------------
// методы для подсистемы ввода-вывода
//-------------------------------------------------------------
// запись данных из оперативной памяти в указанный файл
// nProcess - номер процесса (0-99), вызвавший метод (255 - система)
// fileName - имя файла (не более 20 символов)
// virtMemBuffer - адрес буфера в адресном пространстве процесса
// если вызывается от имени системы - virtMemBuffer указывает на
Физ. память
// count - длина буфера на запись
// offset - позиция в файле, с которой необходимо осуществлять запись
// возращает 1 - если успех
// -1 - если ошибка
DLLFUNC int osWriteFile(int nProcess, char * fileName, int
virtMemBuffer, int count, int offset);
// nSegment - номер сегмента в виртуальном адресном пространстве
Процесса
// nSegmentOffset - смещение в сегменте
DLLFUNC int osWriteFile2(int nProcess, char * fileName, int nSegment, int
nSegmentOffset, int count, int offset);
// запись данных в файл из указанного внешнего буфера
// fileName - имя файла (не более 20 символов)
// lpBuffer - адрес буфера с данными
// count - длина буфера на запись
// возращает 1 - если успех
// -1 - если ошибка
DLLFUNC int osWriteExternFile(char * fileName, BYTE * lpBuffer, int
count);
// для линейного адресного пространства
// чтение из файла данных в оперативную память
// nProcess - номер процесса (0-99), вызвавший метод (255 - система)
// fileName - имя файла (не более 20 символов)
// virtMemBuffer - адрес буфера в адресном пространстве процесса
// если вызывается от имени системы - virtMemBuffer указывает на
Физ. память
// count - длина буфера на чтение
// offset - позиция в файле, с которой необходимо осуществлять чтение
// возращает 1 - если успех
// -1 - если ошибка
DLLFUNC int osReadFile(int nProcess, char * fileName, int virtMemBuffer,
int count, int offset);
// для сегментированного адресного пространства
// nSegment - номер сегмента в виртуальном адресном пространстве
Процесса
// nSegmentOffset - смещение в сегменте
DLLFUNC int osReadFile2(int nProcess, char * fileName, int nSegment, int
nSegmentOffset, int count, int offset);
// чтение из файла данных в указанный внешнний буфер
// fileName - имя файла (не более 20 символов)
// lpBuffer - адрес буфера с данными
// count - длина буфера на для данных
// возращает количество прочитанных символов
// -1 - если ошибка
DLLFUNC int osReadExternFile(char * fileName, BYTE * lpBuffer, int
count);
// удаление файла
// nProcess - номер процесса (0-99), вызвавший метод (255 - система)
// fileName - имя файла (не более 20 символов)
// возращает 1 - если успешно
// -1 - если ошибка
DLLFUNC int osDeleteFile(int nProcess, char * fileName);
control_main.cpp
#include <windows.h>
#include "stdio.h"
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
ОПИСАНИЕ ИССЛЕДОВАТЕЛЬСКОЙ ЧАСТИ.
Программа написана на языке C++ и реализована в виде библиотеки
функций dll. [Программная реализация.] Данная библиотека содержит
Следующие функции, которые должны быть описаны в разрабатываемом
приложении:
Аппаратные функции - данные функции реализованы с модели
Операционной системы, их использование обязательно при
обращении к виртуальной машине:
DLLFUNC int GetMemorySize() - получить размер оперативной
памяти (в байтах);
1.2 DLLFUNC int GetPageSize() - получить размер страницы (в байтах);
1.3 DLLFUNC int GetDiskSize() - получить размер диска (в байтах);
1.4 DLLFUNC int GetSectorSize() - получить размер кластера (в байтах);
1.5 DLLFUNC void AddLog(char * s) - записать строку в лог (не более
40К за 500 мс);
DLLFUNC BYTE ReadMemoryByte(int memPhysAdress) - считать
байт из памяти по физ. адресу;
DLLFUNC void WriteMemoryByte(int memPhysAdress, BYTE value)
-
Записать байт в память по физ.
адресу;
1.8 DLLFUNC void ReadMemory(int memPhysAdress, BYTE * lpBuffer,
int count) - считать ___________из памяти по указанному физ. адресу
Несколько байт (memPhysAdress - адрес, с которого надо считывать
Данные, lpBuffer - буфер, в который необходимо перенести
указанные данные, count - количество считываемых байт);
1.9 DLLFUNC void WriteMemory(int memPhysAdress, BYTE * lpBuffer,
Int
Count) - записать в памяти из указанного буфера несколько байт
(memPhysAdress - адрес, по которому происходит запись,
LpBuffer - буфер, из которого переносятся данные, count -
количество байт);
DLLFUNC void ReadDisk(int memAdress, int nSector) - считать
кластер с диска (внимание, функция блокирующая), параметры:
MemAdress - адрес в оперативной памяти, начиная с
Которого необходимо
Поместить содержимое кластера, nSector - номер кластера диска,
с которого небходимо считать данные;
DLLFUNC void WriteDisk(int memAdress, int nSector) - записать
кластер с диска (внимание, функция блокирующая), параметры:
MemAdress - адрес в оперативной памяти, начиная с которого
Данные
Записываются в кластер, nSector - номер кластера диска, в который
Записываются данные.
Функции ОС - прототипы функций, которые необходимо реализовать
согласно варианту:
DLLFUNC void Start() - запуск подсистем управления, начальная
инициализация подсистем;
DLLFUNC void Stop() - остановка подсистем управления, остановка
Подсистем управления.