extern void getcommand();
extern void reset();
extern void cls();
extern void clear();
extern void clearinput();
extern void load_and_run(char op, char num, short pos);
extern void load(char pro, char num, short pos);// pos是加载位置的段基址,如cs=0x2000就输入0x2000
extern void printhint();
extern void printosstanding();
extern void printosdoing();
extern void printosbc();
extern void printosouch();
extern void set_new_int8();
extern void reset_int8();
// 指令输入相关
extern char command[30];
extern char inputbuf;
extern char inputnum;
extern char lastinputnum;
// 多道程序处理相关
extern char parallel_switch;
extern char programe_num;
extern char alive_programe_num;
extern char cur_programe;
extern char a_programe_end;
extern short next_cs;
extern short next_ip;
// 把并行运行的程序运行一个时间片,获取寄存器信息,并写入对应PCB
extern void parallel_run();
// 从PCB中记录的寄存器内容中恢复原程序运行
extern void parallel_restart();
//strcmp:两个字符串的前num位是否相等,相等时返回0,否则返回1
int strcmp(char* const s1, char* const s2, int num);
//get_op: 从command的内容中得到对应的操作代码
char get_op();
//get_programe_list:在多道程序指令“#...”中识别指令,代码错误返回-1,识别成功返回0
int get_programe_list();
//fix_command: 保证有效指令除有效位外都是空字符
void fix_command();
// parallel_programe_operation:多道程序指令处理函数,从main中独立出来,保持main的美观
void parallel_programe_operation();
//load_programe_and_build_pcb:依次装载程序到内存,并且创建PCB
void load_programe_and_build_pcb();
#define COMMAND_LEN 30
#define MAX_PROCESS_NUM 5
#define MAX_LINER_PRO 8
#define MAX_PARALLEL_PRO 8
#define TEST_PRO_NAME_LEN 6
typedef struct {
short ax;//+0
short bx;//+2
short cx;//+4
short dx;//+6
short cs;//+8
short ds;//+10
short es;//+12
short ss;//+14
short sp;//+16
short bp;//+18
short di;//+20
short si;//+22
short ip;//+24
short flag;//+26
}CpuRegs;
typedef struct {
CpuRegs regs;// CPU寄存器(上下文数据)包括了CS(内存指针,在COM程序内3个段都在CS处),IP(下一条指令地址)
short pid;// 进程标识符,+28
short pstate;// 状态:0--结束, 1--就绪,+30
// 优先级
// I/O装填信息
// 记账信息
}PCB;// PCB size = 16words, 32byte
char run_a[COMMAND_LEN] ={'.', '/', 'a','.','c','o','m'};
char run_b[COMMAND_LEN] ={'.', '/', 'b','.','c','o','m'};
char run_c[COMMAND_LEN] ={'.', '/', 'c','.','c','o','m'};
char run_d[COMMAND_LEN] ={'.', '/', 'd','.','c','o','m'};
char run_test[COMMAND_LEN] ={'.', '/', 't','e','s','t','.','c','o','m'};
char _a[TEST_PRO_NAME_LEN] ={'a','.','c','o','m'};
char _b[TEST_PRO_NAME_LEN] ={'b','.','c','o','m'};
char _c[TEST_PRO_NAME_LEN] ={'c','.','c','o','m'};
char _d[TEST_PRO_NAME_LEN] ={'d','.','c','o','m'};
char help[COMMAND_LEN] ={'h', 'e', 'l', 'p'};
char ls[COMMAND_LEN] ={'l', 's'};
char do_clear[COMMAND_LEN] ={'c', 'l', 'e', 'a', 'r'};
char power_off[COMMAND_LEN] ={'q', 'u', 'i', 't'};
CpuRegs _regs;
PCB _pcb_list[MAX_PROCESS_NUM];
char run_list[MAX_LINER_PRO][MAX_PARALLEL_PRO+1]={0};
short _pcb_offset;
void main() {
char op;
char num;
while(1){
reset();
printhint();//打印输入提示
if(op == 10)
printosbc();//维持bad command的显示
else
printosstanding();
getcommand();//获取指令
fix_command();//保证指令其余部分是‘\0’
if((*command) == '#') {//多道程序指令
int check=get_programe_list();
if(check == -1) {
op=10;
printosbc();//打印指令错误提示
}
else {
parallel_programe_operation();//进行多道程序指令处理
}
clearinput();//执行完程序之后再清空指令显示
}
else {
op = get_op();//获得指令对应操作码
set_new_int8();//重定向int 8h中断
printosdoing();//打印系统正在运行程序状态
if(op <= 6) {
num=1;
load_and_run(op, num, (short)0x2000);
}
else if(op == 7) {
num=18;
load_and_run(op, num, (short)0x2000);
}
else if(op == 11)
clear();
else if(op == 12) {
reset_int8();//还原int 8h中断
break;
}
else
printosbc();//打印指令错误提示
clearinput();//执行完程序之后再清空指令显示
reset_int8();//还原int 8h中断
}
}
cls();
}
// 程序编号 ./a--1; ./b--2; ./c--3; ./d--4; help--5; ls--6; ./test--7
// clear--11; quit--12; bad--10;
char get_op() {
if(strcmp(command, run_a, 2) == 0) {
if(strcmp(command, run_a, COMMAND_LEN) == 0)
return 1;
else if(strcmp(command, run_b, COMMAND_LEN) == 0)
return 2;
else if(strcmp(command, run_c, COMMAND_LEN) == 0)
return 3;
else if(strcmp(command, run_d, COMMAND_LEN) == 0)
return 4;
else if(strcmp(command, run_test, COMMAND_LEN) == 0)
return 7;
else
return 10;
}
else if(strcmp(command, help, COMMAND_LEN) == 0)
return 5;
else if(strcmp(command, ls, COMMAND_LEN) == 0)
return 6;
else if(strcmp(command, do_clear, COMMAND_LEN) == 0)
return 11;
else if(strcmp(command, power_off, COMMAND_LEN) == 0)
return 12;
else
return 10;
}
int get_programe_list() {
// 清空run_list
for(int i=0;i<MAX_LINER_PRO;i++)
for(int j=0;j<MAX_PARALLEL_PRO+1;j++)
run_list[i][j]=0;
int list_row=0,list_col=1;// 当前写的行和列
int second_index=1, first_index=1;// 进入这个程序之前需要判断是否为“#”指令,first是更大的下标
while(first_index < COMMAND_LEN) {
// 如果first_index处不是一个程序名的结束,本次while循环操作为空
if((command[first_index] != '+') && (command[first_index] != '&') && (command[first_index] != '\0')) ;
// first_index处表示两个指针之间是一个程序名,左闭右开
else {
// 1:取得程序名
if(first_index-second_index>5 || first_index-second_index <= 1)
return -1;// 其中一个不是正确的指令,直接返回-1。
char temp[TEST_PRO_NAME_LEN]={0};
for(int i=second_index;i<first_index;i++)
temp[i-second_index]=command[i];// 获得两指针之间的字符串(左闭右开)
// 2:写入run_list
if(strcmp(temp, _a, TEST_PRO_NAME_LEN) == 0)
run_list[list_row][list_col] = 1;
else if(strcmp(temp, _b, TEST_PRO_NAME_LEN) == 0)
run_list[list_row][list_col] = 2;
else if(strcmp(temp, _c, TEST_PRO_NAME_LEN) == 0)
run_list[list_row][list_col] = 3;
else if(strcmp(temp, _d, TEST_PRO_NAME_LEN) == 0)
run_list[list_row][list_col] = 4;
else
return -1;
// 3:移动指针
second_index=first_index+1;
if(command[first_index] == '+') {// 串行运行下一个程序
run_list[list_row][0] = list_col;
list_col=1;
list_row++;
first_index++;
}
else if(command[first_index] == '&') {// 并行运行下一个程序
list_col++;
first_index++;
}
else if(command[first_index] == '\0') {// 指令完,分析结束
run_list[list_row][0] = list_col;
return 0;
}
}
first_index++;
}
if(first_index == COMMAND_LEN) {
if(first_index-second_index>5 || first_index-second_index <= 1)
return -1;// 其中一个不是正确的指令,直接返回-1。
char temp[T
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
《项目介绍》 操作系统原理作业-支持多进程并发的操作系统源码+项目说明.zip 文件结构: src文件夹中包含4个文件夹、1个.asm文件。 1. img文件夹中包含了本次实验的1个映像文件XOS5.0,XOS5.0是本次实验的最终完成品。 2. kernel文件夹中包含了本次实验的2个源代码文件,其中操作系统内核源代码文件kernel.asm和ckernel.c。 3. user program文件夹中包含了6个用户程序源代码。 4. obj file文件夹中包含了2个.o文件,.o文件是内核编译出来的二进制文件。 5. 另外还有引导扇区程序源代码boot.asm 实验环境: 编译操作系统:Ubuntu 18.04 LTS , C 语言编译器:gcc 7.4.0-1 ubuntu2.3;汇编语言编译器:nasm 2.13.02-0.1, 链接器:ld , 虚拟机软件:VMware Workstation 15 。 【注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
资源推荐
资源详情
资源评论
收起资源包目录
操作系统原理作业-支持多进程并发的操作系统源码+项目说明.zip (13个子文件)
项目说明.md 820B
src
user program
ls.asm 4KB
a.asm 3KB
d.asm 3KB
b.asm 3KB
c.asm 3KB
help.asm 4KB
obj file
kernel.o 5KB
ckernel.o 7KB
img
XOS5.0.img 1.41MB
boot.asm 835B
kernel
ckernel.c 13KB
kernel.asm 18KB
共 13 条
- 1
资源评论
北航程序员小C
- 粉丝: 2222
- 资源: 1823
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功