linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)

linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)

ID:14987321

大小:71.78 KB

頁數(shù):21頁

時(shí)間:2018-07-31

linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)_第1頁
linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)_第2頁
linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)_第3頁
linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)_第4頁
linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)_第5頁
資源描述:

《linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記 高級字符驅(qū)動學(xué)習(xí)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、Linux設(shè)備驅(qū)動程序?qū)W習(xí)筆記高級字符驅(qū)動學(xué)習(xí)--阻塞型I/0提出問題:若驅(qū)動程序無法立即滿足請求,該如何響應(yīng)?比如:當(dāng)數(shù)據(jù)不可用時(shí)調(diào)用read,或是在緩沖區(qū)已滿時(shí),調(diào)用write解決問題:驅(qū)動程序應(yīng)該(默認(rèn))該阻塞進(jìn)程,將其置入休眠狀態(tài)直到請求可繼續(xù)。?休眠:當(dāng)一個(gè)進(jìn)程被置入休眠時(shí),它會被標(biāo)記為一種特殊狀態(tài)并從調(diào)度器運(yùn)行隊(duì)列中移走,直到某些情況下修改了這個(gè)狀態(tài),才能運(yùn)行該進(jìn)程。安全進(jìn)入休眠兩原則:1.永遠(yuǎn)不要在原子上下文中進(jìn)入休眠。(原子上下文:在執(zhí)行多個(gè)步驟時(shí),不能有任何的并發(fā)訪問。這意味著,驅(qū)動程序不能再擁有自旋鎖,seqlock,或是RCU鎖時(shí),

2、休眠)2.對喚醒之后的狀態(tài)不能做任何假定,因此必須檢查以確保我們等待的條件真正為真?臨界區(qū)?vs?原子上下文原子上下本:一般說來,具體指在中斷,軟中斷,或是擁有自旋鎖的時(shí)候。臨界區(qū):每次只允許一個(gè)進(jìn)程進(jìn)入臨界區(qū),進(jìn)入后不允許其它進(jìn)程訪問。?otherquestion:要休眠進(jìn)程,必須有一個(gè)前提:有人能喚醒進(jìn)程,而起這個(gè)人必須知道在哪兒能喚醒進(jìn)程,這里,就引入了“等待隊(duì)列”這個(gè)概念。等待隊(duì)列:就是一個(gè)進(jìn)程鏈表(我的理解:是一個(gè)休眠進(jìn)程鏈表),其中包含了等待某個(gè)特定事件的所有進(jìn)程。等待隊(duì)列頭:wait_queue_head_t,定義在

3、h>定義方法:靜態(tài)?DECLARE_QUEUE_HEAD(name)?????????????????????動態(tài)?wait_queue_head_t?my_queue;????????????????????????????????init_waitqueue_head(&my_queue);?struct__wait_queue_head{????spinlock_tlock;????structlist_headtask_list;};typedefstruct__wait_queue_headwait_queue_head_t;?簡單休眠linu

4、x最簡單的休眠方式是wait_event(queue,condition)及其變種,在實(shí)現(xiàn)休眠的同時(shí),它也檢查進(jìn)程等待的條件。四種wait_event形式如下:wait_event(queue,condition);/*不可中斷休眠,不推薦*/wait_event_interruptible(queue,condition);/*推薦,返回非零值意味著休眠被中斷,且驅(qū)動應(yīng)返回-ERESTARTSYS*/wait_event_timeout(queue,condition,timeout);wait_event_interruptible_timeout(

5、queue,conditon,timeout);/*有限的時(shí)間的休眠,若超時(shí),則不管條件為何值返回0*/?喚醒休眠進(jìn)程的函數(shù):wake_upvoid?wake_up(wait_queue_head_t?*queue);void?wake_up_interruptible(wait_queue_head?*queue);慣例:用wake_up喚醒wait_event,用wake_up_interruptible喚醒wait_event_interruptible?休眠與喚醒實(shí)例分析:本例實(shí)現(xiàn)效果為:任何從該設(shè)備上讀取的進(jìn)程均被置于休眠。只要某個(gè)進(jìn)程向給設(shè)備

6、寫入,所有休眠的進(jìn)程就會被喚醒。staticDECLARE_WAIT_QUEUE_HEAD(wq);staticintflag=0;ssize_tsleepy_read(structfile*filp,char__user*buf,size_tcount,loff_t*pos){pirntk(KERN_DEBUG"process%i(%s)goingtosleep",current->pid,current->comm);wait_event_interruptible(wq,flag!=0);flag=0;printk(KERN_DEBUG"awo

7、ken%i(%s)",current->pid,current->comm);return0;}?ssize_tsleepy_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*pos){printk(KERN_DEBUG"process%i(%s)awakeningthereaders...",current->pid,current->comm);flag=1;wake_up_interruptible(&wq);returncount;?/*成功并避免重試*/}??阻塞與

8、非阻塞類操作小知識點(diǎn):操作系統(tǒng)中睡眠、阻塞、掛起的區(qū)別形象解釋操作系統(tǒng)中睡眠、阻

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。