操作系统课程设计报告(含源代码).doc

上传人:文库蛋蛋多 文档编号:2388228 上传时间:2023-02-17 格式:DOC 页数:26 大小:1.10MB
返回 下载 相关 举报
操作系统课程设计报告(含源代码).doc_第1页
第1页 / 共26页
操作系统课程设计报告(含源代码).doc_第2页
第2页 / 共26页
操作系统课程设计报告(含源代码).doc_第3页
第3页 / 共26页
操作系统课程设计报告(含源代码).doc_第4页
第4页 / 共26页
操作系统课程设计报告(含源代码).doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《操作系统课程设计报告(含源代码).doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告(含源代码).doc(26页珍藏版)》请在三一办公上搜索。

1、操作系统课程设计报告 姓名: 学号:班级:2010年6月25日目录一、 试验实现3试验三、生成目标机33.1. 编译unixlite内核33.2. 制作目标机的启动软盘33.3. 对目标机的硬盘分区33.4. 格式化目标机的硬盘43.5.安装目标机的文件系统43.6. 测试目标机5试验四、Hello World!54.1. 目标54.2. 步骤5试验五、系统调用的原理65.1. 目标65.2. 步骤7试验七、 实现信号灯操作的系统调用97.1. 增加四个系统调用:97.2. 编写四个测试程序:137.3. 运行测试程序15试验八、 实现进程间通信的系统调用168.1. 增加四个系统调用:168

2、.2. 编写四个测试程序:208.3. 运行测试程序22二、 心得体会23第一部分 试验实现试验三、生成目标机试验步骤:3.1. 编译unixlite内核生成系统内核可执行文件kernel.target和系统内核镜像文件Image# cd /kernel# make dep# make3.2. 制作目标机的启动软盘把系统内核镜像文件Image写入到软盘。# cd /kernel# dd if=Image of=/dev/fd03.3. 对目标机的硬盘分区root(none) kernel# fdisk /dev/hdbCommand (m for help): m / 帮助Command (m

3、 for help): p /打印当前分区表Command (m for help): n /创建新的分区Command action e extended p primary partition (1-4)p /分区类型是主分区Partition number (1-4): 1 /第一主分区First cylinder (1-4, default 1): /输入回车,使用缺省值Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-4, default 4): / 输入回车,使用缺省值Using default v

4、alue 4Command (m for help): p /打印当前分区表Command (m for help): t /改变分区类型Selected partition 1Hex code(Type L to list codes): 81 /输入minix分区代码:81Command (m for help): p /打印当前分区表Command (m for help): w /存盘退出3.4. 格式化目标机的硬盘# mkfs.minix -v -n30 /dev/hdb13.5.安装目标机的文件系统1 挂载目标机的硬盘 # mount /dev/hdb1 /mnt/hdb12 安装

5、基本的文件系统 # tar zxvf rootfs.tar.gz -C /mnt/hdb13 卸载目标机的硬盘 # umount /mnt/hdb13.6. 测试目标机试验四、Hello World!4.1. 目标在目标机启动时打印出你的学号。4.2. 步骤1 编辑内核源文件/kernel/init/main.cc,main.cc定义了系统的入口:main函数,在main函数中找到如下两行代码: int main(). printf(Total Memory Size is %d Megn, nphysmeg); i386init(); /* setup gdt,idt,cr0 */.2 在这

6、两行之间插入打印学号的代码,变为: printf(Total Memory Size is %d Megn, nphysmeg); printf(This is student:040730424n); i386init(); /* setup gdt,idt,cr0 */3 在/kernel目录下使用make命令重新编译内核,生成内核镜像文件Image: # cd /kernel# make4 把系统内核镜像文件Image写入到软盘: # cd /kernel# dd if=Image of=/dev/fd05 在windows下启动目标机,查看目标机启动时是否打印出你的学号。结果:试验五、

7、系统调用的原理5.1. 目标通过为unixlite开发一个简单的系统调用了解系统调用的原理,要增加的系统调用原型是:int add(int a, int b);add的功能是返回参数a、参数b两者相加的和。5.2. 步骤5.2.1. 分配空闲的系统调用号为add系统调用分配空闲的系统调用号,查看/kernel/asm/trapS.S获得系统调用列表:#define SYS(name) .long sys#name#define XXX(name) .long sysnosysentry(syscalltab) sys(setup) /* 0 */ sys(exit) sys(fork) sys

8、(read) sys(write) sys(open) /* 5 */ sys(close) sys(waitpid) sys(creat) sys(link) sys(unlink) /* 10 */ sys(execve) sys(chdir) sys(time) sys(mknod) sys(chmod) /* 15 */ xxx(lchown) /* 16 */ xxx(break) /* 17 */ xxx(oldstat) /* 18 */ sys(lseek) sys(getpid) /* 20 */ . .syscalltab这一张表格定义了系统调用号和系统调用的实现函数之间的

9、映射关系:我们可以把没被实现的系统调用号(如16,17,18)分配给add系统调用. 我们选择16作为add的系统调用号, 修改syscalltab如下:#define SYS(name) .long sys#name#define XXX(name) .long sysnosysENTRY(syscalltab) SYS(setup) /* 0 */ SYS(exit) SYS(fork) SYS(read) SYS(write) SYS(open) /* 5 */ SYS(close) SYS(waitpid) SYS(creat) SYS(link) SYS(unlink) /* 10

10、*/ SYS(execve) SYS(chdir) SYS(time) SYS(mknod) SYS(chmod) /* 15 */ .long sysadd /* 16 */ XXX(break) /* 17 */ XXX(oldstat) /* 18 */ SYS(lseek) SYS(getpid) /* 20 */ .5.3.2. 在UnixLite基础上增加源文件1 增加一个目录plugin # cd /kernel# mkdir plugin2 在/kernel/plugin目录下创建文件Makefile,内容如下: include $(TOPDIR)/Rules.make3 修改

11、/kernel/Makefile,原文如下: SUBDIRS := init lib asm mm fs dev kern net4 现改为: SUBDIRS := init lib asm mm fs dev kern net plugin5.3.3. 实现add系统调用创建/kernel/plugin/add.cc文件, 其内容如下所示: #include #include asmlinkage int sysadd(int a, int b) return a + b;5.3.4. 编译内核在/kernel目录下使用make命令重新编译内核,生成内核镜像文件Image:# cd /ker

12、nel# make5.3.5. 把系统内核镜像文件Image写入到软盘:# cd /kernel# dd if=Image of=/dev/fd05.3.6. 编写测试程序#include int add(int a, int b) /add系统调用对应的系统调用号是16,把立即数16送往eax寄存器 asm (movl $16,%eaxnt int $0x80 /调用第0x80号中断服务 :ebx(a), ecx(b); /把参数a送往ebx寄存器,把参数b送往ecx寄存器int main() printf(1+1=%dn, add(1, 1); return 0;5.4. 注意事项1 必须

13、在unixlite中编译测试程序2 测试程序以.c为后缀命名,不要以.cc命名5.5. 测试结果试验七、 实现信号灯操作的系统调用7.1. 增加四个系统调用并实现:l 文件包Sema.cc含四个系统调用函数和一个初始化链表函数:初始化链表:create_sema函数:destroy_sema函数:wait_sema函数:signal_sema函数:7.2. 编写四个测试程序:7.2.1createCreate.c文件源代码:7.2.2. destroyDestroy.c文件源代码:7.2.3. wait_sema 和 signal_semaWait 、singnal 、main函数源代码:7.

14、3. 运行测试程序创建mutex、empty、full信号灯:# create mutex 1# create empty 8 假设公用缓冲区大小为8# crate full 0先运行生产者,后运行消费者 :# product & # consume先运行消费者,后运行生产者 # consume & # product试验八、 实现进程间通信的系统调用8.1. 增加四个系统调用:l 初始化链表函数:create_mail_box原型 int create_mail_box(char *name);功能 创建一个名称为name的邮箱。返回值 成功返回0,失败返回-1。create_mail_bo

15、x函数源代码:destroy_mail_box原型 int destroy_mail_box(char *name);功能 删除名称为name的邮箱。返回值 成功返回0,失败返回-1。destroy_mail_box函数源代码:send_msg原型 int send_msg(char *name, int msg);功能 向名称为name的邮箱发送消息msg。返回值 成功返回0,失败返回-1。send_msg函数源代码:recv_msg原型 int recv_msg(char *name, int *msg_pointer);功能 从名称为name的邮箱中接受消息。返回值 成功返回0,失败返回

16、-1。recv_msg函数源代码:8.2. 编写四个测试程序: 1. 描述邮箱的数据结构 2. #define CAPACITY 83. struct mail_box_t 4. char name16; /* 邮箱名称 */5. int msgqCAPCITY; /* 容量为8的用于存储消息的FIFO队列 */6. int in; /* fifo的in指针,参考教科书P46 */7. int out; /* fifo的out指针,参考教科书P46 */8. waitq_t waitq;9. mail_box_t * next; /* 邮箱队列中的下一个邮箱 */10. ;11. mail_b

17、ox_t *mail_box_list; /* 邮箱队列 */12. send_msg的实现 13. int send_msg(char *name, int msg)14. 15. 在mail_box_list中找到名为name的邮箱m16. while (根据in、out判断邮箱已经满)17. m-waitq.wait();18. 把msg送往m-msgq;19. m-waitq.broadcast();20. 21. recv_msg的实现 22. int recv_msg(char *name, int *msg_pointer)23. 24. 在mail_box_list中找到名为n

18、ame的邮箱m25. while (根据in、out判断邮箱已经空)26. m-waitq.wait();27. 从m-msgq中取出一个消息msg28. *msg_pointer = msg;29. m-waitq.broadcast();30. create语法 create name功能 创建名称为name的邮箱。Create。C文件源代码:destroy语法 destroy name功能 删除名称为name的邮箱。Destroy.c文件源代码:send语法 send name count功能 发送者向名为name的邮箱发送count个数据。Send.c文件源代码:recv语法 recv

19、 name count功能 接收者从名为name的邮箱接收count个数据。Recv.c文件源代码:8.3. 运行测试程序创建邮箱 # create mybox先运行发送者,后运行接收者# send mybox 16 & # recv 16让发送者在后台运行先运行接收者,后运行发送者# recv mybox 16 & # send 16让接收者在后台运行第二部分 心得体会 一步步从index.html看起,本人计算机专业课一向学得很差,以致到了跨专业考研的地步。这次是在计算机专业本科最后一次课设,总算熬到头了。开始根本不会做,也不知道从那进,后来在各位寝室兄弟们的指导下总算会用unix虚拟机中的各种命令了。敲代码一向是我头疼的事儿,好在咱有着坚持不懈的精神,东问西问算是总算马马虎虎搞出来了。在此谢谢各位寝室同学的帮助指导,感谢老师上课的辅导(虽然本人上课虽到但实在兴趣不浓),也希望老师在这次课设有一个较好的分数,让咱本科计算机最后一门课设有个良好的结尾,谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号