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

2021-06-20 22:00:23 字數 2170 閱讀 2253

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

unsigned int (*poll) (struct file *, struct poll_table_struct *);

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

驅動程式poll實現方法:

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

1、使用poll_wait將等待佇列新增到poll_table中

2、返回描述裝置是否可讀或可寫的掩碼

位掩碼:

pollin 裝置可讀

pollrdnorm 資料可讀

pollout 裝置可寫

pollwrnorm 資料可寫

裝置可讀通常返回(pollin|pollrdnorm)

裝置可寫通常返回(pollout|pollwrnonrm

需要注意的是poll_wait函式不會像它名字一樣處於wait狀態,僅供上層查詢之用。其程式設計基本框架也比較固定,現修改******等待佇列驅動之中如下:

unsigned int ******_poll (struct file * filp, struct poll_table_struct * wait)

return mask;

}#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

dev_t devno;

struct class * ******_class;

static struct cdev cdev;

wait_queue_head_t ******_queue;

char test_data[255];

int len = 0;

unsigned int ******_poll (struct file * filp, struct poll_table_struct * wait)

return mask;

}ssize_t ******_read(struct file * pfile,

char __user * buf, size_t size, loff_t * ppos)

ssize_t ******_write(struct file * pfile, const char __user * buf, size_t count, loff_t * ppos)

if (!copy_from_user(test_data, buf, count))

return len;

}int ******_open(struct inode * pnode, struct file * pfile)

int ******_release(struct inode * pnode, struct file * pfile)

static struct file_operations ******_op = 

;static int __init initialization(void)

static void __exit cleanup(void)

module_init(initialization);

module_exit(cleanup);

module_author("alloc [email protected]");

module_description("a ****** linux kernel module");

module_version("v0.1");

module_license("dual bsd/gpl");

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

一 開發環境 1 核心 linux 2.6.22.6 2 jz2440 3 ubuntu 9.10 二 poll增加過程 poll就是監控檔案是否可讀的一種機制,作用與select一樣。應用程式的呼叫函式如下 int poll struct pollfd fds,nfds t nfds,int ti...

poll函式 Linux驅動基石之POLL機制

在前面引入中斷時,我們曾經舉過乙個例子 媽媽怎麼知道臥室裡小孩醒了?時不時進房間看一下 查詢方式 簡單,但是累 進去房間陪小孩一起睡覺,小孩醒了會吵醒她 休眠 喚醒 不累,但是媽媽幹不了活了 媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘 poll方式 要浪費點時間,但是可以繼續幹活。媽媽要麼是被小...

Linux裝置輪詢機制分析

所謂的裝置輪詢機制實際上就是利用網絡卡驅動程式提供的napi機制加快網絡卡處理資料報的速度,因為在大流量的網路環境當中,標準的網絡卡中斷加上逐層的資料拷貝和系統呼叫會占用大量的cpu資源,而真正用於處理這些資料的資源卻很少。乙個基本的想法是對於大流量網路,如果發現乙個dma傳輸中斷 這表明乙個網路資...