操作系统课程设计报告30146_第1页
操作系统课程设计报告30146_第2页
操作系统课程设计报告30146_第3页
操作系统课程设计报告30146_第4页
操作系统课程设计报告30146_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、 . . . 课 程 设 计 报 告课程名称 操作系统 课题名称 LINUX的消息函数的分析 专 业 通信工程 班 级 0502 学 号 1 姓 名 金 国 兴 指导教师 颜 国 风、谭小兰 2008年 7月 1 日22 / 23工程学院课 程 设 计 任 务 书课程名称操作系统课 题LINUX的消息函数的分析 专业班级 通信0502 学生 金 国 兴 学 号 1 指导老师 颜国风 谭小兰审 批 任务书下达日期 2008 年 7 月 1 日任务完成日期 2008年 7 月 4日任 务 书一、设计容与设计要求1设计容以学号除以4求余数,余数一样的同学为一组选择相应的课题完成课程设计。掌握操作系统

2、的工作原理,培养小组合作能力,培养阅读大型程序代码的能力。本小组的设计课题为:设计三 LINUX的消息函数的分析要:根据设计书所提供的基础知识,分析相关代码,得到相关的框图,写出设计报告。代码的位置:icp/msg.c 2设计要求认真阅读代码,与同组同学合作,通过充分的讨论得到相关的结论二、进度安排第 18 周 星期二 14:30-18:30 星期三 12:30-14:30 星期四 12:30-14: 30目录一、课程设计任务书1二、目 录3三、课题的主要功能4四、课题的功能模块的划分5五、主要功能的实现7六、调试分析9七、总结14八、附件:15课程设计评分表21一、课题主要功能:Linux采

3、用消息队列的方式来实现消息传递。System V的消息队列(message queues)是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息即在发送完消息后,发送方就可以从事其它工作了而接收方也不必一直等待消息。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。Linux维护了一系列消息队列的msgque向量表。其中的每一个单元都指向一个msqid_ds的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统存中分配一个新的msqid_d

4、s的数据结构并插入到向量表中。每一个msqid_ds数据结构都包括一个ipc_perm的数据结构和进入这个队列的消息的指针。另外,Linux保留队列的改动时间,例如上次队列写的时间等。Msqid_ds队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。 每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm数据结构的模式比较。如果进程可以向这个队列写,则消息会从进程的地址空间写到msg数据结构,放到消息队列的最后。每一个消息都带有进程间约定的,应用程序指定类型的标记。但是,因为Linux限制了可以写的消息的数量和长度,可能会没有空间容纳消息。这时,进程

5、会被放到消息队列的写等待队列,然后调用调度程序选择一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。如果没有符合条件的消息,读进程会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。在小组中,我做了函数msgctl( )的分析。Linux消息函数Msgctl()功能描述: 功能:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等等操作。主要由sys_msgctl

6、执行。说明:系统调用提供一系列消息控制操作,操作动作由cmd定义,以下cmd定义值表明了各操作动作的定义. . IPC_STAT:将msqid相关的数据结构中各个元素的当前值放入由buf指向的结构中. . IPC_SET:将msqid相关的数据结构中的下列各元素设置为由buf指向的结构中的对应值. msg_perm.uid msg_perm.gid msg_perm.mode msg_qbytes该命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的进程或有效UID有合适权限的进程操作.只有具有合适权限的用户才能增加msg_qbytes的值. IPC_RMID:删除由

7、msqid指示的消息队列.将它从系统中删除并破坏相关的数据结构.该命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的进程或有效UID有合适权限的进程操作.返回值:调用成功则返回值为0,否则为-1.其它子函数功能:Msgget:(纯 负责)功能:取得一个消息队列。调用者提供消息队列的键标(用于表示一个消息队列的唯一的名字),当这个队列存在的时候,这个系统调用负责返回这个队列的标识号;如果这个队列不存在,就创立一个消息队列,然后返回这个消息队列的标识号。主要由sys_msgget执行。Msgsnd:(付馨霞 负责)功能:发送消息到指定的消息队列中。主要由real_msg

8、snd执行。Msgrcv:(龙志辉 负责)功能:用msgrcv函数系统调用从msqid消息队列中读取一条信息并将其放入消息段指针msgp指向的结构。msgsz给出mtext的字节数, 如果所接收的消息比msgsz大且msgflg&MSG_NOERROR为真,则按msgsz的大小截断而不通知调用进程。从消息队列中取得指定类型的消息.。二、课题功能模块的划分(主要框图):图(一) 模块图三、主要功能的实现:Msgctl()流程图:图(二)对消息队列进行控制的函数sys_msgctl流程图四、程序调试:代码与注释:asmlinkage int sys_msgctl (int msqid, i

9、nt cmd, struct msqid_ds *buf)/msqid参数指定了一个消息队列,cmd指出sys_msgctl函数应该对它如何操作。/需不需要buf取决于cmd,而且即使当它被使用时它的含义也将随情况的不同而不同。int id, err = -EINVAL;struct msqid_ds *msq;struct msqid_ds tbuf;struct ipc_perm *ipcp;lock_kernel();/do while(0)/加锁if (msqid < 0 | cmd < 0)/检查参数,如果参数错误就进行出错处理goto out;err = -EFAULT

10、;/根据cmd的不同进行不同的处理switch (cmd) case IPC_INFO: case MSG_INFO:/返回所需要的信息到指定的结构struct msginfo中 if (!buf)goto out;/返回 struct msginfo msginfo;/* buffer for msgctl calls IPC_INFO, MSG_INFO */msginfo.msgmni = MSGMNI;msginfo.msgmax = MSGMAX;msginfo.msgmnb = MSGMNB;msginfo.msgmap = MSGMAP;msginfo.msgpool = MSG

11、POOL;msginfo.msgtql = MSGTQL;msginfo.msgssz = MSGSSZ;msginfo.msgseg = MSGSEG;if (cmd = MSG_INFO) /假如cmd是MSG_INFO而不是IPC_INFO时,还要包括一些额外信息msginfo.msgpool = used_queues;msginfo.msgmap = msghdrs;msginfo.msgtql = msgbytes;err = -EFAULT; if (copy_to_user (buf, &msginfo, sizeof(struct msginfo)goto out;

12、/复制是由copy_to_user函数err = max_msqid;goto out;case MSG_STAT:/返回所需要的统计信息-它的当前和最大容量、它的最近的读者和写者的PID,等等。if (!buf)goto out;err = -EINVAL;if (msqid > max_msqid)goto out;msq = msgquemsqid;if (msq = IPC_UNUSED | msq = IPC_NOID)goto out;err = -EACCES;if (ipcperms (&msq->msg_perm, S_IRUGO)/缺少访问该队列的许可,

13、则返回goto out;id = (unsigned int) msq->msg_perm.seq * MSGMNI + msqid;/计算"完全的"标识符-序列编号tbuf.msg_perm = msq->msg_perm;tbuf.msg_stime = msq->msg_stime;tbuf.msg_rtime = msq->msg_rtime;tbuf.msg_ctime = msq->msg_ctime;tbuf.msg_cbytes = msq->msg_cbytes;tbuf.msg_qnum = msq->msg_q

14、num;tbuf.msg_qbytes = msq->msg_qbytes;tbuf.msg_lspid = msq->msg_lspid;tbuf.msg_lrpid = msq->msg_lrpid;/把请求的信息复制到一个临时变量中err = -EFAULT;if (copy_to_user (buf, &tbuf, sizeof(*buf)/再把临时变量复制回调用者的缓存goto out; err = id;/返回"完全的"标识符-序列编号goto out;/剩下三种情况:IPC_SET、IPC_STAT,和IPC_RMID,与上述情况都在

15、switch语句里被完全的处理不同,在此仅进行部分处理case IPC_SET:/缓冲区非空,就将它复制到tbuf里以便后面函数的进一步处理if (!buf)goto out;err = -EFAULT; /err被再次赋值if (!copy_from_user (&tbuf, buf, sizeof (*buf)err = 0; break;case IPC_STAT:/只检查缓冲区是否非空if (!buf)goto out;break;/最后一种情形,IPC_RMID在这个语句中不工作;它所有的工作都推迟到后边的函数中完成。id = (unsigned int) msqid % M

16、SGMNI;/从msqid里提取出数组下标msq = msgque id;err = -EINVAL;if (msq = IPC_UNUSED | msq = IPC_NOID)/是否在指定的下标处存在着一个有效的消息队列goto out;err = -EIDRM;if (msq->msg_perm.seq != (unsigned int) msqid / MSGMNI)/在指定的下标处存在着一个有效的消息队列goto out;ipcp = &msq->msg_perm;switch (cmd) case IPC_STAT:/把统计信息复制进调用者的缓冲区里,与先前MSG

17、_STAT的情形非常类似err = -EACCES;if (ipcperms (ipcp, S_IRUGO)/检测用户是否有从队列中读出的许可goto out;tbuf.msg_perm = msq->msg_perm;tbuf.msg_stime = msq->msg_stime;tbuf.msg_rtime = msq->msg_rtime;tbuf.msg_ctime = msq->msg_ctime;tbuf.msg_cbytes = msq->msg_cbytes;tbuf.msg_qnum = msq->msg_qnum;tbuf.msg_qby

18、tes = msq->msg_qbytes;tbuf.msg_lspid = msq->msg_lspid;tbuf.msg_lrpid = msq->msg_lrpid;/把请求的信息复制到一个临时变量中err = -EFAULT;if (!copy_to_user (buf, &tbuf, sizeof (*buf)/再把临时变量复制回调用者的缓存,err = 0;goto out;case IPC_SET:/设置相应的消息队列的参数err = -EPERM;/为了操纵消息队列的参数,调用者必须拥有该队列或者拥有CAP_SYS_ADMIN 权能if (curren

19、t->euid != ipcp->cuid && current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN) /* We _could_ check for CAP_CHOWN above, but we don't */goto out;if (tbuf.msg_qbytes > MSGMNB && !capable(CAP_SYS_RESOURCE)goto out;/被选择的参数根据调用者提供的tbuf被设置msq->msg_qbytes = tbu

20、f.msg_qbytes;ipcp->uid = tbuf.msg_perm.uid;ipcp->gid = tbuf.msg_perm.gid;ipcp->mode = (ipcp->mode & S_IRWXUGO) | (S_IRWXUGO & tbuf.msg_perm.mode);msq->msg_ctime = CURRENT_TIME;err = 0;goto out;case IPC_RMID:/如果函数调用者有权限,就删除这个消息队列err = -EPERM;if (current->euid != ipcp->cui

21、d && current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)goto out; /调用者拥有该队列或者有CAP_SYS_ADMIN权能freeque (id); /队列用freeque函数调用来释放err = 0;goto out;default:err = -EINVAL;goto out;out:unlock_kernel();/do while(0)/解锁return err;五、总结这次操作系统课程设计历时一个星期,在整整七天的日子里,我们对linux有了一个大概的了解,但是毕竟我们以前

22、没怎么接触过linux,又只有短短的一个星期,所以掌握的东西不是很多,在巩固以前所学过的C语言的知识的同时,对linux的消息函数部分知识也有了个大概的了解。通过这次设计,我加深了对linnx的了解,也对它有了浓厚的兴趣。这将对我们以后的计算机操作与对程序的分析有很大的帮助。这次课程设计,主要是锻炼分析大型软件的能力和跟同学团结合作的能力。我们这一组分析了linux的消息函数的分析。在这次课程设计中,我们小组通过从各个方面查找资料,知道了在Linux操作系统中进程间相互通讯的过程。小组成员通过对Linux的消息传递代码的分析,了解Linux操作系统中用于消息传递的msgget、msgsnd、m

23、sgrcv、msgctl的执行过程。小组成员通过对Linux的消息传递代码的分析锻炼了我们分析大型软件代码的能力。通过使用Windows下的源代码分析工具Source Insight使我们熟练掌握了Source Insight这一软件,并且熟练掌握了分析大型软件代码的步骤。 通过与同组同学的合作,加强了我们的团体合作能力。通过对Linux这种大型软件代码的分析,看到大型软件的编程习惯,我们组成员深感我们平时的编程习惯与良好的编程习惯相差甚远,小组成员决定在以后的编程过程中养成良好的编程习惯,这样有助于自己所编的程序清晰明了便于该错还有助于别人来立解你的程序。同时通过这次课程设计我们形成了通过从

24、各方面查找资料来丰富自己的知识的能力。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做这么大的程序,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。总的来说,这次课程设计还是比较成功的,在设计中遇到了很多问题,但最后在老师的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相

25、结合的目的,不仅学到了不少新的知识,而且锻炼了自己的动手、动脑能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后请允许我用我最真诚的感送给我们尊敬的指导老师,感他们在实验中对我们的指导和帮助!也感学校给我们的这个课程设计的机会。六、附件 1、小组组成与完成任务: 纯 负责对msgget()函数进行代码分析并画出流程图; 付馨霞 负责对msgsnd()函数进行代码分析并画出流程图; 龙志辉 负责对msgrcv()函数进行代码分析并画出流程图; 金国兴 负责对msgctl()函数进行代码分析并画出流程图;2、有关常量与相关错误信息的含义:(1)常量含义:static str

26、uct msqid_ds *msgqueMSGMNI; /消息队列static int msgbytes = 0; /消息队列中所有消息的总字节数static int msghdrs = 0; /消息队列的队头static unsigned short msg_seq = 0;static int used_queues = 0; /已用的消息队列数static int max_msqid = 0; /消息队列最大的ID值static struct wait_queue *msg_lock = NULL; /消息队列锁定,不让等待进程进入(2)错误信息含义EINVAL22/* Invalid

27、argument */EFAULT14/* Bad address */EIDRM43/* Identifier removed */EACCES13/* Permission denied */EAGAIN11/* Try again */EINTR 4/* Interrupted system call */ENOMEM12/* Out of memory */E2BIG 7/* Arg list too long */ENOMSG42/* No message of desired type */ENOSPC28/* No space left on device */ENOMEM12/

28、* Out of memory */EPERM 1/* Operation not permitted */ENOENT 2/* No such file or directory */EEXIST17/* File exists */3、程序代码:asmlinkage int sys_msgctl (int msqid, int cmd, struct msqid_ds *buf)int id, err = -EINVAL;struct msqid_ds *msq;struct msqid_ds tbuf;struct ipc_perm *ipcp;lock_kernel();/do whi

29、le(0)if (msqid < 0 | cmd < 0)goto out;err = -EFAULT;switch (cmd) case IPC_INFO: case MSG_INFO:if (!buf)goto out; struct msginfo msginfo;msginfo.msgmni = MSGMNI;msginfo.msgmax = MSGMAX;msginfo.msgmnb = MSGMNB;msginfo.msgmap = MSGMAP;msginfo.msgpool = MSGPOOL;msginfo.msgtql = MSGTQL;msginfo.msgs

30、sz = MSGSSZ;msginfo.msgseg = MSGSEG;if (cmd = MSG_INFO) msginfo.msgpool = used_queues;msginfo.msgmap = msghdrs;msginfo.msgtql = msgbytes;err = -EFAULT; if (copy_to_user (buf, &msginfo, sizeof(struct msginfo)goto out;err = max_msqid;goto out;case MSG_STAT:if (!buf)goto out;err = -EINVAL;if (msqid

31、 > max_msqid)goto out;msq = msgquemsqid;if (msq = IPC_UNUSED | msq = IPC_NOID)goto out;err = -EACCES;if (ipcperms (&msq->msg_perm, S_IRUGO)goto out;id = (unsigned int) msq->msg_perm.seq * MSGMNI + msqid;tbuf.msg_perm = msq->msg_perm;tbuf.msg_stime = msq->msg_stime;tbuf.msg_rtime =

32、 msq->msg_rtime;tbuf.msg_ctime = msq->msg_ctime;tbuf.msg_cbytes = msq->msg_cbytes;tbuf.msg_qnum = msq->msg_qnum;tbuf.msg_qbytes = msq->msg_qbytes;tbuf.msg_lspid = msq->msg_lspid;tbuf.msg_lrpid = msq->msg_lrpid;err = -EFAULT;if (copy_to_user (buf, &tbuf, sizeof(*buf)goto out;

33、 err = id;goto out;case IPC_SET:if (!buf)goto out;err = -EFAULT; if (!copy_from_user (&tbuf, buf, sizeof (*buf)err = 0; break;case IPC_STAT:if (!buf)goto out;break;id = (unsigned int) msqid % MSGMNI;msq = msgque id;err = -EINVAL;if (msq = IPC_UNUSED | msq = IPC_NOID)goto out;err = -EIDRM;if (msq->msg_perm.seq != (unsigned int) msqid / MSGMNI)goto out;ipcp = &msq->msg_perm;switch (cmd) case IPC_STAT:err = -EACCES;if (ipcperms (ipcp, S_IRUGO)goto out;tbuf.msg_perm = msq->msg_perm;tbuf.msg_stime = msq->msg_stime;tbuf.msg_rtime = msq->msg_rtime;tbuf.msg_ctime

温馨提示

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

评论

0/150

提交评论