模拟请求分页管理中地址转换和缺页中断处理

软件:visual studio

 设计缺页中断处理程序。当对读入的逻辑地址,划分为页号、页内 地址后,通过页表发现访问的页不在内存,转入“缺页中断处理” 程序去处理。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<windows.h>
#define PN 7
#define PAGESIZE 1024
typedef struct PAGETAB
{
	int no;
	int status;
	int chunkno;
}PAGETAB;
int a[7] = { 7 };//用数组存储页面进入顺序,由于页号小于等于7,故数组长度为7,页号小于7,故初始化置7代表无页号数据

void show(PAGETAB s[])
{
	printf("页号\t状态\t物理块号\n");
	for (int i = 0;i < PN;i++)
		if(s[i].status == 1)
		   printf("%d\t%d\t%d\n", s[i].no, s[i].status, s[i].chunkno);
}
void change(PAGETAB s[])
{
	int flag = 1, j;
	char st = 'N';
	int delete;
	while (flag == 1)
	{
		int A;
		int place;
		printf("逻辑地址:");
		scanf("%d", &A);
		int p = A / PAGESIZE;
		int inplace = A % PAGESIZE;
		for (j = 0;j < PN;j++)
		{
			if (a[j] == 7)
			{
				a[j] = p;
				break;
			}
		}
		if (p >= PN) printf("ERROR:非法逻辑地址!\n");
		else
		{
			printf("页号:%d\n", p);
			printf("页内位移:%d\n", inplace);

			if (s[p].status == 0)
			{
				delete = a[1];
				for (j = 0;j < PN;j++)
					if (a[j] == delete) break;
				s[j].status = 0;
				s[p].chunkno = s[j].chunkno;
				s[p].status = 1;
				for (j = 0;j < PN;j++) a[j] = a[j + 1];          
				printf("是否缺页:Y\n");
				printf("淘汰的页面:%d\n", delete);
			}
			else
			{
				printf("是否缺页:N\n");
				printf("淘汰的页面:\n");
			}
			place = s[p].chunkno * PAGESIZE + inplace;
			printf("该逻辑地址存储的物理块:%d\n", s[p].chunkno);
			printf("物理地址:%d\n", place);
		}
		printf("Do you want to continue ? (1 yes 0 no) : ");
		scanf("%d", &flag);
	}
}
void main()
{
	PAGETAB s[PN];
	int sel, i;
	for (i = 0;i < PN;i++)
	{
		s[i].no = i;
		s[i].status = 0;
	}
	s[0].status = s[1].status = s[2].status = 1;
	s[0].chunkno = 9;
	s[1].chunkno = 5;
	s[2].chunkno = 4;//输入装入内存的页面号及存入的物理块号(假定只分配3个物理块);
	a[0] = 0;
	a[1] = 1;
	a[2] = 2;
	while (1)
	{
		printf("************System Menu************\n");
		printf("         1  change/*地址转换*/     \n");
		printf("         2  show/*显示页表*/       \n");
		printf("         3  exit                   \n");
		printf("***********************************\n");
		printf("Please input your choice:");
		scanf("%d", &sel);
		switch (sel)
		{
		case 1:change(s);break;
		case 2:show(s);break;
		case 0:exit(0);
		}
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的模拟程序,它模拟了分页式存储管理的硬件地址转换缺页中断: ``` #include <stdio.h> #include <stdlib.h> #define PAGE_SIZE 1024 // 页大小为1024字节 #define PAGE_NUM 16 // 总共有16页 #define FRAME_SIZE 256 // 帧大小为256字节 #define FRAME_NUM 64 // 总共有64帧 int page_table[PAGE_NUM]; // 页表 int frame_table[FRAME_NUM]; // 帧表 // 初始化页表和帧表 void init_tables() { for (int i = 0; i < PAGE_NUM; i++) { page_table[i] = -1; // 初始化为无效页 } for (int i = 0; i < FRAME_NUM; i++) { frame_table[i] = -1; // 初始化为未分配帧 } } // 将页号为page的页映射到一个未分配的帧,并返回帧号 int map_page(int page) { // 查找未分配的帧 for (int i = 0; i < FRAME_NUM; i++) { if (frame_table[i] == -1) { // 找到未分配的帧,将页映射到该帧 page_table[page] = i; frame_table[i] = page; printf("Mapped page %d to frame %d\n", page, i); return i; // 返回帧号 } } // 没有找到未分配的帧,产生缺页中断 printf("Page fault for page %d\n", page); return -1; // 返回-1表示产生了缺页中断 } // 将逻辑地址转换为物理地址 int translate_address(int logical_address) { int page_offset = logical_address % PAGE_SIZE; // 页内偏移量 int page_num = logical_address / PAGE_SIZE; // 页号 int frame_num = page_table[page_num]; // 帧号 if (frame_num == -1) { // 页表未找到该页,产生缺页中断并将该页映射到一个帧 frame_num = map_page(page_num); if (frame_num == -1) { // 未找到空闲帧且无法置换页面,返回-1表示产生了致命错误 return -1; } } int physical_address = frame_num * FRAME_SIZE + page_offset; // 计算物理地址 return physical_address; } int main() { init_tables(); // 产生一些逻辑地址并进行地址转换 int logical_addresses[] = {5000, 8000, 20000, 10000, 15000, 3000}; int address_num = sizeof(logical_addresses) / sizeof(int); for (int i = 0; i < address_num; i++) { int logical_address = logical_addresses[i]; int physical_address = translate_address(logical_address); if (physical_address == -1) { printf("Fatal error: unable to translate address %d\n", logical_address); return -1; } printf("Translated logical address %d to physical address %d\n", logical_address, physical_address); } return 0; } ``` 该程序使用两个表格来模拟页表和帧表,其页表的每个条目表示一个页是否在内存,帧表的每个条目表示一个帧是否已被分配。程序首先调用 `init_tables()` 函数来初始化这两个表格。然后,程序产生一些逻辑地址,并调用 `translate_address()` 函数来将其转换为物理地址。该函数首先将逻辑地址的页号和页内偏移量计算出来,然后查找页表对应的页是否在内存。如果在内存,则直接计算出物理地址并返回;否则,该函数调用 `map_page()` 函数将该页映射到一个未分配的帧,并产生缺页中断。如果未找到空闲帧且无法置换页面,则 `map_page()` 函数返回-1,表示产生了致命错误。最后,程序输出了每个逻辑地址的物理地址。 需要注意的是,这个程序只是一个简单的模拟,实际的硬件地址转换缺页中断处理可能比这个程序复杂得多。此外,这个程序并没有实现任何页面置换算法,当内存的帧全部被占用时,它会产生致命错误。在实际的操作系统,需要使用一些页面置换算法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值