课程名称计算机操作系统实验.docx
《课程名称计算机操作系统实验.docx》由会员分享,可在线阅读,更多相关《课程名称计算机操作系统实验.docx(16页珍藏版)》请在冰豆网上搜索。
课程名称计算机操作系统实验
一、课程名称:
计算机操作系统实验
(一)本课程实验总体介绍
1、本课程上机实验的任务:
通过该实验真正认识多进程、多线程、微核、死锁、文件系统、缓存等概念及实现原理;在充分理解原理和算法的基础上,发挥学生自我创造力,鼓励并创造机会让学生提出新的算法或实现。
2、本课程上机实验简介:
分为课程实验和课程设计两大部分。
课程实验通过应用层编程调用系统接口加深对进程、内存、文件和设备等功能的理解。
具体为实验1-4。
课程设计通过对Linux核心源代码的实例分析和设计掌握系统设计的原理和方法。
具体为实验5-12。
3、本课程适用专业:
计算机相关专业。
4、本课程上机实验涉及核心知识点:
核心知识点:
微核、系统调用、核心态与用户态、进程、线程、同步、互斥、并发、死锁、伙伴算法、文件及文件目录、I/O缓冲、调度算法、系统初始化、时钟中断等。
5、本课程上机实验重点与难点:
并发控制,内核代码的分析与设计。
6、本课程上机实验运用软件名称:
VC++编译环境,SourceInsight分析器、gcc编译器,
7、总学时:
课程实验:
16学时
课程设计:
共8个课程设计,每个根据难度在8-20学时。
8、教材名称及教材性质(自编、统编、临时):
名称:
《LINUX操作系统分析与设计》
性质:
自编
9、参考资料:
●计算机操作系统.汤子瀛,西安电子科技大学出版社(第3版)
●《Linux设备驱动程序》第二版AlessandroRubini&JonathanCorbet编著魏永明骆刚等译中国电力出版社2002年11月第一版。
●《Linux操作系统内核分析》陈莉君编人民邮电出版社第一版。
●《Linux操作系统内核实习》GaryNutt著机械工业出版社。
(二)包含实验项目基本信息
实验项目1
1、实验项目名称:
进程调度算法设计实践
2、实验项目的目的和任务:
目的:
通过该实验,加深对多道系统中调度算法的认识。
任务:
实现FIFO,RR(q=1),SPN,SRT,HRRN,FB(去=2i-1)六种调度算法。
并通过输入一组进程序列计算出每种算法的输出进程序列。
3、上机实验内容:
(1)实现主程序及六种调度算法。
(2)输入一组进程序列,对序列中的每一个进程,定义不同的优先级、总执行时间,用六种调度算法输出调度最终的排序结果。
序列例;
进程号
1
2
3
4
5
6
7
8
优先级
4
2
2
1
3
3
4
3
运行时间
2
3
45
4、学时数:
4
实验项目2
1、实验项目名称:
线程间同步与互斥
2、实验项目的目的和任务:
目的:
通过多线程并发程序设计,掌握同步与互斥的设计方法。
任务:
实现一个生产者、消费者的两线程同步算法。
3、上机实验内容:
(1)申请10个缓冲区。
(2)编制生产者线程:
首先产生一个随机数,写入到一个缓冲区中。
其次将该缓冲区置“满”标志。
(3)编制消费者线程:
取一个“满”标志的缓冲区中数据,打印输出,然后将该缓冲区置“空”标志。
(4)添加相应的同步互斥控制代码。
4、学时数:
4
实验项目3
1、实验项目名称:
内存分配与回收设计
2、实验项目的目的和任务:
目的:
学习内存管理的实现原理。
任务:
实现一个基于伙伴算法的内存分配回收算法,并通过输入一组内存请求与回收序列验证该算法执行情况。
3、上机实验内容:
(1)实现主程序及伙伴算法(设内存总量为1M)。
(2)用如下请求和释放序列验证该算法执行情况。
请求100k――>请求240k――>请求64k――>请求256k――>释放240k――>释放100k――>请求75k――>释放64k――>释放75k――>释放256k
试输出每次请求和释放动作产生后的内存状态。
4、学时数:
4
实验项目4
1、实验项目名称:
文件复制
2、实验项目的目的和任务:
目的:
掌握文件系统的系统调用的使用。
任务:
产生两个文件A和B,并将这两个文件内容交叉复制到文件C中,并输出文件C的结果。
3、上机实验内容:
(1)产生一个1k的文件A,其内容为数字。
(2)产生一个1k的文件B,其内容为字母。
(3)以100字节为单位,将A、B两文件的内容交替复制到文件C中。
最后输出C的结果。
4、学时数:
4
实验项目5
1、实验项目名称:
Linux时间系统分析
2、实验项目的目的和任务:
通过对LINUX系统与时间有关的系统源代码分析,学习多任务系统中调度的核心事件时钟中断的实现原理,学习LINUX的内核机制以及内核时钟维护机制。
3、上机实验内容:
●编写一个拾取当前时间的应用程序,熟悉系统调用gettimeofday()的使用。
●分析\linux\kernel\time.c中的sys_gettimeofday()过程,说明时间是从何处取得的,并给出分析流图。
●分析\linux\kernel\itimer.c中的sys_getitimer()和sys_setitimer()过程,给出分析流图。
●分析\linux\arch\i386\kernel中的时钟中断处理过程do_timer_interrupt()和\linux\kernel\中的timer_bh()过程,给出分析流图,解释时钟中断处理的全过程。
4、学时数:
10
实验项目6
1、实验项目名称:
Linux系统初始化过程分析
2、实验项目的目的和任务:
通过对LINUX启动处理代码的分析,学习操作系统初始化与其他模块实现的关系;学习各个模块的初始化顺序,深入理解操作系统的功能划分及相互关系;学习一个大型软件系统中初始化模块的设计方法。
3、上机实验内容:
●分析在\linux\init\main.c中的start_kernel()函数过程,它是整个操作系统初始化最重要的过程。
分析要求:
由于涉及初始化系统各个模块,内容很广,这里要求了解start_kernel()函数中所调用的各个子过程所属模块,无需对被调用的子模块进一步分析。
认识系统各个模块的初始化时机。
●详细分析start_kernel()函数中调用的sched_init和time_init两过程,说明它们的主要功能,给出分析流图。
●详细分析start_kernel()函数中调用的kernel_thread(init,…)、分析init函数及其中调用的do_basic_setup()函数;给出分析流图。
4、学时数:
4
实验项目7
1、实验项目名称:
Linux文件系统分析
2、实验项目的目的和任务:
通过对Linux系统源代码分析,学习Linux虚拟文件系统VFS的原理及实现框架;学习VFS和逻辑文件系统如何协同实现对磁盘的管理;理解软件层状设计的特点。
3、上机实验内容:
●分析文件\linux\include\linux\fs.h中、inode_operations、super_operations、等几个数据结构,了解它们各自的作用。
●分析文件\linux\fs\super.c中sys_mount()、sys_umount()、register_()和unregister_()的实现过程,并给出分析流图。
●分析文件\linux\fs\.c中函数(),了解文件系统初始化过程。
●分析vfs的fopen函数的实现过程,即分析文件\linux\fs\open.c中的sys_open(),理解文件的各种操作集合的挂接过程,给出分析流图。
4、学时数:
12
实验项目8
1、实验项目名称:
Linux网络通信协议分析
2、实验项目的目的和任务:
分析linux通信协议的组织结构;掌握SOCKET接口;掌握协议数据的接收和发送流程;掌握网卡的数据接收和发送机制。
3、上机实验内容:
●分析socket()系统调用过程,包括\linux\net\socket.c中的sys_socketcall()、sys_socket()、sock_create()和\linux\net\ipv4\Af_inet.c中的inet_create等函数。
●分析bind()系统调用,包括\linux\net\socket.c中的sys_bind()和\linux\net\ipv4\Af_inet.c中的inet_bind()函数。
●分析listen()系统调用,包括\linux\net\socket.c中的sys_listen()和\linux\net\ipv4\Af_inet.c中的inet_listen()函数。
●分析connect()系统调用,包括\linux\net\socket.c中的sys_connect()和\linux\net\ipv4\Af_inet.c中的inet_stream_connect()函数。
●分析accept()系统调用,包括\linux\net\socket.c中的sys_accept()和\linux\net\ipv4\Af_inet.c中的inet_accept()函数。
●分析send()系统调用,包括\linux\net\socket.c中的sys_send()、sys_sendto()、sock_sendmsg()、\linux\net\ipv4\Af_inet.c中的inet_sendmsg()、\linux\net\ipv4\Tcp_ipv4.c中的tcp_v4_sendmsg()、\linux\net\ipv4\Tcp.c中的tcp_do_sendmsg()、\linux\net\ipv4\Tcp_output.c中的tcp_send_skb()、tcp_transmit_skb()、\linux\net\ipv4\Ip_output.c中的ip_queue_xmit()、\linux\include\net\Ip.h中的ip_output()、ip_finish_output()、\linux\net\core\dev.c中的dev_queue_xmit()等函数。
●分析receive()系统调用,包括\linux\net\socket.c中的sys_recv()、sys_recvfrom()、\linux\net\ipv4\Af_inet.c中的inet_recvmsg()、\linux\net\ipv4\Tcp.c中的tcp_recvmsg()、\linux\net\ipv4\Tcp_input.c中的tcp_rcv_established()、\linux\net\ipv4\Tcp_ipv4.c中的tcp_v4_do_rcv()、tcp_v4_rcv()、\linux\net\core\dev.c中的net_bh()、linux\net\ipv4\Ip_input.c中的ip_local_deliver()、ip_rcv()等函数。
●分析网卡驱动中数据发送和接收处理过程。
4、学时数:
16
实验项目9
1、实验项目名称:
Linux系统调用分析与实现
2、实验项目的目的和任务:
理解操作系统内核与应用程序的接口关系;加深对内核空间和用户空间的理解;学会增加新的系统调用。
3、上机实验内容:
a)增加系统调用函数
直接在原有程序文件中增加,减少修改Makefile文件的麻烦。
该函数的名称应该是新的系统调用名称前面加上sys_标志。
例如新加的系统调用为mycall(intnumber),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkageintsys_mycall(intnumber)
{
printk(“callnumberis%d\n”,number);
returnnumber;
}
b)连接新的系统调用
添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该系统调用的存在。
为了从已有的内核程序中增加到新的系统调用函数的连接,需要编辑两个文件。
第一个要修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h
该文件中包含系统调用清单,用来给每个系统调用分配一个唯一的号码。
将新增的系统调用名称加到清单最后,并给它分配号码序列中下一个可用的系统调用号。
例如:
#define__NR_mycall239
系统调用号为239,之所以系统调用号是239,是因为内核自身的系统调用号码已经用到238。
第二个要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
longSYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化。
该数组包含指向内核中每个系统调用的指针。
这样就在数组中增加了新的内核函数的指针。
在清单最后添加一行:
longSYMBOL_NAME(sys_mycall)
c)重建新的Linux内核,作以下命令
makemenuconfig配置内核选项
makedep生成依赖关系
makeclean清除旧的编译结果
makebzImage-new编译内核映象
makemodules编译内核模块
makemodules_install安装内核模块
d)用新的内核启动系统
修改/etc/lilo.conf文件,添加新的引导内核:
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
添加完毕后,为了使用新的lilo.conf配置文件,还应执行下面的命令:
#cp/usr/src/linux/arch/i386/boot/zImage/boot/bzImage-new
其次配置lilo:
#/sbin/lilo
当重新引导系统时,在boot:
提示符后面有三种选择:
linux-new、linux、dos。
选择linux-new即可以新内核启动。
用新内核启动后则可使用新的系统调用。
e)使用新的系统调用
编写应用程序使用新添加的系统调用mycall。
4、学时数:
8
实验项目10
1、实验项目名称:
内核模块机制和新模块编写
2、实验项目的目的和任务:
理解Linux操作系统模块机制,学会使用模块设计系统的方法,学习编写一个新的内核模块。
3、上机实验内容:
(1)设计一个在/proc中实现clock文件的模块,该文件只支持文件的read()操作。
当调用read()操作时,返回一个单一的ASCII字符串,其中包括用一个空格分开的两个数字子串。
例如,若系统时间变量xtime设置为:
xtime.tv_sec=923264577xtime.tv_usec=234438,
则该模块必须返回如下形式的一个字符串:
923264577234438
a)写一个空内核模块,编译测试。
b)生成一proc文件,以用于读取系统时钟。
在模块中使用proc_register()和proc_unregister()注册和注销。
它们引用一个structproc_dir_entry数据结构,将该结构中get_info指针指向自己构造的读函数。
模版如下:
(2)设计一个演示模块应用程序,读取/proc/testmodule的内容并打印输出。
4、学时数:
12
实验项目11
1、实验项目名称:
Linux环境设备驱动程序设计
2、实验项目的目的和任务:
学习linux系统设备驱动程序的组织结构及管理方法,掌握设备驱动程序的设计方法,并编写一个字符空设备驱动实例。
通过实验进一步理解操作系统对设备管理的共性以及设备驱动程序的个性,理解各种设备驱动工作方式。
3、上机实验内容:
(1)模块初始化时完成对设备的注册。
为使模块加载命令insmod来把设备驱动程序插入到内核之中。
在insmod调用的init_module()函数中调用register_chrdev()注册一个字符设备(其他块设备与网络设备类似)。
如果成功,设备名就会出现在/proc/devices文件中。
(2)在文件系统为其创建一个代表节点。
mknod/dev/
如:
mknod/dev/test.cmajorminor
(3)完成设备打开、关闭、读和写几个基本过程。
例如:
structTest_Fops={
NULL,/*寻找*/
Read:
device_read,/*读设备*/
Write:
device_write,/*写设备*/
NULL,/*读目录*/
NULL,/*选择*/
NULL,/*ioctl*/
NULL,/*mmap*/
Open:
device_open,/*打开*/
NULL,/*刷新*/
release:
device_release,/*关闭*/
};
intinit_module()
{……
Major=module_register_chrdev(0,DEVICE_NAME,&Test_fops);
……
}
staticintdevice_open(structinode*inode,structfile*file)
{……}
staticintdevice_release(structinode*inode,structfile*file)
{……}
staticssize_tdevice_read(structfile*file,char*buffer,size_tlength,loff_t*offset)
{……}
staticssize_tdevice_write(structfile*char*buffer,size_tlength,off_t*offset)
{……}
(4)在模块卸载时卸载驱动程序模块。
通过执行模块卸载命令rmmod中的cleanup_module()函数,调用module_unregister_chrdev()注销设备,对驱动程序模块进行卸载。
(5)写一个测试该设备的应用程序完成测试。
4、学时数:
12
实验项目12
1、实验项目名称:
LIUNX文件系统设计
2、实验项目的目的和任务:
通过设计一个独立的逻辑文件系统,掌握linux文件系统设计的注册、注销、挂接操作的实现细节。
掌握VFS和LFS的挂接实现技术。
深入理解Linux文件操作集设计模式。
3、上机实验内容:
(1)模块初始化时完成对文件系统的注册。
a)申明一个新的文件系统:
staticDECLARE_FSTYPE(tfs_type,"tfs",tfs_read_super,0);tfs_read_super是tfs文件系统的读超级块过程。
b)在模块初始化函数init_module()中调用文件系统注册函数register_(&tfs_type);
(2)实现新文件系统的super_block、inode、file操作集合,操作集合的具体内容可以是空操作。
(3)用mount/umount完成对新文件系统的挂接测试。
例如:
mount–ttfs/tmp1/tmp2
umount–ttfs/tmp2
(4)在模块卸载时卸载文件系统。
在cleanup_module()函数中调用unregister_(&tfs_type);
(5)写一个测试该文件系统的应用程序完成对操作集合的测试。
4、学时数:
20