linux字元裝置驅動 poll機制筆記

2021-07-27 23:12:52 字數 2236 閱讀 9047

一、開發環境

1、核心:linux

2.6.22.6;

2、jz2440

3、ubuntu 9.10

二、poll增加過程

poll就是監控檔案是否可讀的一種機制,作用與select一樣。

應用程式的呼叫函式如下:

int poll(struct pollfd *fds,nfds_t nfds, int timeout);

poll機制會判斷fds中的檔案是否可讀,如果可讀則會立即返回,返回的值就是可讀fd的數量,如果不可讀,那麼就程序就會休眠timeout這麼長的時間,

然後再來判斷是否有檔案可讀,如果有,返回fd的數量,如果沒有,則返回0。

1、在定義的file_operations型別結構體中增加.poll的支援。即增加.poll=***_poll。***_poll是函式名,可以任意。

2、實現

***_poll

函式。***_poll函式中主要呼叫的函式就是

poll_wait

函式。其原型為:

static inline void 

poll_wait

(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)

這個函式中 p->qproc(filp, wait_address, p);p->qproc在init_poll_funcptr()中被賦值為__poll_wait。即實現__

poll_wait(filp, wait_address, p),__

poll_wait函式實現將當前程序掛到wait_address佇列中。

3、應用呼叫poll函式時,系統會呼叫

fs/select.c檔案中的sys_poll函式,這個函式會呼叫do_sys_poll

函式,do_sys_poll函式會呼叫do_poll函式,在do_poll

函式中有

__timeout = schedule_timeout(__timeout);

這才是真正的休眠函式。

三、poll機制架構

1、系統呼叫poll或select,對應的核心函式都是sys_poll,

sys_poll位於

fs/select.c檔案中。

sys_poll()->

do_sys_poll()->

poll_initwait()      //引數(&table)初始化了table

do_poll()   ->       //引數(nfds, head, &table, timeout)重要的設定、休眠在這裡實現

do_pollfd()       //mask = file->f_op->poll(file, pwait)把寫的驅動函式賦值給poll

schedule_timeout()  // 休眠函式,判斷引數if (count || !*timeout || signal_pending(current))

//不成立則休眠

do_poll函式中有乙個死迴圈,在裡面用do_pollfd函式去呼叫驅動中的poll函式(fds中每個成員的字元驅動程式都會被掃瞄到),驅動程式中的poll函式的工作有兩個,乙個就是呼叫poll_wait 函式,把程序掛到等待佇列中去(這個是必須的,你要睡眠,必須要在乙個等待佇列上面,否則到**去喚醒你呢??),另乙個是確定相關的fd是否有內容可讀,如果可讀,就返回1,否則返回0。如果返回1,do_poll函式中的count++。接下來在do_poll函式中會判斷三個條件(if (count ||!timeout || signal_pending(current))),決定是否跳出死迴圈。如果成立就直接跳出;否則,就睡timeout個jiffes這麼長的時間(呼叫schedule_timeout實現睡眠)。

這三個條件之一就是剛才的count,可見如果相關的

fd可讀,程式就會跳出do_poll函式,停止睡眠。

其他兩個條件:一是,如果在timeout這段時間內沒有其他程序去喚醒它,那麼第二次執行判斷的時候就會跳出死迴圈。二是,如果在這段時間內有其他程序喚醒它,那麼也可以跳出死迴圈返回(例如我們可以利用中斷處理函式去喚醒它,這樣的話一有資料可讀,就可以讓它立即返回)。

可見,驅動程式裡與poll相關的地方有兩處:一是構造file_operation結構時,要定義自己的poll函式。二是通過poll_wait來呼叫上面說到的__pollwait函式,

Linux 裝置驅動poll輪詢程式設計

linux系統下網路模型數select最為常用,當然,select只是檢測檔案系統資料狀態,並不只侷限於網路程式設計,select的功能需要底層驅動提供支援,其中核心應用即為等待佇列,其他模型,如poll和epoll,對驅動來說並無區別,驅動只是返回資料狀態而已。驅動支援select,需要實現fil...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...