- 库导入和宏定义
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define u32 int
#define u8 char
#define f32 float
- 创建进程结构体存放进程的大小以及进程的页数和页表数
struct program_ {
f32 program_size;
u32 program_paper_numbers;
u32 program_paper_table_numbers;
u32* physics_block;
};
- 主函数
int main(int argc, char** argv)
{
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)
{
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");
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;
}