⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vm_global.h

📁 操作系统实验:模拟LINUX操作系统的虚存管理机制
💻 H
字号:
/******************************************************************************/
/*全局常量声明*/

#define AUXILIARY_SPACE_FILE "auxiliary_space"					//模拟辅存空间的文件,假设赋存空间中存储了两个程序

#define ACTUAL_MEMORY_SIZE 32*4									//实存大小定义
#define VIRTUAL_MEMORY_SIZE	64*4								//虚存大小定义
#define PAGE_SIZE 4												//页表大小定义
#define PAGE_TOTAL (VIRTUAL_MEMORY_SIZE/PAGE_SIZE)				//二级页表数目
#define OUTER_PAGE_TOTAL (PAGE_TOTAL/PAGE_SIZE)					//一级页表数目
#define BLOCK_TOTAL (ACTUAL_MEMORY_SIZE/PAGE_SIZE)				//物理块数目
#define PID_NUM 2

#define READABLE 0x01u											//可读
#define WRITABLE 0x02u											//可写
#define EXECUTABLE 0x04u										//可执行

#define MAX_VALUE 0xFFu

#define FIFO "vm_fifo"

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/******************************************************************************/
/*全局枚举类型声明*/

/**错误类型枚举**/
typedef enum
{
	READ_DENY,													//该地址内容不可读
	WRITE_DENY,													//该地址内容不可写
	EXECUTE_DENY,												//该地址内容不可执行
	INVALID_REQUEST,											//非法访存请求
	OVER_BOUNDARY,												//访存地址越界
	FILE_OPEN_FAILED,											//打开文件失败
	FILE_CLOSE_FAILED,											//关闭文件失败
	FILE_SEEK_FAILED,											//文件指针定位失败
	FILE_READ_FAILED,											//读取文件失败
	FILE_WRITE_FAILED											//写入文件失败
}ErrorType;

typedef enum
{
	TRUE=1,
	FALSE=0
}BOOL;

typedef enum
{
	READ,
	WRITE,
	EXECUTE 
}RequestType;

/******************************************************************************/
/*全局结构体声明*/

/**类似PCB结构*/
typedef struct
{
	unsigned int pid;											//作业号
	unsigned int begin;											//起始外层页表号
	unsigned int end;											//结束外层页表号
}PCB;

/**外层页表结构类型**/
typedef struct
{
	unsigned int page_num;										//外层页号
	unsigned int index_num;										//二级页表块号
}OuterPageTableItem,*OuterPageTablePtr;

/**二级页表结构**/
typedef struct
{
	unsigned int page_num;										//二级页号
	unsigned int block_num;										//物理内存块号
	BOOL filled;												//特征位
	BOOL changed;												//页面是否改变
	unsigned char pro_type;										//读、写、执行类型
	unsigned long virtual_address;								//虚存地址
	unsigned long count;										//页面使用计数
    unsigned int no_use;                                        //用来寻找最近最久未使用的页面
}PageTableItem,*PageTablePtr;

typedef struct
{
	RequestType request_type;									//访存请求类型
	unsigned long virtual_address;								//虚存地址
	unsigned char value;										//存储的值
}MemoryAccessRequest,*MemoryAccessRequestPtr;

/******************************************************************************/
/*全局变量声明*/

unsigned char actual_memory[ACTUAL_MEMORY_SIZE];				//模拟实存空间的数组
FILE *auxmem_ptr;												//指向模拟辅存空间的文件指针
PageTableItem pagetable[PAGE_TOTAL];							//二级页表数组
OuterPageTableItem outerpagetable[OUTER_PAGE_TOTAL];			//一级页表数组
BOOL block_status[BLOCK_TOTAL];									//物理块使用标识
MemoryAccessRequestPtr mem_request;								//访存请求
unsigned int Time[PAGE_TOTAL];                                  //记录页面使用时间,便于FIFO算法使用
PCB pcb[PID_NUM];                                               //记录作业对应的起始以及结束页表号
unsigned int exec_times;										//记录页面使用的次数,便于LRU算法使用
int time_n;
int work_id;
/******************************************************************************/
/*全局函数声明*/

/**初始化环境**/
void init();

/**访存请求**/
void do_request(MemoryAccessRequestPtr);						//随机产生访存请求
void do_response();												//响应访存请求

/**页表处理**/
void do_page_in(PageTablePtr,unsigned int);						//将辅存内容写入实存
void do_page_out(PageTablePtr);									//将实存中被替换页面的内容写回辅存
void do_page_fault(PageTablePtr);								//缺页处理

/**页面淘汰算法**/
void do_LFU(PageTablePtr);										//最不频繁使用淘汰算法
void do_OPT(PageTablePtr);										//最优算法
void do_FIFO(PageTablePtr);										//先进先出
void do_LRU(PageTablePtr);										//最近最久未使用淘汰算法

/**打印页表**/
void print_pageinfo();

/**错误处理**/
void handle_error(ErrorType);

/**time数组处理**/
void time_change(unsigned int);

/**获取页面保护类型字符串**/
char *get_protype_str(char *str,unsigned char type);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -