目 录
实验一 系统功能调用........................................................ 1 实验二 熟悉Linux环境 ...................................................... 5 实验三 shell脚本 ......................................................... 13 实验四 进程控制 .......................................................... 17 实验五 进程间通信......................................................... 21 (一) 信号量机制实验........................................................ 21 实验五 进程间通信......................................................... 27 (二) 进程的管道通信实验.................................................... 27 实验五 进程间通信......................................................... 31 (三) 消息的发送与接收实验 .................................................. 31 实验五 进程间通信 ......................................................... 36 (四) 共享存储区通信........................................................ 36 实验六 死锁避免的算法 ..................................................... 42 实验七 存储管理 .......................................................... 44 1. 常用页面置换算法..................................................... 44 2.动态分区分配算法 ..................................................... 53 实验八 文件操作 ........................................................... 54
实验一 系统功能调用
【实验目的】
1.熟悉操作系统的系统功能调用。
2.掌握用C语言实现系统功能调用的方法和步骤。
3.掌握利用10H号功能调用(BIOS的显示I/O功能调用)来实现对屏幕的操作与控制。
【预习内容】
1.预习DOS、BIOS系统功能调用。
2.预习C语言实现系统功能调用的方法。
【实验内容】
1.在屏幕的指定区域内显示字符串。(必做题) 2.在屏幕的指定区域内画框,在框内显示字符串。(提高题) 3. 在屏幕的指定区域内动画显示字符串。(附加题)
【实验报告】
1.列出调试通过程序的清单,并加注释。
2.给出必要的程序设计思路和方法(或列出流程图)。 3.总结上机调试过程中所遇到的问题和解决方法及感想。
【实验相关资料】
int86(0X10, &r, &r)函数:对BIOS调用的标准函数
其中0X10是BIOS调用类型号(相当于INT n调用的中断类型号n),是10H号中断调用,是一个显示I/O调用。BIOS借助此中断产生的功能调用控制PC机屏幕上的文本和图形。通过给AH 寄存器设置适当的值选择想要的功能调用,然后发中断10H。
第一个&r是指向联合类型REGS的指针,用于接收调用的功能号及其它一些指定的入口参数,以便传给相应寄存器。
第二个&r是指向联合类型REGS的指针,用于接收功能调用后的返回值,即出口参数。 在dos.h中REGS定义如下:
struct WORDREGS {
unsigned int ax,bx,cx,dx,si,di,cflag,flags; };
struct BYTEGEGS {
unsigned int al,ah,bl,bh,cl,ch,dl,dh; }
union REGS {
struct WORDREGS x;
struct BYTEGEGS h; }
1
10H号中断调用下所包含的部分功能调用:
AH 功能调用
00H 置显示方式 01H 置光标类型 02H 置光标位置 06H 当前显示页上滚 07H 当前显示页下滚 09H 写字符和属性
02H功能调用: 入口参数:AH=02H
DH 光标的行位置(行数),0行是顶行,24行是底行。 DL 光标的列位置(列数),0列是最左边一列。
BH 光标显示页数,40列方式,可用0到7,80列方式,可用0到3。 出口参数:无
06H号功能调用: 入口参数:AH=06H
AL 指明滚动的文本行数。如放置‘0’,则整个窗口为空白。 CH 指明窗口左上角的行位置(从0到24)。
CL 指明窗口左上角的列位置(从0到79,80列)。 DH 指明窗口右下角的行位置(从0到24)。
DL 指明窗口右下角的列位置(从0到79,80列)。 BH 指明加到窗口底部的空行显示属性。 对于彩色/图形适配器,属性字节如下所示:
位 说 明
7 置“1”用于字符闪烁,置“0”字符不闪烁。 6-4 背景色。可用的是:
6 5 4 颜色 0 0 0 黑 0 0 1 蓝 0 1 0 绿 0 1 1 青 1 0 0 红 1 0 1 绛 1 1 0 褐 1 1 1 浅灰
3 前景字符的亮度,置“1”高亮度,置“0”正常亮度。 2-0 前景色。可使用的彩色与背景色相同。 出口参数:屏幕上窗口适当地上滚。
09H号功能调用: 入口参数:AH=09H
BH 在文本方式中,此寄存器指明正在写的显示页。在40列方式中,可以用0到7页,
在80列方式中,可用0到3页。在图形方式中总是0。
AL 放要写字符的ASCII码。
BL 在文本方式中,为写字符的属性。
2
CX 将字符和属性写到屏幕上的次数。 出口参数:一个字符或多个字符显示在屏幕上。 清屏子程序: void cls(void) { union REGS r;
r.h.ah=6; r.h.al=0; r.h.ch=0; r.h.cl=0;
r.h.dh=24; r.h.dl=79;
r.h.bh=7; int86(0x10,&r,&r); }
/*子功能号*/
/*左上角坐标*/ /*右下角坐标*/ /*7表示黑色*/ /*系统功能调用*/
定位子程序:
void locate(int x, int y) { union REGS r;
r.h.ah=2; /*子功能号*/ r.h.dh=x; /*定位点坐标*/ r.h.dl=y; r.h.bh=0;
int86(0x10,&r,&r); }
在指定位置写参数:
void writech(int x , int y, char ch ,int attr) { union REGS r; locate(x ,y); r.h.ah=9; r.h.bh=0; r.h.al=ch; r.h.bl=attr r.x.cx=1;
int86(0x10,&r,&r); }
屏幕画框可以用制表符来画。其主要方法是不断调用writech函数,在指定区域周围显示制表符,从而勾勒出一个窗口的轮廓。
制表符 ASCII码 ┏ 218 ┓ 191 ┗ 192 ┛ 217 ┃ 179 ━ 196
3
内容一参考程序: #include
{ union REGS r; r.h.ah=6; r.h.al=0; r.h.cl=0; r.h.ch=0; r.h.dh=24; r.h.dl=79; r.h.bh=7; int86(SCR,&r,&r); }
void locate(int x,int y) { union REGS r; r.h.ah=2; r.h.dh=x; r.h.dl=y; r.h.bh=0; int86(SCR,&r,&r); }
void writech(int x,int y,char ch,int attrib) { union REGS r; locate(x,y); r.h.ah=9; r.h.bh=0; r.h.al=ch; r.h.bl=attrib; r.x.cx=1; int86(SCR,&r,&r); }
int main() { int i,x=10,y=10; cls(); for(i=0;i<26;i++) writech(x,y+i,65+i,7); getch(); return(0);}
4