1、课程名称计算机操作系统实验一、课程名称:计算机操作系统实验(一)本课程实验总体介绍1、本课程上机实验的任务:通过该实验真正认识多进程、多线程、微核、死锁、文件系统、缓存等概念及实现原理;在充分理解原理和算法的基础上,发挥学生自我创造力,鼓励并创造机会让学生提出新的算法或实现。2、本课程上机实验简介: 分为课程实验和课程设计两大部分。 课程实验通过应用层编程调用系统接口加深对进程、内存、文件和设备等功能的理解。具体为实验14。课程设计通过对Linux核心源代码的实例分析和设计掌握系统设计的原理和方法。具体为实验512。3、本课程适用专业: 计算机相关专业。4、本课程上机实验涉及核心知识点: 核心
2、知识点:微核、系统调用、核心态与用户态、进程、线程、同步、互斥、并发、死锁、伙伴算法、文件及文件目录、I/O缓冲、调度算法、系统初始化、时钟中断等。5、本课程上机实验重点与难点: 并发控制,内核代码的分析与设计。6、本课程上机实验运用软件名称: VC+编译环境, Source Insight分析器、gcc编译器, 7、总学时: 课程实验:16学时 课程设计:共8个课程设计,每个根据难度在820学时。8、教材名称及教材性质(自编、统编、临时): 名称:LINUX操作系统分析与设计 性质:自编9、参考资料:计算机操作系统. 汤子瀛,西安电子科技大学出版社(第3版)Linux设备驱动程序第二版 Al
3、essandro Rubini & Jonathan Corbet编著 魏永明 骆刚等译 中国电力出版社 2002年11月 第一版。Linux操作系统内核分析陈莉君 编 人民邮电出版社 第一版。Linux操作系统内核实习 Gary Nutt 著 机械工业出版社。(二)包含实验项目基本信息实验项目11、实验项目名称:进程调度算法设计实践2、实验项目的目的和任务:目的:通过该实验,加深对多道系统中调度算法的认识。任务:实现FIFO,RR(q=1),SPN, SRT, HRRN, FB(去2i-1)六种调度算法。并通过输入一组进程序列计算出每种算法的输出进程序列。3、上机实验内容:(1)实现主程序及
4、六种调度算法。(2)输入一组进程序列,对序列中的每一个进程,定义不同的优先级、总执行时间,用六种调度算法输出调度最终的排序结果。序列例;进程号12345678优先级42213343运行时间23454、学时数:4 实验项目21、实验项目名称:线程间同步与互斥2、实验项目的目的和任务:目的:通过多线程并发程序设计,掌握同步与互斥的设计方法。任务:实现一个生产者、消费者的两线程同步算法。3、上机实验内容:(1)申请10个缓冲区。(2)编制生产者线程:首先产生一个随机数,写入到一个缓冲区中。其次将该缓冲区置“满”标志。(3)编制消费者线程:取一个“满”标志的缓冲区中数据,打印输出,然后将该缓冲区置“空
5、”标志。(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、实验项目的目的和
6、任务:目的:掌握文件系统的系统调用的使用。任务:产生两个文件A和B,并将这两个文件内容交叉复制到文件C中,并输出文件C的结果。3、上机实验内容:(1)产生一个1k的文件A,其内容为数字。(2)产生一个1k的文件B,其内容为字母。(3)以100字节为单位,将A、B两文件的内容交替复制到文件C中。最后输出C的结果。4、学时数:4 实验项目51、实验项目名称:Linux时间系统分析2、实验项目的目的和任务:通过对LINUX系统与时间有关的系统源代码分析,学习多任务系统中调度的核心事件时钟中断的实现原理,学习LINUX的内核机制以及内核时钟维护机制。3、上机实验内容:编写一个拾取当前时间的应用程序,熟
7、悉系统调用gettimeofday() 的使用。分析linuxkerneltime.c中的sys_gettimeofday()过程,说明时间是从何处取得的,并给出分析流图。分析linuxkernelitimer.c中的sys_getitimer()和sys_setitimer()过程,给出分析流图。分析linuxarchi386kernel中的时钟中断处理过程do_timer_interrupt()和linuxkernel中的timer_bh()过程,给出分析流图,解释时钟中断处理的全过程。4、学时数:10 实验项目61、实验项目名称:Linux系统初始化过程分析2、实验项目的目的和任务:通过
8、对LINUX启动处理代码的分析,学习操作系统初始化与其他模块实现的关系;学习各个模块的初始化顺序,深入理解操作系统的功能划分及相互关系;学习一个大型软件系统中初始化模块的设计方法。3、上机实验内容:分析在linuxinitmain.c中的start_kernel()函数过程,它是整个操作系统初始化最重要的过程。分析要求:由于涉及初始化系统各个模块,内容很广,这里要求了解start_kernel()函数中所调用的各个子过程所属模块,无需对被调用的子模块进一步分析。认识系统各个模块的初始化时机。详细分析start_kernel()函数中调用的sched_init和time_init两过程,说明它们
9、的主要功能,给出分析流图。详细分析start_kernel()函数中调用的kernel_thread(init,)、分析init函数及其中调用的do_basic_setup()函数;给出分析流图。4、学时数:4 实验项目71、实验项目名称:Linux文件系统分析2、实验项目的目的和任务:通过对Linux系统源代码分析,学习Linux虚拟文件系统VFS的原理及实现框架;学习VFS和逻辑文件系统如何协同实现对磁盘的管理;理解软件层状设计的特点。3、上机实验内容:分析文件linuxincludelinuxfs.h中、inode_operations、super_operations、等几个数据结构,
10、了解它们各自的作用。分析文件linuxfssuper.c中sys_mount()、sys_umount()、register_()和unregister_()的实现过程,并给出分析流图。分析文件linuxfs.c中函数(),了解文件系统初始化过程。分析vfs的fopen函数的实现过程,即分析文件linuxfsopen.c中的sys_open(),理解文件的各种操作集合的挂接过程,给出分析流图。4、学时数:12 实验项目81、实验项目名称:Linux网络通信协议分析2、实验项目的目的和任务:分析linux通信协议的组织结构;掌握SOCKET接口;掌握协议数据的接收和发送流程;掌握网卡的数据接收和
11、发送机制。3、上机实验内容:分析socket()系统调用过程,包括linuxnetsocket.c中的sys_socketcall()、sys_socket()、sock_create()和linuxnetipv4Af_inet.c中的inet_create等函数。分析bind()系统调用,包括linuxnetsocket.c中的sys_bind()和linuxnetipv4Af_inet.c中的inet_bind()函数。分析listen()系统调用,包括linuxnetsocket.c中的sys_listen()和linuxnetipv4Af_inet.c中的inet_listen()函数
12、。分析connect()系统调用,包括linuxnetsocket.c中的sys_connect()和linuxnetipv4Af_inet.c中的inet_stream_connect()函数。分析accept()系统调用,包括linuxnetsocket.c中的sys_accept()和linuxnetipv4Af_inet.c中的inet_accept()函数。分析send ()系统调用,包括linuxnetsocket.c中的sys_send()、sys_sendto()、sock_sendmsg()、linuxnetipv4Af_inet.c中的inet_sendmsg()、linu
13、xnetipv4Tcp_ipv4.c中的tcp_v4_sendmsg()、linuxnetipv4Tcp.c中的tcp_do_sendmsg()、linuxnetipv4Tcp_output.c中的tcp_send_skb()、tcp_transmit_skb()、linuxnetipv4Ip_output.c中的ip_queue_xmit()、linuxincludenetIp.h中的ip_output()、ip_finish_output()、linuxnetcoredev.c中的dev_queue_xmit()等函数。分析receive ()系统调用,包括linuxnetsocket.c
14、中的sys_recv()、sys_recvfrom()、linuxnetipv4Af_inet.c中的inet_recvmsg()、linuxnetipv4Tcp.c中的tcp_recvmsg()、linuxnetipv4Tcp_input.c中的tcp_rcv_established()、linuxnetipv4Tcp_ipv4.c中的tcp_v4_do_rcv()、tcp_v4_rcv()、linuxnetcoredev.c中的net_bh()、linuxnetipv4Ip_input.c中的ip_local_deliver()、ip_rcv()等函数。分析网卡驱动中数据发送和接收处理过程
15、。4、学时数:16 实验项目91、实验项目名称:Linux系统调用分析与实现2、实验项目的目的和任务:理解操作系统内核与应用程序的接口关系;加深对内核空间和用户空间的理解;学会增加新的系统调用。3、上机实验内容:a)增加系统调用函数直接在原有程序文件中增加,减少修改Makefile文件的麻烦。该函数的名称应该是新的系统调用名称前面加上sys_标志。例如新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:asmlinkage int sys_mycall(int number) printk(“call num
16、ber is %dn”,number);return number; b)连接新的系统调用添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该系统调用的存在。为了从已有的内核程序中增加到新的系统调用函数的连接,需要编辑两个文件。第一个要修改的文件是:/usr/src/linux/include/asm-i386/unistd.h 该文件中包含系统调用清单,用来给每个系统调用分配一个唯一的号码。将新增的系统调用名称加到清单最后,并给它分配号码序列中下一个可用的系统调用号。例如:#define _NR_mycall 239系统调用号为239,之所以系统调用号是239,是因为内核自身的系
17、统调用号码已经用到238。第二个要修改的文件是:/usr/src/linux/arch/i386/kernel/entry.S该文件中有类似如下的清单:long SYMBOL_NAME()该清单用来对sys_call_table数组进行初始化。该数组包含指向内核中每个系统调用的指针。这样就在数组中增加了新的内核函数的指针。在清单最后添加一行:long SYMBOL_NAME(sys_mycall)c) 重建新的Linux内核,作以下命令 make menuconfig 配置内核选项 make dep 生成依赖关系 make clean 清除旧的编译结果 make bzImage-new 编译内
18、核映象 make modules 编译内核模块 make modules_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:提示符后面有三种选择:lin
19、ux-new、linux、dos。选择 linux-new即可以新内核启动。用新内核启动后则可使用新的系统调用。e)使用新的系统调用编写应用程序使用新添加的系统调用mycall。4、学时数:8 实验项目101、实验项目名称:内核模块机制和新模块编写2、实验项目的目的和任务:理解Linux操作系统模块机制,学会使用模块设计系统的方法,学习编写一个新的内核模块。3、上机实验内容:(1)设计一个在/proc中实现clock文件的模块,该文件只支持文件的read()操作。当调用read()操作时,返回一个单一的ASCII字符串,其中包括用一个空格分开的两个数字子串。例如,若系统时间变量xtime设置为
20、:xtime.tv_sec=923264577 xtime.tv_usec=234438,则该模块必须返回如下形式的一个字符串:923264577 234438a) 写一个空内核模块,编译测试。 b) 生成一proc文件,以用于读取系统时钟。在模块中使用proc_register()和proc_unregister()注册和注销。它们引用一个struct proc_dir_entry数据结构,将该结构中get_info指针指向自己构造的读函数。模版如下:(2)设计一个演示模块应用程序,读取/proc/testmodule的内容并打印输出。4、学时数:12 实验项目111、实验项目名称:Linu
21、x环境设备驱动程序设计2、实验项目的目的和任务:学习linux系统设备驱动程序的组织结构及管理方法,掌握设备驱动程序的设计方法,并编写一个字符空设备驱动实例。通过实验进一步理解操作系统对设备管理的共性以及设备驱动程序的个性,理解各种设备驱动工作方式。3、上机实验内容:(1)模块初始化时完成对设备的注册。为使模块加载命令insmod来把设备驱动程序插入到内核之中。在insmod调用的init_module()函数中调用register_chrdev()注册一个字符设备(其他块设备与网络设备类似)。如果成功,设备名就会出现在/proc/devices文件中。(2)在文件系统为其创建一个代表节点。m
22、knod /dev/如:mknod /dev/test.c major minor(3)完成设备打开、关闭、读和写几个基本过程。例如:struct Test_Fops = NULL, /* 寻找 */ Read: device_read, /* 读设备 */ Write: device_write, /* 写设备*/ NULL, /* 读目录 */ NULL, /* 选择 */ NULL, /* ioctl */ NULL, /* mmap */ Open: device_open, /* 打开 */ NULL, /* 刷新 */ release: device_release, /* 关闭
23、*/;int init_module() Major = module_register_chrdev(0, DEVICE_NAME, &Test_fops); static int device_open(struct inode *inode, struct file *file)static int device_release(struct inode *inode, struct file *file)static ssize_t device_read(struct file *file, char *buffer, size_t length, loff_t *offset) s
24、tatic ssize_t device_write(struct file * char *buffer, size_t length, off_t *offset) (4)在模块卸载时卸载驱动程序模块。通过执行模块卸载命令rmmod中的cleanup_module()函数,调用module_unregister_chrdev()注销设备,对驱动程序模块进行卸载。(5)写一个测试该设备的应用程序完成测试。4、学时数:12 实验项目121、实验项目名称:LIUNX文件系统设计2、实验项目的目的和任务:通过设计一个独立的逻辑文件系统,掌握linux文件系统设计的注册、注销、挂接操作的实现细节。掌
25、握VFS和LFS的挂接实现技术。深入理解Linux文件操作集设计模式。3、上机实验内容:(1)模块初始化时完成对文件系统的注册。a)申明一个新的文件系统:static DECLARE_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 t tfs /tmp1 /tmp2 umount t tfs /tmp2(4)在模块卸载时卸载文件系统。在cleanup_module()函数中调用 unregister_(&tfs_type);(5)写一个测试该文件系统的应用程序完成对操作集合的测试。4、学时数:20
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1