操作系統課程設計報告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

提交評論