Программирование виртуальной памяти

Автор работы: Пользователь скрыл имя, 15 Мая 2012 в 18:19, лабораторная работа

Краткое описание

Предоставить по запросу (системному вызову) область виртуальных адресов и, производя трансляцию адресов (виртуальный адрес -> физический), выдавать запрашиваемые данные.

Прикрепленные файлы: 1 файл

lab3.doc

— 64.50 Кб (Скачать документ)

ПЕРМСКИЙ  ГОСУДАРСТВЕННЫЙ  ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ЭЛЕКТРОТЕХНИЧЕСКИЙ  ФАКУЛЬТЕТ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Лабораторная  работа №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_PAGESIZE]; /* карта памяти

                                          1 - страница занята

                                          0 - свободна */

    unsigned char cm_swap_map[CM_MEMSIZE*2/CM_PAGESIZE]; /* карта swap

                                          1 - страница занята

                                          0 - свободна */

    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;

Информация о работе Программирование виртуальной памяти