Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Функцией 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; Просмотров: 618; Нарушение авторского права страницы