操作系统课程设计报告(含源代码).doc_第1页
操作系统课程设计报告(含源代码).doc_第2页
操作系统课程设计报告(含源代码).doc_第3页
操作系统课程设计报告(含源代码).doc_第4页
操作系统课程设计报告(含源代码).doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课设操作系统课程设计报告 姓名: 学号:班级: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. 编写四个测试程序: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 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 value 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 安装基本的文件系统 # 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 在这两行之间插入打印学号的代码,变为: 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下启动目标机,查看目标机启动时是否打印出你的学号。结果:试验五、系统调用的原理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(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这一张表格定义了系统调用号和系统调用的实现函数之间的映射关系:我们可以把没被实现的系统调用号(如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 */ 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 修改/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 /kernel# 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 必须在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.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_box函数源代码: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,失败返回-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_box_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中找到名为name的邮箱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 name count功能 接收者从名为name的邮箱接收count个数据。recv.c文件源代码:8.3. 运行测试程序创建邮箱 # create mybox先运行发送者,后运行接收者# send mybox 16 & # recv 16让发送者在后台运行先运行接收者,后运行发送者# re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论