湖北汽院王晓东操作系统实验指导.docx
《湖北汽院王晓东操作系统实验指导.docx》由会员分享,可在线阅读,更多相关《湖北汽院王晓东操作系统实验指导.docx(46页珍藏版)》请在冰豆网上搜索。
湖北汽院王晓东操作系统实验指导
实验一系统功能调用
【实验目的】
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调用类型号(相当于INTn调用的中断类型号n),是10H号中断调用,是一个显示I/O调用。
BIOS借助此中断产生的功能调用控制PC机屏幕上的文本和图形。
通过给AH寄存器设置适当的值选择想要的功能调用,然后发中断10H。
第一个&r是指向联合类型REGS的指针,用于接收调用的功能号及其它一些指定的入口参数,以便传给相应寄存器。
第二个&r是指向联合类型REGS的指针,用于接收功能调用后的返回值,即出口参数。
在dos.h中REGS定义如下:
structWORDREGS
{
unsignedintax,bx,cx,dx,si,di,cflag,flags;
};
structBYTEGEGS
{
unsignedintal,ah,bl,bh,cl,ch,dl,dh;
}
unionREGS
{
structWORDREGSx;
structBYTEGEGSh;
}
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背景色。
可用的是:
654颜色
000黑
001蓝
010绿
011青
100红
101绛
110褐
111浅灰
3前景字符的亮度,置“1”高亮度,置“0”正常亮度。
2-0前景色。
可使用的彩色与背景色相同。
出口参数:
屏幕上窗口适当地上滚。
09H号功能调用:
入口参数:
AH=09H
BH在文本方式中,此寄存器指明正在写的显示页。
在40列方式中,可以用0到7页,在80列方式中,可用0到3页。
在图形方式中总是0。
AL放要写字符的ASCII码。
BL在文本方式中,为写字符的属性。
CX将字符和属性写到屏幕上的次数。
出口参数:
一个字符或多个字符显示在屏幕上。
清屏子程序:
voidcls(void)
{unionREGSr;
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;/*7表示黑色*/
int86(0x10,&r,&r);/*系统功能调用*/
}
定位子程序:
voidlocate(intx,inty)
{unionREGSr;
r.h.ah=2;/*子功能号*/
r.h.dh=x;/*定位点坐标*/
r.h.dl=y;
r.h.bh=0;
int86(0x10,&r,&r);
}
在指定位置写参数:
voidwritech(intx,inty,charch,intattr)
{unionREGSr;
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
内容一参考程序:
#include
#include
#include
#defineSCR0x10
voidcls(void)
{
unionREGSr;
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);
}
voidlocate(intx,inty)
{
unionREGSr;
r.h.ah=2;
r.h.dh=x;
r.h.dl=y;
r.h.bh=0;
int86(SCR,&r,&r);
}
voidwritech(intx,inty,charch,intattrib)
{
unionREGSr;
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);
}
intmain()
{
inti,x=10,y=10;
cls();
for(i=0;i<26;i++)
writech(x,y+i,65+i,7);
getch();
return(0);
}
实验二熟悉Ubuntu环境
【实验目的】
1.了解Ubuntu系统基本操作方法,学会独立使用该系统。
2.熟悉Ubuntu下如何编辑、编译和运行一个C语言程序。
3.学会利用gcc、gdb编译、调试C程序。
【预习内容】
1.预习Ubuntu下各种应用程序的使用。
2.预习常用的SHELL命令。
3.预习vim编辑器和emacs编辑器使用方法。
4.预习Ubuntu下C程序编辑、编译和运行过程。
【实验内容】
一、登陆Linux
Linux
开机,选择进入,再选择Ubuntu登陆窗口,输入用户名:
students,输入密码:
111111,进入Ubuntu图形桌面环境。
二、熟悉Ubuntu图形桌面环境
桌面包含上方的菜单栏和下方的任务栏。
菜单栏包含“应用程序菜单”、“位置”、“系统”。
通过主菜单可访问应用程序。
(1)“应用程序”菜单
“应用程序”菜单包含“办公”、“附件”、“互联网”、“图形”、“游戏”等。
“办公”包含了文字处理及电子表格等应用程序。
“附件”下包含了“搜索工具”、“计算器”、“文本编辑器”和“终端”等应用程序。
(2)“位置”菜单
“位置”菜单包含“主文件夹”、“桌面”等信息。
(3)“系统”菜单
“系统”菜单包含“首选项”和“系统管理”等信息。
(4)启动终端模拟器
GNOME终端模拟器用一个窗口来模拟字符终端的行为。
终端常常被称为命令行或者shell,Linux中绝大部分工作都可以用命令行完成。
要启动一个终端,可以选择应用程序→附件→终端。
三、目录和文件系统
Linux和Unix文件系统被组织成一个有层次的树形结构。
文件系统的最上层是/,或称为根目录。
在Unix和Linux的设计理念中,一切皆为文件——包括硬盘、分区和可插拔介质。
这就意味着所有其它文件和目录(包括其它硬盘和分区)都位于根目录中。
例如:
/home/student/sy1.c给出了正确的完整路径,它指向sy1.c文件,而该文件位于student目录下,该目录又位于home目录,最後,home目录又位于根(/)目录下。
在根(/)目录下,有一组重要的系统目录,在大部分Linux发行版里都通用。
直接位于根(/)目录下的常见目录列表如下:
∙/bin-重要的二进制(binary)应用程序
∙/boot-启动(boot)配置文件
∙/dev-设备(device)文件
∙/etc-配置文件、启动脚本等(etc)
∙/home-本地用户主(home)目录
∙/lib-系统库(libraries)文件
∙/lost+found-在根(/)目录下提供一个遗失+查找(lost+found)系统
∙/media-挂载可移动介质(media),诸如CD、数码相机等
∙/mnt-挂载(mounted)文件系统
∙/opt-提供一个供可选的(optional)应用程序安装目录
∙/proc-特殊的动态目录,用以维护系统信息和状态,包括当前运行中进程(processes)信息。
∙/root-root(root)用户主文件夹,读作“slash-root”
∙/sbin-重要的系统二进制(systembinaries)文件
∙/sys-系统(system)文件
∙/tmp-临时(temporary)文件
∙/usr-包含绝大部分所有用户(users)都能访问的应用程序和文件
∙/var-经常变化的(variable)文件,诸如日志或数据库等
四、打开PROC目录了解系统配置
把/proc作为当前目录,就可使用ls命令列出它的内容。
/proc文件系统是一种内核和内核模块用来向进程(process)发送信息的机制。
这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中改变设置(通过改变内核参数)。
与其他文件系统不同,/proc存在于内存之中而不是硬盘上。
1.察看/proc的文件
/proc的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。
大部分/proc中的文件和目录提供系统物理环境最新的信息。
尽管/proc中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像'more','less'或'cat'这样的程序来查看。
2.得到有用的系统/内核信息
/proc文件系统可以被用于收集有用的关于系统和运行中的内核的信息。
下面是一些重要的文件:
∙/proc/cpuinfo-CPU的信息(型号,家族,缓存大小等)
∙/proc/meminfo-物理内存、交换空间等的信息
∙/proc/mounts-已加载的文件系统的列表
∙/proc/devices-可用设备的列表
∙/proc/filesystems-被支持的文件系统
∙/proc/modules-已加载的模块
∙/proc/version-内核版本
∙/proc/cmdline-系统启动时输入的内核命令行参数
proc中的文件远不止上面列出的这么多。
想要进一步了解的读者可以对/proc的每一个文件都'more'一下。
3.有关运行中的进程的信息
/proc文件系统可以用于获取运行中的进程的信息。
在/proc中有一些编号的子目录。
每个编号的目录对应一个进程id(PID)。
这样,每一个运行中的进程/proc中都有一个用它的PID命名的目录。
这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。
/proc文件系统提供了一个基于文件的Linux内部接口。
它可以用于确定系统的各种不同设备和进程的状态。
对他们进行配置。
因而,理解和应用有关这个文件系统的知识是理解你的Linux系统的关键。
五、文件权限
Linux系统上的所有文件都有权限,以允许或者阻止其它用户查阅、修改或者执行。
超级用户“root”则可以访问系统上的任意文件。
每个文件都有访问限制、用户限制以及隶属于某个用户/组(owner/group)。
所有文件皆有如下三组权限加以保护,按重要性依次排列:
用户(user):
适用于该文件的所有者
组(group):
适用于该文件所属的组
其他(other):
适用于所有其他用户
上述三组权限信息的每一组都包含了实际权限。
这些权限信息,连同它们对文件和目录具有的不同含义,概述如下:
读(read):
允许显示/打开该文件可以显示目录内容
写(write):
可以编辑或删除该文件可以更改目录内容
可执行(execute):
可执行文件可以作为程序运行可以进入该目录
要查看和编辑文件或目录的权限,请打开位置→主文件夹并在文件或者目录上单击右键。
然後选择属性。
授权信息就在权限标签页中,如果您是该文件的所有者,您可以编辑所有的授权等级。
例如:
ls–l
普通文件:
-rw-¦r--¦r--1binbin2208May281987/etc/rc
¦¦
目录文件:
drwx¦r-x¦r-x2binbin240Nov131987dos
¦¦
特殊文件:
brw-¦r-x¦r-x3binbin2,7Jan1215:
07/dev/fd0
c-w-¦-w-¦-w-2binbin6,0,Jan1113:
37/dev/Lp
存取权
所同其
有组他
者用用
户
用chmod改变文件或目录的存取权限:
格式:
chmod谁操作符许可权{文件名(或目录名)}
a+r
gw
-x
os
u=t
u
g
o
其中,a:
代表all,即所有的用户;
g:
代表group,即小组用户;
o:
代表others,即一般用户;
u:
代表 user,即文件的所有者;
+:
代表增加许可权;
-:
代表删除许可权;
=:
代表赋予指定的许可权。
例如:
$chmodu+wdisplay完成对u用户增加对文件display的写权限。
注:
上述命令是由文件所有者或超级用户进行修改。
六、练习常用的Shell命令。
(重点)
当用户登录到字符界面系统或使用终端模拟窗口时,就是在和称为shell的命令解释程序进行通信。
当用户在键盘上输入一条命令时,shell程序将对命令进行解释并完成相应的动作。
这种动作可能是执行用户的应用程序,或者是调用一个编辑器、GNU/Linux实用程序或其他标准程序,或者是一条错误信息,告诉用户输入了错误的命令。
1.目录操作
mkdirabc创建一个目录abc
cdabc将工作目录改变到abc
cd改变当前目录到主目录
ls列出当前目录的内容
ls-l输出当前目录内容的长列表,每个目录或文件占一行
pwd显示当前目录的全路径
2.文件显示实用程序
catmx.c显示mx.c文件内容
moremx.c分屏显示mx.c内容
tailmx.c显示文件后几行
catfile1file2连接file1和file2
headfilename显示文件filename的开始10行
wcfilename统计文件filename中的行数、单词数和字符数
od文件查看非文本文件
3.文件管理实用程序
cpfile1file2将文件1复制到文件2
mvfile1file2将文件重命名为file2
rmfilename删除文件filename
rm-ifilename请求用户确认删除
4.数据操作实用程序
tty显示当前终端的路径和文件名
who显示当前登录用户的列表
sortfilename显示文件filename中的行的排序结果
spellfilename检查文件filename中的拼写错误
5.其他实用程序
date输出系统日期和时间
cal显示本月的日历。
cal2002显示2002年的日历
clear清除终端屏幕
history显示你以前执行过的命令的列表
man显示实用程序的有用信息,并提供该实用程序的基本用法
echo读取参数并把它写到输出
七、熟悉vim编辑器
在编写文本或计算机程序时,需要创建文件、插入新行、重新排列行、修改内容等,计算机文本编辑器就是用来完成这些工作的。
Vim编辑器的两种操作模式是命令模式和输入模式(如图2所示)。
当vim处于命令模式时,可以输入vim命令。
例如,可以删除文本并从vim中退出。
在输入模式下,vim将把用户所输入的任何内容都当作文本信息,并将它们显示在屏幕上。
vi的工作模式见图2所示。
⑴命令模式
在输入模式下,按ESC可切换到命令模式。
命令模式下,可选用下列指令离开vi:
命令
作用
:
q!
离开vi,并放弃刚在缓冲区内编辑的内容
:
wq
将缓冲区内的资料写入当前文件中,并离开vi
:
ZZ
同wq
:
x
同wq
:
w
将缓冲区内的资料写入当前文件中,但并不离开vi
:
q
离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:
w配合使用
命令模式下光标的移动:
命令
作用
h或左箭头
左移一个字符
J
下移一个字符
k
上移一个字符
l
右移一个字符
0
移至该行的首
$
移至该行的末
^
移至该行的第一个字符处
H
移至窗口的第一列
M
移至窗口中间那一列
L
移至窗口的最后一列
G
移至该文件的最后一列
W,W
下一个单词(W忽略标点)
b,B
上一个单词(B忽略标点)
+
移至下一列的第一个字符处
-
移至上一列的第一个字符处
(
移至该句首
)
移至该句末
{
移至该段首
}
移至该段末
nG
移至该文件的第n列
⑵输入模式
输入以下命令即可进入vi输入模式:
命令
作用
a(append)
在光标之后加入资料
A
在该行之末加入资料
i(insert)
在光标之前加入资料
I
在该行之首加入资料
o(open)
新增一行于该行之下,供输入资料用
O
新增一行于该行之上,供输入资料用
Dd
删除当前光标所在行
X
删除当前光标字符
X
删除当前光标之前字符
U
撤消
·
重做
F
查找
s
替换,例如:
将文件中的所有"FOX"换成"duck",用":
%s/FOX/duck/g"
ESC
离开输入模式
启动vim命令:
命令
作用
vimfilename
从第一行开始编辑filename文件
vim+filename
从最后一行开始编辑filename文件
vim-rfilename
在系统崩溃之后恢复filename文件
vim-Rfilename
以只读方式编辑filename文件
更多用法见infovi。
vim下程序录入过程:
①$vimaaa.c↙进入vim命令模式
②i↙进入输入模式输入C源程序(或文本)
③ESC↙回到命令模式
④ZZ↙保存文件并推出vim
⑤CATaaa.c↙显示aaa.c文件内容
八、熟悉gcc编译器
GNU/Linux中通常使用的C编译器是GNUgcc。
编译器把源程序编译生成目标代码的任务分为以下4步:
a.预处理,把预处理命令扫描处理完毕;
b.编译,把预处理后的结果编译成汇编或者目标模块;
c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
d.连接,把多个目标代码模块连接生成一个大的目标模块;
1.使用语法:
gcc[option|filename]...
其中option为gcc使用时的选项,而filename为gcc要处理的文件。
2.GCC选项
GCC的选项有很多类,这类选项控制着GCC程序的运行,以达到特定的编译目的。
⑴全局选项(OVERALLOPTIONS)
全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如你的目的是为了看某个CPU上的汇编语言怎么写)。
① –x language
对于源文件是用什么语言编写的,可以通过文件名的后缀来标示,也可以用这开关。
指定输入文件是什么语言编写的,language可以是如下的内容
a. c
b.objective-c
c.c-header
d.c++
e.cpp-output
f.assembler
g.assembler-with-cpp
②–xnone
把-x开关都给关掉了。
③ –c
编译成把源文件目标代码,不做连接的动作。
④–S
把源文件编译成汇编代码,不做汇编和连接的动作。
⑤–E
只把源文件进行预处理之后的结果输出来。
不做编译,汇编,连接的动作。
⑥–ofile(常用)
指明输出文件名是file。
⑦–v
把整个编译过程的输出信息都给打印出来。
⑧–pipe
由于gcc的工作分为好几步才完成,所以需要在过程中生成临时文件,使用-pipe就是用管道替换临时文件。
⑵语言相关选项(LanguageOptions)
用来处理和语言相关的选项。
①–ansi
这个开关让GCC编译器把所有的GNU的编译器特性都给关掉,让你的程序可以和ansi标准兼容。
②–includefile
在编译之前,把file包含进去,相当于在所有编译的源文件最前面加入了一个#include语句,
③–C
同-E参数配合使用。
让预处理后的结果,把注释保留,让人能够比较好读它。
⑶连