Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Функцией GetPhysMemoryBlockCount



// система зарезервировала в физ памяти 2000 байт начиная с адреса

lpBlockList[0].nStart = 100;

lpBlockList[0].nLength = 2000;

lpBlockList[0].nProcess = 255;

}

//----------------------------------------

// получить информацию о состоянии диска посекторно

// 0 - свободный сектор

// 1-100 - сектор принадлежит файлу (номер совпадает с номером в

Каталоге)

// 255 - зарезервировано системой

DLLFUNC void GetDiskStatus(BYTE * lpStatusBuffer) {

int nSectorCount = GetDiskSize() / 256;

for (int i = 0; i< nSectorCount/2; i++)

lpStatusBuffer[i] = 1;

for (int i=nSectorCount/2 + 3; i< nSectorCount/2 + 7; i++)

lpStatusBuffer[i] = 2;

}

// получить каталог

// файлов на диске не более 100 (индексы с 1 по 100 включительно)

// имя файла не более 20 символов

DLLFUNC void GetDiskCatalog(char lpFileNames[][20], int *

lpFirstSectors, int * lpSizes){

// файла с номером 0 не существует (0 зарезервирован)

strcpy(lpFileNames[1], " 1.dat" );

lpFirstSectors[1] = 0;

lpSizes[1] = GetDiskSize() / 2;

strcpy(lpFileNames[2], " 2.txt" );

lpFirstSectors[2] = GetDiskSize() / 512 + 3;

lpSizes[2] = 4;

}

//-------------------------------------------------------------

// методы для подсистемы управления процессами

//-------------------------------------------------------------

// создать процесс

// nData - дополнительные параметры для процесса (зависит от

алгоритма планирования)

// 1. Гарантированное планирование - номер пользователя от имени

Которого запущен процесс

// 2. SJF с предсказанием - не используется

// 3. Вытесняющий SJF - полное время выполнения процесса

// 4. Приоритетное планирование с абсолютным приоритетом - номер

Приоритета

// 5. Многоуровневая очередь (2 уровня: высокий приоритет – Round

Robin, низкий приоритет – FCFS) - номер приоритета

// функция должна вернуть номер для созданного процесса

DLLFUNC int osCreateProcess(int nData) {

return 0;

}

// удалить процесс с указанным номером

DLLFUNC void osDeleteProcess(int nProcess) {

}

// пустая команда для процесса

// команда без обращения к памяти и диску

DLLFUNC void osMakeEmptyCommand(int nProcess) {

}

//-------------------------------------------------------------

// методы для подсистемы управления памятью

//-------------------------------------------------------------

// создать адресное пространство для указанного процесса

// nProcess - номер процесса для которого создается адресное

Пространство

// bBlockCount - количество блоков адресного пространства

// для страничного распределения bBlockCount всегда равен 1

// для сегментного и сегментно-страничного распределения -

Количество сегментов

// lpBlockLength - длины блоков аресного пространства

DLLFUNC void osMakeAddressSpace(int nProcess, int bBlockCount, int *

lpBlockLength) {

}

// выволнить трансляцию адреса

// nProcess - номер процесса, в адресном пространстве которого

выполняется преобразование

// nVirtualAdress - виртуальный адрес, по которому пытаемся

Произвести обращение

// nOperationType - выполняемая операция при доступе к ячейке памяти

(MemoryRead или MemoryWrite)

// функция должна вернуть номер физ. ячейки или

// -1 если необходимая часть адресного пространства отсутствует в

Оперативной памяти

DLLFUNC int osTranslateAddress(int nProcess, int nVirtualAdress, int

nOperationType) {

return 0;

//return -1;

}

// выволнить трансляцию адреса

// nProcess - номер процесса, в адресном пространстве которого

выполняется преобразование

// nSegment - номер сегмента, к которому пытаемся произвести

Обращение

// nOffset - смещение в сегменте

// nOperationType - выполняемая операция при доступе к ячейке памяти

(MemoryRead или MemoryWrite)

// функция должна вернуть номер физ. ячейки или

// -1 если необходимая часть адресного пространства отсутствует в

Оперативной памяти

DLLFUNC int osTranslateAddress2(int nProcess, int nSegment, int nOffset,

int nOperationType) {

return 0;

//return -1;

}

//-------------------------------------------------------------

// методы для подсистемы ввода-вывода

//-------------------------------------------------------------

// запись данных из оперативной памяти в указанный файл

// 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) {

char buf[256];

sprintf(buf, " Запись файла %s из адресного пространства процесса

%d по адресу %d\r\n", fileName, nProcess, virtMemBuffer);

AddLog(buf);

sprintf(buf, " байт для записи - %d, смещение в файле - %d\r\n", count,

offset);

AddLog(buf);

return -1;

}

// nSegment - номер сегмента в виртуальном адресном пространстве

Процесса

// nSegmentOffset - смещение в сегменте

DLLFUNC int osWriteFile2(int nProcess, char * fileName, int nSegment, int

nSegmentOffset, int count, int offset) {

char buf[256];

sprintf(buf, " Запись файла %s из адресного пространства процесса

%d по адресу %d: %d\r\n", fileName, nProcess, nSegment, nSegmentOffset);

AddLog(buf);

sprintf(buf, " байт для записи - %d, смещение в файле - %d\r\n", count,

offset);

AddLog(buf);

return -1;

}

// запись данных в файл из указанного внешнего буфера

// fileName - имя файла (не более 20 символов)

// lpBuffer - адрес буфера с данными

// count - длина буфера на запись

// возращает 1 - если успех

// -1 - если ошибка

DLLFUNC int osWriteExternFile(char * fileName, BYTE * lpBuffer, int

count) {

int n = 256;

if (count< n) n = count;

WriteMemory(0, lpBuffer, n);

WriteDisk(0, 0);

return -1;

}

// чтение из файла данных в оперативную память

// nProcess - номер процесса (0-99), вызвавший метод (255 - система)

// fileName - имя файла (не более 20 символов)

// virtMemBuffer - адрес буфера в адресном пространстве процесса

// если вызывается от имени системы - virtMemBuffer указывает на

Физ. память

// count - длина буфера на чтение

// offset - позиция в файле, с которой необходимо осуществлять чтение

// возращает количество прочитанных символов

// -1 - если ошибка

DLLFUNC int osReadFile(int nProcess, char * fileName, int virtMemBuffer,

int count, int offset) {

char buf[256];

sprintf(buf, " Чтение файла %s в адресное пространство процесса %d

по адресу %d\r\n", fileName, nProcess, virtMemBuffer);

AddLog(buf);

sprintf(buf, " байт для чтения - %d, смещение в файле - %d\r\n",

count, offset);

AddLog(buf);

return -1;

}

// nSegment - номер сегмента в виртуальном адресном пространстве

Процесса

// nSegmentOffset - смещение в сегменте

DLLFUNC int osReadFile2(int nProcess, char * fileName, int nSegment, int

nSegmentOffset, int count, int offset) {

char buf[256];

sprintf(buf, " Чтение файла %s в адресное пространство процесса %d

по адресу %d: %d\r\n", fileName, nProcess, nSegment, nSegmentOffset);

AddLog(buf);

sprintf(buf, " байт для чтения - %d, смещение в файле - %d\r\n",

count, offset);

AddLog(buf);

return -1;

}

// чтение из файла данных в указанный внешнний буфер

// fileName - имя файла (не более 20 символов)

// lpBuffer - адрес буфера с данными

// count - длина буфера на для данных

// возращает количество прочитанных символов

// -1 - если ошибка

DLLFUNC int osReadExternFile(char * fileName, BYTE * lpBuffer, int

count) {

int n = 256;

if (count< n) n = count;

ReadDisk(0, 0);

ReadMemory(0, lpBuffer, n);

return n;

}

// удаление файла

// nProcess - номер процесса (0-99), вызвавший метод (255 - система)

// fileName - имя файла (не более 20 символов)

// возращает 1 - если успешно

// -1 - если ошибка

DLLFUNC int osDeleteFile(int nProcess, char * fileName) {

AddLog(" Удалить файл " );

AddLog(fileName);

AddLog(" \r\n" );

return -1;

}

Control.h

#include < windows.h>

#include "../vm_base/vm_base.h"

#define DLLFUNC extern " C" __declspec (dllexport)

//-------------------------------------------------------------

// методы для получения текущего состояния и управления машиной

//-------------------------------------------------------------

// запуск подсистем управления

DLLFUNC void Start();

// остановка подсистем управления

DLLFUNC void Stop();

enum PROCESS_STATUS { NotExist = 0, Execute = 1, Ready = 2, Wait =

3};

// получить информацию о процессах в системе

// размер буфера = 100

// lpProcStatusBuffer - буфер для сохранения информации о статусе

Процесса

// lpProcData - буфер для сохранения дополнительной информации о

Процессе

// 1. Гарантированное планирование - номер пользователя от имени

Которого запущен процесс

// 2. SJF с предсказанием - текущая оценка процесса

// 3. Вытесняющий SJF - оставшееся время выполнения процесса

// 4. Приоритетное планирование с абсолютным приоритетом - номер

Приоритета

// 5. Многоуровневая очередь - номер приоритета

DLLFUNC void GetProcessStatus(BYTE * lpProcStatusBuffer, double *

lpProcData);

//---------------------------------------

// структура для описания состояния физ. памяти

struct PHYS_MEMORY_BLOCK {

Int nStart; // начало блока в оперативной памяти

Int nLength; // длина блока


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-28; Просмотров: 585; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.049 с.)
Главная | Случайная страница | Обратная связь