



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、poll機(jī)制分析韋東山 2009.12.10所有的系統(tǒng)調(diào)用,基于都可以在它的名字前加上“sys_”前綴,這就是它在內(nèi)核中對應(yīng)的函數(shù)。比如系統(tǒng)調(diào)用 open、read、write、poll ,與之對應(yīng)的內(nèi)核函數(shù)為:sys_open、sys_read、sys_write、sys_poll。一、內(nèi)核框架:對于系統(tǒng)調(diào)用poll或select,它們對應(yīng)的內(nèi)核函數(shù)都是sys_poll。分析sys_poll,即可理解poll機(jī)制。1. sys_poll函數(shù)位于fs/select.c文件中,代碼如下:asmlinkage long sys_poll(struct pollfd _user *ufds, uns
2、igned int nfds,long timeout_msecs)s64 timeout_jiffies;if (timeout_msecs > 0) #if HZ > 1000/* We can only overflow if HZ > 1000 */if (timeout_msecs / 1000 > (s64)0x7fffffffffffffffULL / (s64)HZ)timeout_jiffies = -1;else#endiftimeout_jiffies = msecs_to_jiffies(timeout_msecs);) else /* Infi
3、nite (< 0) or no (0) timeout */timeout_jiffies = timeout_msecs;)return do_sys_poll (ufds, nfds, &timeout_jiffies);)它對超時參數(shù)稍作處理后,直接調(diào)用do_sys_poll。2. do_sys_poll函數(shù)也位于位于 fs/select.c文件中,我們忽略其他代碼:int do_sys_poll(struct pollfd _user *ufds, unsigned int nfds, s64 *timeout),poll_initwait(&table);,f
4、dcount = do_poll(nfds, head, &table, timeout);,)poll_initwait函數(shù)非常簡單,它初始化一個poll_wqueues變量table:poll_initwait > init_poll_funcptr(&pwq->pt, _pollwait); > pt->qproc = qproc;(0102030405060708091011121314151617181920212223242526272829303132333435即 table->pt->qproc = _pollwait ,
5、_pollwait 將在驅(qū)動的 poll 函數(shù)里用到。3. do_sys_poll函數(shù)位于fs/select.c文件中,代碼如下:static int do poll(unsigned int nfds, struct poll list *list,struct poll_wqueues *wait, s64 *timeout)for (;) (if (do_pollfd(pfd, pt) (count+;pt = NULL;if (count | !*timeout | signal_pending(current)break;count = wait->error;if (coun
6、t)break;if (*timeout < 0) (/* Wait indefinitely */_timeout = MAX_SCHEDULE_TIMEOUT; else if (unlikely(*timeout >= (s64)MAX_SCHEDULE_TIMEOUT-1) /* Wait for longer than MAX_SCHEDULE_TIMEOUT. Do it in* a loop*/_timeout = MAX_SCHEDULE_TIMEOUT - 1;*timeout -= _timeout; else _timeout = *timeout;*time
7、out = 0;_timeout = schedule_timeout(_timeout);if (*timeout >= 0)*timeout += _timeout;_set_current_state(TASK_RUNNING);return count;36 )分析其中的代碼,可以發(fā)現(xiàn),它的作用如下: 從02行可以知道,這是個循環(huán),它退出的條件為:a. 09行的3個條件之一 (count非0,超時、有信號等待處理)count非0表示04行的do_pollfd至少有一個成功。b. 11、12行:發(fā)生錯誤 重點(diǎn)在do_pollfd函數(shù),后面再分析 第30行,讓本進(jìn)程休眠一段時間,注意
8、:應(yīng)用程序執(zhí)行poll調(diào)用后,如果的條件不滿足,進(jìn)程就會進(jìn)入休眠。那么,誰喚醒呢?除了休眠到指定時間被系統(tǒng)喚醒外,還可以被驅(qū)動程序喚醒 記住這點(diǎn),這就是為什么驅(qū)動的poll里要調(diào)用poll_wait的原因,后面分析。4. do_pollfd函數(shù)位于fs/select.c文件中,代碼如下:static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait),if (file->f_op && file->f_op->poll)mask = file->f_op->
9、poll(file, pwait);,)可見,它就是調(diào)用我們的驅(qū)動程序里注冊的poll函數(shù)。二、驅(qū)動程序:驅(qū)動程序里與poll相關(guān)的地方有兩處:一是構(gòu)造file_operation結(jié)構(gòu)時,要定義自己的poll函數(shù)。二是通過 poll_wait來調(diào)用上面說到的 _pollwait函數(shù),pollwait的代碼如下: static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p) if (p && wait_address)p->qproc(fil
10、p, wait_address, p); )p->qproc就是_pollwait函數(shù),從它的代碼可知,它只是把當(dāng)前進(jìn)程掛入我們驅(qū)動程序 里定義的一個隊列里而已。它的代碼如下:static void _pollwait(struct file *filp, wait_queue_head_t *wait_address,poll_table *p) struct poll_table_entry *entry = poll_get_entry(p);if (!entry)return;get_file(filp);entry->filp = filp;entry->wait_
11、address = wait_address;init_waitqueue_entry(&entry->wait, current);add_wait_queue(wait_address, &entry->wait);)執(zhí)行到驅(qū)動程序的 poll_wait函數(shù)時,進(jìn)程并沒有休眠,我們的驅(qū)動程序里實現(xiàn)的poll函數(shù)是不會引起休眠的。 讓進(jìn)程進(jìn)入休眠,是前面分析的do_sys_poll函數(shù)的30行"_timeout =schedule_timeout _timeout)"。poll_wait只是把本進(jìn)程掛入 某個隊列,應(yīng)用程序調(diào)用poll >
12、 sys_poll > do_sys_poll >poll_initwait , do_poll > do_pollfd > 我們自己寫的 poll 函數(shù)后,再調(diào)用 schedule_timeout 進(jìn)入 休眠。如果我們的驅(qū)動程序發(fā)現(xiàn)情況就緒,可以把這個隊列 上掛著的進(jìn)程喚醒。可見,poll_wait的作用,只是為了讓驅(qū)動程序 能找到要喚醒的進(jìn)程。即使不用poll_wait ,我們的程序也有機(jī)會被喚醒:chedule_timeout(_timeout),只是要休眠_(dá)time_out這段時間。現(xiàn)在來總結(jié)一下 poll機(jī)制:1. poll > sys_poll > do_sys_poll > poll_initwait , poll_initwait 函數(shù)注冊一下回調(diào)函數(shù) _pollwait ,它就是我們的驅(qū)動程序執(zhí)行poll_wait時,真正被調(diào)用的函數(shù)。2. 接下來執(zhí)行file->f_op->poll ,即我們驅(qū)動程序里自己實現(xiàn)的poll函數(shù)它會調(diào)用poll_wait把自己掛入某個隊列,這個隊列也是我們的驅(qū)動自己定義的; 它還判斷一下設(shè)備是否就緒。3. 如果設(shè)備未就緒,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簽訂招商合同范本
- 臨時二手物品買賣合同
- 租借模具合同范本
- 高檔房屋買賣合同范本
- 第9課 宋代經(jīng)濟(jì)的發(fā)展(教學(xué)設(shè)計)七年級歷史下冊同步備課系列(部編版)
- 農(nóng)林機(jī)械采購合同
- 抽拉式衣架(教學(xué)設(shè)計)-2023-2024學(xué)年五年級下冊綜合實踐活動遼師大版
- 浙江省人教版八年級歷史與社會上冊教學(xué)設(shè)計4.3.2-北宋與遼、西夏并立
- 第九單元 課題3溶質(zhì)的質(zhì)量分?jǐn)?shù) 教學(xué)設(shè)計-2024-2025學(xué)年九年級化學(xué)人教版下冊
- Unit1 SectionA 1a-2d 教學(xué)設(shè)計 2024-2025學(xué)年人教版英語七年級上冊
- “小學(xué)品德與生活教學(xué)關(guān)鍵問題實踐研究”課題研究中期報告
- 采購入庫單模板
- 教師招聘考試歷年真題(物理)及答案
- GB/T 36800.2-2018塑料熱機(jī)械分析法(TMA)第2部分:線性熱膨脹系數(shù)和玻璃化轉(zhuǎn)變溫度的測定
- GB/T 31989-2015高壓電力用戶用電安全
- GB/T 15566.6-2007公共信息導(dǎo)向系統(tǒng)設(shè)置原則與要求第6部分:醫(yī)療場所
- 火力發(fā)電廠節(jié)能技術(shù)經(jīng)濟(jì)指標(biāo)釋義
- 智能制造知識課件
- 中國音樂學(xué)院:樂理三級筆試試卷(學(xué)生卷)
- 山東省非道路移動源排放監(jiān)管平臺用戶操作手冊
- 醫(yī)療機(jī)構(gòu)維修申請單
評論
0/150
提交評論