没有合适的资源?快使用搜索试试~ 我知道了~
16337233王凯祺实验六1
需积分: 0 0 下载量 19 浏览量
2022-08-03
17:12:53
上传
评论
收藏 511KB PDF 举报
温馨提示
试读
12页
实验六 多进程操作系统 实验报告数据科学与计算机学院 计算机科学与技术 2016 级王凯祺 163372332018 年 4 月 13 日实验目的• 在内核实现
资源详情
资源评论
资源推荐
实验六 多进程操作系统 实验报告
数据科学与计算机学院 计算机科学与技术 2016 级
王凯祺 16337233
2018 年 4 月 13 日
1 实验目的
• 在内核实现多进程的二状态模,理解简单进程的构造方法和时间片轮转调度过程。
• 实现解释多进程的控制台命令,建立相应进程并能启动执行。
• 至少一个进程可用于测试前一版本的系统调用,搭建完整的操作系统框架,为后续实验项目打
下扎实基础。
2 实验要求
保留原型原有特征的基础上,设计满足下列要求的新原型操作系统:
• 在 C 程序中定义进程表,进程数量至少 4 个。
• 内核一次性加载多个用户程序运行时,采用时间片轮转调度进程运行,用户程序的输出各占 1/4
屏幕区域,信息输出有动感,以便观察程序是否在执行。
• 在原型中保证原有的系统调用服务可用。再编写 1 个用户程序,展示系统调用服务还能工作。
3 特别声明
• 为了让屏幕输出更简洁、代码更精简,我决定删去上一实验中原有的 8h 时钟中断的所有功能;
本实验的 8h 时钟中断将实现新功能——进程切换。
• 由于本实验中内核和用户程序都作为进程,进行时间片轮转,改写 9h 中断(输出 ouch!)会影
响内核调用 16h 中断读取字符,我决定不使用上一实验中改写的 9h 中断,用回 BIOS 的 9h
中断。
4 实验步骤
4.1 设计思路
引导程序启动后加载内核,并把内核视为一个进程,并为其创建进程控制块,并将该进程控制
块记为“运行”。
1
时钟中断响应后,保存当前进程 A 的寄存器状态,并将进程 A 的进程控制块记为“就绪”;寻
找下一个进程 B ;还原进程 B 的寄存器状态,并将 B 的进程控制块记为“运行”。
4.2 设计进程控制块
首先要明确:需要保存多少个寄存器。我在 MASM 6.1 指引手册(见“参考资料”文件夹)第
54 页至 57 页找到了答案。8086 计算机有以下寄存器:
• 主寄存器:AX, CX, DX, BX, SP, BP, SI, DI
• 段寄存器:DS, ES, SS, CS
• 指令指针寄存器:IP
• 标志寄存器
我计划使用 C 的结构体来保存进程控制块。
now_process 表示当前正在运行的进程。
alive 表示进程是否还活着。若 PCBlist[i].alive = 1 且 now_process = i ,则表示 i 进程处于
“运行”状态;若 PCBlist[i].alive = 1 且 now_process = i ,则表示 i 进程处于“就绪”状态。
1 typedef struct PCB {
2 int ax;
3 int bx;
4 int cx;
5 int dx;
6 int si;
7 int di;
8 int bp;
9 int es;
10 int ds;
11 int ss;
12 int sp;
13 int ip;
14 int cs;
15 int flags;
16 int alive;
17 char pname[16];
18 };
19
20 struct PCB PCBlist[64];
21
22 int now_process;
PCBlist 的下标即代表进程号,同时也代表进程在磁盘中的扇区号。虽然这样的管理模式下无法
为一个程序创建两个进程,但是此模式编程复杂度低,并且简单易懂。
4.3 设计 Save 过程和 Restart 过程
我在 MASM 6.1 指引手册第 92 页找到了中断发生的工作原理。中断发生时,由 CPU 将标志寄
存器 Flags 、代码段寄存器 CS 、指令指针寄存器 IP 依次压入堆栈(被中断的程序的堆栈);中断
2
返回时(即执行 iret 指令时),CPU 将堆栈中的指令指针寄存器 IP 、代码段寄存器 CS 、标志寄存
器 Flags 依次弹出堆栈,并转到 CS:IP 继续原程序的执行。
照着文档,我读懂了老师提供的“现场保护:save 过程(旧版)”代码和“现场恢复:restart 过
程(旧版)”代码。老师的代码全都加了注释,我要给老师点个大大的赞!
我计划 Schedule 过程由 C 实现,故 save 过程只需将寄存器保存在外部变量(C 语言的变量),
然后 Restore 过程需要将外部变量还原到寄存器中。如此安排,Schedule 过程要做的事情是:将 C
语言的变量保存到 A 进程控制块中,然后调度另一进程 B ,将 B 进程控制块中的寄存器写入 C 语
言的变量。
以下是外部变量的声明:
1 extrn _ax_save:word
2 extrn _bx_save:word
3 extrn _cx_save:word
4 extrn _dx_save:word
5 extrn _si_save:word
6 extrn _di_save:word
7 extrn _bp_save:word
8 extrn _es_save:word
9 extrn _ds_save:word
10 extrn _ss_save:word
11 extrn _sp_save:word
12 extrn _ip_save:word
13 extrn _cs_save:word
14 extrn _flags_save:word
以下是 save 过程代码(MASM 格式):
1 push ds ; StackTop:
*
\flags\cs\ip\ds(user)
2 push cs ; StackTop:
*
\flags\cs\ip\ds(user)\cs(kernel)
3 pop ds ; StackTop:
*
\flags\cs\ip\ds(user)
4 ; ds <- kernel cs
5 mov _ax_save, ax ; Save ax
6 pop ax ; StackTop:
*
\flags\cs\ip
7 ; ax <- ds(user)
8 mov _ds_save, ax ; Save ds
9 pop ax ; StackTop:
*
\flags\cs
10 mov _ip_save, ax ; Save ip
11 pop ax ; StackTop:
*
\flags
12 mov _cs_save, ax ; Save cs
13 pop ax ; StackTop:
*
14 mov _flags_save, ax ; Save flags
15
16 mov _bx_save, bx ; Save bx
17 mov _cx_save, cx ; Save cx
18 mov _dx_save, dx ; Save dx
19 mov _si_save, si ; Save si
20 mov _di_save, di ; Save di
21 mov _bp_save, bp ; Save bp
22 mov ax, es
23 mov _es_save, ax ; Save es
3
剩余11页未读,继续阅读
萌新小白爱学习
- 粉丝: 16
- 资源: 311
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0