Автор работы: Пользователь скрыл имя, 15 Мая 2012 в 18:19, лабораторная работа
Предоставить по запросу (системному вызову) область виртуальных адресов и, производя трансляцию адресов (виртуальный адрес -> физический), выдавать запрашиваемые данные.
ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ЭЛЕКТРОТЕХНИЧЕСКИЙ
ФАКУЛЬТЕТ
Лабораторная работа №3
Программирование
виртуальной памяти
Выполнил:
студент гр. АСУз-08-2
Назаров
М.Ю.
Проверил:
ст.пр. Кузнецов
Д.Б.
Пермь, 2011
Постановка задачи
Предоставить
по запросу (системному вызову) область
виртуальных адресов и, производя
трансляцию адресов (виртуальный адрес
-> физический), выдавать запрашиваемые
данные.
1. Обработка запроса "создать область" ("cm_mm_mk").
Параметр: число страниц в области.
Результат:
дескриптор созданной области.
#ifndef CMMM_H
#define CMMM_H
#define PAGE_IN_MEM 1
#define PAGE_IN_SWAP 4
#define CM_PAGESIZE 16
/* поле таблицы страниц - или номер физической*/
struct nphys_page
{
unsigned char status; /* в памяти или в swap? */
unsigned int n; /* номер физ страницы или адрес в swap */
};
int cm_mm(int *);
#endif
#include <stdio.h>
#include "cmic.h"
#include "cm_mem.h"
#include "cm_mm.h"
int cm_mm( pfrom )
int *pfrom; /* канал для для приема вызовов от ядра */
{
unsigned int n_obl=0; /* колво выделенных областей */
struct nphys_page **ar_obl[CM_NPROC]; /* массив выделенных областей
unsigned char cm_mem_map[CM_MEMSIZE/CM_
unsigned char cm_swap_map[CM_MEMSIZE*2/CM_
unsigned int cm_adr;
unsigned char cm_char;
extern int cm_pto[2]; /* канал посылки сообщения в ядро */
struct cm_mes dmes; /* получаемое сообщение */
struct cm_mes mes; /* отправляемое */
register int i;
/* инициализация карты памяти */
for(i=0; i< CM_MEMSIZE/CM_PAGESIZE; i++ )
{
cm_mem_map[i]=0;
}
while( 1 )
{
cm_recv(pfrom, &dmes); /* прием вызова */
/*формирование полей ответа*/
strncpy( mes.call_name, dmes.modul_name, CM_NAMESIZE);
strncpy( mes.modul_name, "cm_mm", CM_NAMESIZE);
if( strncmp(dmes.call_name, "cm_mm_mk", CM_NAMESIZE) == 0 )
{
int CountPage;
int NextPage=-1;