內(nèi)核同步原語(yǔ) 操作系統(tǒng)課程設(shè)計(jì)_第1頁(yè)
內(nèi)核同步原語(yǔ) 操作系統(tǒng)課程設(shè)計(jì)_第2頁(yè)
內(nèi)核同步原語(yǔ) 操作系統(tǒng)課程設(shè)計(jì)_第3頁(yè)
內(nèi)核同步原語(yǔ) 操作系統(tǒng)課程設(shè)計(jì)_第4頁(yè)
內(nèi)核同步原語(yǔ) 操作系統(tǒng)課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、青島理工大學(xué)操作系統(tǒng)課程設(shè)計(jì)報(bào)告院(系): 計(jì)算機(jī)工程學(xué)院 專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí): 計(jì)算131 學(xué)生姓名: 鐘曉俊 學(xué)號(hào): 201307020 魏正迪 201307025 題目: 設(shè)計(jì)內(nèi)核同步原語(yǔ) 起迄日期: 2016.06.27-2016.07.08 設(shè)計(jì)地點(diǎn): 現(xiàn)代教育中心303 指 導(dǎo) 教 師: 熊曉云 20152016年度 第 2 學(xué)期完成日期: 2016 年 7 月 13 日一、 課程設(shè)計(jì)目的通過(guò)本次課設(shè),掌握操作系統(tǒng)中信號(hào)量signal()與wait()的工作原理,和在Linux內(nèi)核中增加系統(tǒng)調(diào)用函數(shù)的方法,了解對(duì)Linux內(nèi)核重新進(jìn)行編譯、連接的過(guò)程。另編寫(xiě)一個(gè)用戶測(cè)試

2、程序,調(diào)用新添加的的系統(tǒng)調(diào)用。在此期間,可以進(jìn)一步熟悉Linux系統(tǒng)操作,初步接觸到嵌入式系統(tǒng)。同時(shí),通過(guò)模擬實(shí)現(xiàn)的方式來(lái)體現(xiàn)操作系統(tǒng)的管理原理與算法,進(jìn)而深刻理解操作系統(tǒng)的運(yùn)行機(jī)制和數(shù)據(jù)結(jié)構(gòu)??梢蕴岣哌\(yùn)用操作系統(tǒng)知識(shí)解決實(shí)際問(wèn)題的能力;鍛煉實(shí)際的編程能力、創(chuàng)新能力及團(tuán)隊(duì)組織、協(xié)作開(kāi)發(fā)軟件的能力;還能提高調(diào)查研究、查閱技術(shù)文獻(xiàn)、資料以及編寫(xiě)軟件設(shè)計(jì)文檔的能力。二、 課程設(shè)計(jì)內(nèi)容 1、設(shè)計(jì)要求: 1)要求設(shè)計(jì)三個(gè)原語(yǔ)實(shí)現(xiàn)操作系統(tǒng)中信號(hào)量signal()與wait()功能:Request()、Release()和Broadcast()。 Request()類似wait()操作,該原語(yǔ)允許多個(gè)進(jìn)程因

3、一個(gè)事件而阻塞,每次產(chǎn)生阻塞時(shí)均會(huì)發(fā)出一個(gè)消息,“有多少個(gè)進(jìn)程處于阻塞狀態(tài)?!?Release()類似signal()操作,當(dāng)一個(gè)進(jìn)程產(chǎn)生這個(gè)事件的信號(hào)時(shí),該原語(yǔ)會(huì)喚醒處于阻塞隊(duì)列中的第一個(gè)進(jìn)程,并發(fā)出一個(gè)消息“進(jìn)程XX解除了阻塞狀態(tài),尚有XX個(gè)進(jìn)程處于阻塞狀態(tài)?!?;如果在信號(hào)產(chǎn)生時(shí),沒(méi)有進(jìn)程因?yàn)檫@個(gè)事件阻塞,那么這個(gè)信號(hào)無(wú)效,不產(chǎn)生任何消息。 Broadcast()是類似一個(gè)廣播操作,當(dāng)一個(gè)進(jìn)程產(chǎn)生這個(gè)事件的信號(hào)時(shí),該原語(yǔ)會(huì)喚醒處于阻塞隊(duì)列中的所有進(jìn)程,并發(fā)出一個(gè)消息“廣播,所有進(jìn)程解除了阻塞狀態(tài)?!?;如果在信號(hào)產(chǎn)生時(shí),沒(méi)有進(jìn)程因?yàn)檫@個(gè)事件阻塞,那么這個(gè)信號(hào)無(wú)效,不產(chǎn)生任何消息。 2)編寫(xiě)一

4、個(gè)測(cè)試程序,驗(yàn)證原語(yǔ)的正確性。 3)要求在實(shí)驗(yàn)報(bào)告中列出Linux內(nèi)核的版本與編譯過(guò)程。 2、小組成員分工如下:鐘曉俊負(fù)責(zé)課程設(shè)計(jì)報(bào)告的編寫(xiě)及協(xié)助魏正迪查找資料; 魏正迪負(fù)責(zé)內(nèi)核的配置并在其Linux內(nèi)核中添加系統(tǒng)調(diào)用,進(jìn)行程序測(cè)試等。三、 系統(tǒng)分析與設(shè)計(jì)1、系統(tǒng)分析操作系統(tǒng)對(duì)進(jìn)程的控制是依據(jù)用戶命令和系統(tǒng)狀態(tài)來(lái)決定的。進(jìn)程控制的功能是創(chuàng)建和撤消進(jìn)程,完成進(jìn)程狀態(tài)的轉(zhuǎn)換。進(jìn)程控制程序?qū)儆诓僮飨到y(tǒng)的內(nèi)核程序。 一條原語(yǔ)由若干條機(jī)器指令組成,是機(jī)器指令的延伸,能完成一個(gè)特定的功能,是一種特殊的系統(tǒng)調(diào)用命令。它的特點(diǎn)是執(zhí)行時(shí)不可中斷,且不允許原語(yǔ)并發(fā)執(zhí)行,即原子性。 對(duì)系統(tǒng)中所有

5、進(jìn)程的生命歷程進(jìn)行控制的原語(yǔ)稱為進(jìn)程控制原語(yǔ),與進(jìn)程控制有關(guān)的操作原語(yǔ)有:創(chuàng)建原語(yǔ)(create)、停止原語(yǔ)(halt)、掛起原語(yǔ)(suspend)、激活原語(yǔ)(active)、阻塞原語(yǔ)(block)、喚醒原語(yǔ)(wakeup)等基本原語(yǔ)。 內(nèi)核是系統(tǒng)的控制和協(xié)調(diào)的中心,在管態(tài)下運(yùn)行。功能需求如下: 1)Linux內(nèi)核的編譯安裝過(guò)程并添加系統(tǒng)調(diào)用。 2)設(shè)計(jì)三個(gè)原語(yǔ)(Request、Release、Broadcast)實(shí)現(xiàn)操作系統(tǒng)中信號(hào)量signal()與wait()功能。 注:Request原語(yǔ)實(shí)現(xiàn)某進(jìn)程請(qǐng)求一個(gè)資源的功能; Release原語(yǔ)實(shí)現(xiàn)某進(jìn)程釋放一個(gè)資源的功能; Broad

6、cast原語(yǔ)實(shí)現(xiàn)廣播喚醒所有進(jìn)程并釋放它們的功能。 3)編寫(xiě)一個(gè)用戶測(cè)試程序,驗(yàn)證設(shè)計(jì)原語(yǔ)的正確性。數(shù)據(jù)需求的數(shù)據(jù)流圖如圖1所示: 操作員事件隊(duì)列 建立事件事件資源數(shù) 阻塞事件 可用資源數(shù)釋放一個(gè)事件 操作員 釋放所有事件 事件資源數(shù)資源數(shù) 總資源數(shù) 資源數(shù)資源數(shù)資源數(shù) 資源數(shù)資源數(shù)圖1 數(shù)據(jù)需求的數(shù)據(jù)流圖重要數(shù)據(jù)結(jié)構(gòu)的說(shuō)明,以及在關(guān)鍵算法中的作用如下: (1)進(jìn)程阻塞需要一個(gè)等待隊(duì)列,所有等待同一事件號(hào)的進(jìn)程都掛接到該隊(duì)列。所以我們需要定義一個(gè)結(jié)構(gòu)體myevevt_t,包含事件號(hào)eventnum,資源數(shù)目value以及等待隊(duì)列的指針等數(shù)據(jù) (2)另外我們需要定義兩個(gè)全局的指針變量來(lái)為實(shí)現(xiàn)事件

7、的隊(duì)列操作:分別是鏈頭指針myevent_t * lpmyevent_head 和鏈尾指針myevent_t * lpmyevent_end 。這里著重說(shuō)明信號(hào)量機(jī)制的實(shí)現(xiàn);增加了變量資源數(shù)value,每次進(jìn)行wait()操作的時(shí)候,判斷資源數(shù)是否足夠,如果資源數(shù)足夠,則將資源數(shù)減1,否則將進(jìn)程放到一個(gè)等待隊(duì)列中去;每次進(jìn)行signal()操作時(shí)候,本系統(tǒng)中只需要判斷等待隊(duì)列上是否有進(jìn)程在等待,如果沒(méi)有,說(shuō)明現(xiàn)在的資源數(shù)是充足的,沒(méi)有進(jìn)程出現(xiàn)等待的現(xiàn)象,需要將資源數(shù)加1;如果等待隊(duì)列上已經(jīng)有進(jìn)程在等待,需要將隊(duì)列頭部的進(jìn)程喚醒。其中最重要的是對(duì)資源數(shù)的同步實(shí)現(xiàn),對(duì)于資源計(jì)數(shù),本系統(tǒng)使用了原子變

8、量。(3)在進(jìn)程添加到隊(duì)列的時(shí)候,使用了獨(dú)占等待的方法,使用了add_to_queue_exclusive,該函數(shù)將進(jìn)程放到指定的隊(duì)列尾部,而且置上exclusive標(biāo)記。 在阻塞時(shí),Request中使用一個(gè)函數(shù)來(lái)使相應(yīng)進(jìn)程阻塞。 在喚醒時(shí),Release中使用wakeup()將指定隊(duì)列上的進(jìn)程喚醒,Broadcast使用一定的函數(shù)喚醒所有進(jìn)程。2、系統(tǒng)設(shè)計(jì):設(shè)計(jì)的內(nèi)核同步原語(yǔ)要求具有以下功能:能夠使多個(gè)進(jìn)程阻塞在某一特定的事件上,直到另一進(jìn)程完成這一事件釋放相關(guān)資源,給內(nèi)核發(fā)送特定消息然后由內(nèi)核喚醒這些被阻塞的進(jìn)程。如果沒(méi)有進(jìn)程阻塞在這個(gè)事件上,則消息被忽略。為了實(shí)現(xiàn)這些功能,可以編寫(xiě) 4

9、個(gè)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)這些功能要求:1)新建一個(gè)事件的系統(tǒng)調(diào)用函數(shù):int sys_Create(int eventNum,int value);生成一個(gè)事件,返回該事件的 ID,如果參數(shù)為 0,表示是一個(gè)新的事件,否則就是一個(gè)已經(jīng)存在的事件。2)將進(jìn)程阻塞到一個(gè)事件的系統(tǒng)調(diào)用函數(shù):int sys_Request(int eventNum);進(jìn)程阻塞到 eventNum 事件,直到該事件完成才被喚醒。3)喚醒一個(gè)阻塞進(jìn)程的系統(tǒng)調(diào)用函數(shù):int sys_Release(int eventNum);喚醒一個(gè)等待eventNum 事件的進(jìn)程,如果隊(duì)列為空,則忽略。4)撤銷所有阻塞進(jìn)程的系統(tǒng)調(diào)用函數(shù):int

10、 sys_Broadcast(int eventNum);喚醒所有等待eventNum事件的進(jìn)程,如果信號(hào)產(chǎn)生時(shí),隊(duì)列為空,則無(wú)效。然后我們需要把代碼集成到內(nèi)核中,然后進(jìn)行測(cè)試,主要工作如下: 設(shè)計(jì)事件的數(shù)據(jù)結(jié)構(gòu)和系統(tǒng)調(diào)用函數(shù)。 1)說(shuō)明一個(gè)事件查找函數(shù)。 2)建立或查找事件的系統(tǒng)調(diào)用,它返回建立的信事件的編號(hào)。 3)等待事件的系統(tǒng)調(diào)用。 4)喚醒等待事件進(jìn)程的系統(tǒng)調(diào)用。 5)撤銷某個(gè)事件的系統(tǒng)調(diào)用。 6)重新編譯內(nèi)核,用新內(nèi)核重啟系統(tǒng)。 7)測(cè)試設(shè)計(jì)的同步機(jī)制。3、模塊設(shè)計(jì):程序模塊圖如圖2所示: 內(nèi)核同步原語(yǔ)查找事件scheventNum()創(chuàng)建事件Create()阻塞事件Request(

11、)喚醒事件Release()撤銷事件Broadcast()圖2 程序模塊圖建立事件的系統(tǒng)調(diào)用函數(shù)流程圖如圖3所示: 開(kāi)始 運(yùn)行函數(shù)Create() 事件數(shù)不為零Y 遍歷已存在的事件N創(chuàng)建新事件事件是否 定位到位?Y返回事件號(hào) 結(jié)束N return 0圖3 建立事件Create()的系統(tǒng)調(diào)用函數(shù)流程圖阻塞事件Request()的系統(tǒng)調(diào)用函數(shù)流程圖如圖4所示: 開(kāi)始遍歷存在事件 是否定位到 事件?YN資源數(shù)減1返回事件號(hào) 結(jié)束 資源數(shù)>0?獲取事件的資源數(shù)Y 阻塞,等待被喚醒然后 資源數(shù)value減1 return 0YN圖4 阻塞事件Request()的系統(tǒng)調(diào)用函數(shù)流程圖喚醒一個(gè)阻塞事件R

12、elease()的系統(tǒng)調(diào)用函數(shù)流程圖如圖5所示: 開(kāi)始遍歷存在的事件 是否定位到 事件?YN資源數(shù)value減1返回事件號(hào) 結(jié)束 value>0?獲取事件的資源數(shù)Y 阻塞,等待被喚醒然后 資源數(shù)value減1 return 0YN圖5 喚醒一個(gè)阻塞事件Release()的系統(tǒng)調(diào)用函數(shù)流程圖喚醒所有阻塞進(jìn)程Broadcast()的系統(tǒng)調(diào)用函數(shù)流程圖如圖6所示: 開(kāi)始遍歷已存在事件 是否定位到 事件?YN返回事件號(hào) 結(jié)束調(diào)用wake_up_all(),喚醒多有阻塞進(jìn)程Y return 0kfree(releaseItem),釋放事件結(jié)點(diǎn)圖6 喚醒所有阻塞進(jìn)程Broadcast()的系統(tǒng)調(diào)用函

13、數(shù)流程圖四、系統(tǒng)測(cè)試與調(diào)試分析1、系統(tǒng)測(cè)試(1)新建事件Create()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試表測(cè)試說(shuō)明測(cè)試名稱內(nèi)核同步原語(yǔ)測(cè)試目的驗(yàn)證添加的系統(tǒng)調(diào)用功能是否成功實(shí)現(xiàn)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容新建事件Create()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試數(shù)據(jù)申請(qǐng)的資源數(shù):3預(yù)期結(jié)果成功創(chuàng)建一個(gè)事件,事件號(hào)為:XX資源數(shù)為:3測(cè)試結(jié)果成功創(chuàng)建一個(gè)事件,事件號(hào)為:XX資源數(shù)為:3(2)阻塞事件Request()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試表測(cè)試說(shuō)明測(cè)試名稱內(nèi)核同步原語(yǔ)測(cè)試目的驗(yàn)證添加的系統(tǒng)調(diào)用功能是否成功實(shí)現(xiàn)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容阻塞事件Request()的系統(tǒng)調(diào)用函

14、數(shù)功能測(cè)試數(shù)據(jù)事件號(hào):XX預(yù)期結(jié)果已經(jīng)成功申請(qǐng)一個(gè)資源給事件XX測(cè)試結(jié)果已經(jīng)成功申請(qǐng)一個(gè)資源給事件XX(3)喚醒事件Release()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試表測(cè)試說(shuō)明測(cè)試名稱內(nèi)核同步原語(yǔ)測(cè)試目的驗(yàn)證添加的系統(tǒng)調(diào)用功能是否成功實(shí)現(xiàn)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容喚醒事件Release()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試數(shù)據(jù)事件號(hào):XX預(yù)期結(jié)果已經(jīng)釋放了事件XX的一個(gè)資源測(cè)試結(jié)果已經(jīng)釋放了事件XX的一個(gè)資源(4)喚醒所有事件Broadcast()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試表測(cè)試說(shuō)明測(cè)試名稱內(nèi)核同步原語(yǔ)測(cè)試目的驗(yàn)證添加的系統(tǒng)調(diào)用功能是否成功實(shí)現(xiàn)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容喚

15、醒所有事件Broadcast()的系統(tǒng)調(diào)用函數(shù)功能測(cè)試數(shù)據(jù)事件號(hào):XX預(yù)期結(jié)果已經(jīng)釋放了事件XX的全部資源測(cè)試結(jié)果已經(jīng)釋放了事件XX的全部資源預(yù)期結(jié)果如下:2、調(diào)試分析這次遇到的主要問(wèn)題是內(nèi)核的編譯和向內(nèi)核中增加新的系統(tǒng)調(diào)用。內(nèi)核的編譯對(duì)細(xì)節(jié)要求很高。1>例如:當(dāng)你新添加的系統(tǒng)調(diào)用的函數(shù)為無(wú)參的函數(shù)時(shí)void name()這種格式并不正確,正確的格式為void name(void);用第一種形式時(shí),進(jìn)行內(nèi)核編譯操作(# make install)時(shí)會(huì)有錯(cuò)誤提示。2>由于內(nèi)核中的文件都是只讀文件,并沒(méi)有修改的權(quán)限,所以需要用root權(quán)限來(lái)對(duì)文件進(jìn)行操作,進(jìn)行操作的方式有兩種:第一種是

16、#gedit 文件路徑 然后直接保存;第二種為#vi 文件路徑 這種方式最后退出的時(shí)候需要用特定的命令才能保存#w !sudo tee % 通過(guò)這種方式進(jìn)行保存。方式一中會(huì)遇到時(shí)間超時(shí)的提示(自己覺(jué)得是文件太多,檢索時(shí)間過(guò)長(zhǎng)),只有用第二種方式。3>調(diào)試小技巧:當(dāng)編譯內(nèi)核成功時(shí),但是系統(tǒng)調(diào)用調(diào)不出來(lái),卡死或者以殺死時(shí),需要使用printk內(nèi)核調(diào)試函數(shù)例如:最后通過(guò)命令dmesg命令查看程序從哪里中斷,就在那里解決。提醒內(nèi)核編譯繁瑣,容易出錯(cuò),要耐心。五、用戶手冊(cè).本實(shí)驗(yàn)在ununtu14.04系統(tǒng)上操作,原來(lái)內(nèi)核為4.2.2,要編譯的內(nèi)核版本為3.14.57。到linux官網(wǎng)https:

17、//下載純凈的內(nèi)核源碼linux-3.14.57.tar.gz將下載到的壓縮包移動(dòng)到根目錄下/usr/src目錄下;通過(guò)命令將源碼解壓tar vxf linux-3.14.57.tar.gz linux-3.14.57 然后進(jìn)入linux-3.14.57目錄下操作(此次操作大部分都在此目錄下操作)1. 獲取權(quán)限并進(jìn)入內(nèi)核解壓目錄2.修改文件 a.在文件中添加系統(tǒng)調(diào)用 b.修改系統(tǒng)調(diào)用表的內(nèi)容 c.寫(xiě)入系統(tǒng)調(diào)用處理程序聲明注:聲明的順序必須和調(diào)用表的順序一樣3. 安裝工具#apt-get install libncurses5-dev4. 清除以前編譯的內(nèi)核信息#ma

18、ke mrproper(第一次編譯不需此命令)5. 配置內(nèi)核#make oldconfig6.編譯內(nèi)核#make -j87.安裝模塊#make modules_install8. 安裝內(nèi)核#make install9. 創(chuàng)建initrd文件mkinitranfs 3.14.57 -o /boot/initrd.img-3.14.5710. 更新引導(dǎo)項(xiàng)update-grub11. 重啟reboot之后啟動(dòng)頁(yè)面會(huì)出現(xiàn)新編譯的內(nèi)核和原有的內(nèi)核選項(xiàng)進(jìn)行選擇12. 重啟之后查看內(nèi)核已使用新的內(nèi)核13. 調(diào)用新加的系統(tǒng)調(diào)用(1).創(chuàng)建后多次申請(qǐng)資源,直到阻塞(2).打開(kāi)新的終端,釋放資源,終端1中的進(jìn)程自

19、動(dòng)釋放(3).多個(gè)程序阻塞時(shí),打開(kāi)新的終端調(diào)用broadcast釋放所有的14. 執(zhí)行dmesg查看系統(tǒng)調(diào)用中printk打印輸出的信息六、程序清單新加的系統(tǒng)調(diào)用函數(shù)源碼1.yuan.c#include <linux/wait.h>#include <linux/sched.h>#include <linux/slab.h>#include <asm/atomic.h>typedef struct _myeventint eventNum;atomic_t value;wait_queue_head_t p; struct _myevent *n

20、ext;myevent_t;myevent_t * lpmyevent_head = NULL ; myevent_t * lpmyevent_end = NULL ;myevent_t * scheventNum(int eventNum, myevent_t *prev)myevent_t *tmp = lpmyevent_head;*prev = NULL;while(tmp)if(tmp->eventNum = eventNum)return tmp;*prev = tmp;tmp = tmp->next;return NULL;asmlinkage int sys_Cre

21、ate(int eventNum,int value)myevent_t *new_event = 0;myevent_t *prev = 0;int result ;if(!scheventNum( eventNum, &prev) new_event = (myevent_t *) kmalloc(sizeof(myevent_t),GFP_KERNEL);init_waitqueue_head(&new_event->p);new_event->next = NULL;new_event->p.task_list.next = &new_even

22、t->p.task_list;new_event->p.task_list.prev = &new_event->p.task_list;if(!lpmyevent_head)new_event->eventNum = eventNum;lpmyevent_head =lpmyevent_end= new_event;else new_event->eventNum = eventNum;lpmyevent_end->next=new_event;lpmyevent_end=new_event;atomic_set(&new_event-&g

23、t;value,value);result = new_event->eventNum;return result;elsereturn eventNum;asmlinkage int sys_Request(int eventNum)myevent_t *tmp;myevent_t *prev = NULL;if(tmp = scheventNum( eventNum, &prev) != NULL)printk("wait:value is %d",atomic_read(&tmp->value);if (atomic_read(&t

24、mp->value) > 0)atomic_dec(&tmp->value);printk("wait:i've dec value to <%d>",atomic_read(&tmp->value);return eventNum;printk("wait:value should be 0 to sleep->value:%dn",atomic_read(&tmp->value);DEFINE_WAIT(wait); /prepare_to_wait(&tmp&g

25、t;p,&wait,TASK_INTERRUPTIBLE);set_current_state(TASK_INTERRUPTIBLE);add_wait_queue_exclusive(&tmp->p,&wait); schedule(); finish_wait(&tmp->p,&wait);printk("wait:now i'm back and value is :%dn",atomic_read(&tmp->value);return eventNum;return 0;asmlinkage

26、 int sys_Release(int eventNum)myevent_t *tmp = NULL;myevent_t *prev = NULL;if(tmp = scheventNum(eventNum,&prev) != NULL) if (list_empty(&(tmp->p.task_list) atomic_inc(&tmp->value);printk("signal:so list is empty and value now is(added):%dn",atomic_read(&tmp->value)

27、;return eventNum;printk("signal:so i'm going to wake up one exclusive processn");wake_up(&tmp->p); return eventNum;return 0;asmlinkage int sys_Broadcast(int eventNum)myevent_t *prev=NULL;myevent_t *releaseItem;if(releaseItem = scheventNum(eventNum,&prev) != NULL)if( releaseItem = lpmyevent_end) lpmyevent_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論