第8章 Linux裝置驅動中的阻塞與非阻塞I O

2021-04-25 22:54:22 字數 2226 閱讀 9394

本文摘自(偶有較小改動)《linux 裝置驅動開發詳解》(宋寶華 編著;人民郵電出版社;),留作紀念。

——living park

第8章 linux裝置驅動中的阻塞與非阻塞i/o

8.1 阻塞與非阻塞i/o

阻塞操作是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。

因為阻塞的程序會進入休眠狀態,因此,必須確保有乙個地方能夠喚醒休眠的程序。喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷。

8.1.1

等待佇列

在linux驅動程式中,可以使用等待佇列來實現阻塞程序的喚醒。

操作:1. 定義「等待佇列頭」wait_queue_head_t my_queue;

2. 初始化「等待佇列頭」init_waitqueue_head(&my_queue);

declare_wait_queue_head(name) //定義並初始化

3. 定義declare_waitqueue(name,tsk) //定義並初始化

4. 新增/移除void fastcall add_wait_queue(wait_queue_head_t *q,wait_queue_t *wait);

void fastcall remove_wait_queue(wait_queue_head_t *q,wait_queue_t *wait);

5. 等待事件 wait_event(queue,condition)

wait_event_interruptible(queue,condition)

wait_event_timeout(queue,condition,timeout)

wait_event_interruptible_timeout(queue,condition,timeout)

6. 喚醒佇列void wake_up(wait_queue_head_t *queue);

void wake_up_interruptible(wait_queue_head_t *queue);

7. 在等待佇列上睡眠 sleep_on(wait_queue_head_t *queue);

interruptible_sleep_on(wait_queue_head_t *queue);

8.1.2

支援阻塞操作的globalfifo裝置驅動

當多個等待佇列、訊號量等機制同時出現時,謹防死鎖。

8.1.3

在使用者空間驗證globalfifo的讀寫

每當echo程序向/dev/globalfifo寫入一串資料,cat程序就立即將該串資料顯現出來。

8.2 輪詢操作

8.2.1

輪詢的概念與作用

使用非阻塞i/o的應用程式通常會使用select()和poll()系統呼叫查詢是否可對裝置進行無阻塞的訪問。select()和poll()系統呼叫最終會引發裝置驅動中的poll()函式被執行。

select()和poll()系統呼叫的本質一樣,前者在bsd unix中引入,後者在system v中引入。

8.2.2

應用程式中的輪詢程式設計

int select(int numfds,fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);

檔案描述符集合操作:fd_zero(fd_set *set)  fd_set(int fd, fd_set *set)

fd_clr(int fd, fd_set *set)   fd_isset(int fd, fd_set *set)

8.2.3

裝置驅動中的輪詢程式設計

unsigned int (*poll)(struct file *filp, struct poll_table *wait);

void poll_wait(struct file *filp, wait_queue_head_t *queue, struct poll_table *wait);

8.3 支援輪詢操作的globalfifo驅動

8.3.1

在globalfifo驅動中增加輪詢操作

要把globalfifo_poll賦給globalfifo_fops的poll成員。

8.3.2

在使用者空間驗證globalfifo裝置的輪詢

裝置驅動的poll()本身不會阻塞,但是poll()和select()系統呼叫則會阻塞地等待檔案描述符集合中的至少乙個可訪問或超時。

第1章Linux裝置驅動簡介二

1.2 劃分核心 在 unix 系統中,幾個併發的程序專注於不同的任務.每個程序請求系統資源,比如計算能力,記憶體,網路連線,或者一些別的資源.核心是個大塊的可執行檔案,負責處理所有這樣的請求.儘管不同核心任務間的區別常常不是能清楚劃分,核心的角色可以劃分成下列幾個部分 如圖1.1 1 程序管理 核...

蛻變成蝶 Linux裝置驅動中的阻塞和非阻塞I O

今天意外收到乙個訊息,真是驚呆我了,部落格軒給我發了資訊,說是俺的部落格文章有特色可以出本書,這簡直讓我受寵若驚,俺只是個大三的技術宅,寫的部落格也是自己所學的一些見解和在網上看到我一些博文以及帖子裡綜合起來寫的,總之這又給了額外的動力,讓自己繼續前進,希望和大家能夠分享一些自己的經驗,在最需要奮鬥...

第1章 裝置驅動概述

本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第1章 裝置驅動概述 1.1 裝置驅動的作用 沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則是一堆廢鐵。計算機系統的軟硬體互相成就了對方。對裝置驅動最通俗的解釋就是 驅動硬體裝置行動 ...