C模拟页式地址重定位

  1. 库导入和宏定义
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define u32 				int
#define u8  				char
#define f32					float
  1. 创建进程结构体存放进程的大小以及进程的页数和页表数
/*
	创建进程结构体存放进程的大小以及进程的页数和页表数
	program_size 进程的大小(MB)
	program_paper_numbers 进程的占用的页数
	program_paper_table_numbers 进程所需要的页表数量
*/
struct program_ {
	f32 program_size;
	u32  program_paper_numbers;
	u32  program_paper_table_numbers;
	u32* physics_block;
};
  1. 主函数
int main(int argc, char** argv)
{
	//if (argc != 4)
	//{
	//	printf("parameter error");
	//	return 1;
	//}

	//struct program_ program_t;
	页的大小(KB)
	//u32 paper_size = atoi(argv[1]);
	页表可以存放页的数量 
	//u32 paper_table_size = atoi(argv[2]);
	进程大小(MB) 
	//program_t.program_size = atoi(argv[3]);

	struct program_ program_t;
	u32 paper_size;
	u32 paper_table_size;
	program_t.program_size;
	
	printf("页的大小 : ");
	scanf("%d" , &paper_size);
	printf("\n页表可以存放的页数 : ");
	scanf("%d" , &paper_table_size);
	printf("\n程序的大小(MB) : ");
	scanf("%f" , &program_t.program_size);
	
	//计算为进程有多少页
	program_t.program_paper_numbers = (int)(program_t.program_size * 1024 / paper_size);
	//如果有
	if ((int)(program_t.program_size) / 1024 % paper_size != 0)
		program_t.program_paper_numbers++;
	//计算需要几个页表
	program_t.program_paper_table_numbers = program_t.program_paper_numbers / paper_table_size;
	if (program_t.program_paper_numbers % paper_table_size != 0)
		program_t.program_paper_table_numbers++;
	//生成每个页所对应的物理块
	program_t.physics_block = (u32*)malloc(sizeof(u32) * program_t.program_paper_numbers);
	srand((unsigned)time(NULL));
	for (int i = 0; i < program_t.program_paper_numbers; ++i)
		*(program_t.physics_block + i) = rand() % (program_t.program_paper_numbers - 1);


	u32 get_user_input = -1;
	u32 logical_addr = 0;
	while (1)
	{
		//打印程序的大小(KB)
		printf("1.print program size\n");
		//打印程序所占的页数
		printf("2.print program paper numbers\n");
		//打印程序所占的页表数
		printf("3.print program papaer table numbers\n");
		//打印指令的逻辑地址所对应的物理地址
		printf("4.print logic addr to physics addr\n");
		//退出
		printf("0.exit\n");
		//Sleep(1000);
		scanf("%d", &get_user_input);
		switch (get_user_input)
		{
		case 1:
			printf("program size : %d\n", (int)(program_t.program_size * 1024));
			break;
		case 2:
			printf("program paper number : %d\n", program_t.program_paper_numbers);
			break;
		case 3:
			printf("program paper table number : %d\n", program_t.program_paper_table_numbers);
			break;
		case 4:
			printf("input:");
			scanf_s("%d", &logical_addr);
			if (logical_addr / paper_size > program_t.program_paper_numbers)
			{
				printf("Crossing the line!\n");
				break;
			}
			if (logical_addr % paper_size * 1024 > paper_size * 1024)
			{
				printf("Crossing the line!\n");
				break;
			}
			printf("logic addr to paper number : %d \nlogic addr to physics block : %d\nlogicac addr to physics addr : %d\n", \
				logical_addr / (paper_size * 1024), *(program_t.physics_block + (logical_addr / (paper_size * 1024))), \
				* (program_t.physics_block + (logical_addr / (paper_size * 1024))) * paper_size * 1024 + logical_addr % (paper_size * 1024));
			break;
		case 0:
			return 0;
			break;
		default:
			break;
		}
	}

	return 0;
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值