Linux misc裝置(一)misc驅動框架

2022-08-28 12:54:20 字數 2268 閱讀 7541

copy from : 

文章目錄

linux misc裝置(一)misc驅動框架

一、misc簡介

二、misc驅動框架

三、misc原始碼剖析

四、misc裝置例項驅動編寫模板

一、misc簡介

linux的驅動設計是趨向於分層的,大多數裝置都有自己歸屬的型別,例如按鍵、觸控螢幕屬於輸入裝置,linux有乙個input子系統框架。但是對於adc、蜂鳴器等裝置,無法明確其屬於什麼型別,對於這種裝置一般推薦使用misc驅動框架編寫驅動程式

misc裝置也是乙個字元裝置,在misc的初始化函式中註冊了乙個字元裝置,主裝置號為misc_major (10)

這個字元裝置並不是具體的misc裝置例項的實現,只是misc核心層用來將應用層的操作**到具體的misc例項中

在編寫misc裝置驅動例項時,通過misc_register()向misc核心層註冊乙個字元裝置,在此函式中完成了生成裝置節點、動態獲取次裝置號的動作

二、misc驅動框架

misc裝置例項表明乙個具體的驅動程式(例如adc、蜂鳴器),每乙個misc裝置例項都有對應得次裝置號和相應驅動程式實現的檔案操作集

misc裝置例項驅動通過misc_register向misc核心層註冊misc裝置,所有的misc的主裝置號都是(misc_major),misc核心為註冊的misc裝置維護乙個雙向鍊錶,如下圖所示

當應用層通過open開啟裝置節點時,核心會為開啟的裝置檔案建立乙個struct file物件

然後呼叫到misc核心層的cdev的open函式,在cdev的open函式中,從misc維護的misc裝置鍊錶中,根據次裝置號找到對應的misc裝置例項,將struct file物件中的檔案操作集合更改為misc裝置例項的檔案操作集合,然後呼叫misc裝置例項的open函式,如下圖所示

之後應用層通過read、ioctl等來操作裝置檔案,都會呼叫對應的struct file物件中的檔案操作集合,進而操作具體的misc例項,如下圖所示

以上就是misc裝置的驅動框架

三、misc原始碼剖析

在核心檔案drivers\char\misc.c中時misc驅動核心的實現,下面詳細剖析這個原始碼

首先看驅動的入口

static struct class *misc_class;

static const struct file_operations misc_fops = ;

static int __init misc_init(void)

首先建立misc類,這將給misc裝置例項生成裝置節點時使用

然後註冊字元裝置,可以看到misc_fops中只實現了open函式,此函式是用於**系統呼叫到具體的misc裝置例項中,是misc驅動框架的核心

再來看註冊函式misc_register

int misc_register(struct miscdevice * misc)

可以看到註冊函式會分配乙個次裝置號,然後生成裝置節點,再將misc裝置新增到鍊錶中

接下來分析misc_open

static int misc_open(struct inode * inode, struct file * file)

}/* 將file物件的fops設定為misc例項的fops */

file->f_op = new_fops;

}從上面**中可以看到,首先從misc裝置鍊錶中找到misc裝置例項,然後將file對應得fops設定為misc裝置例項對應的fops,其中file是核心為每個開啟檔案建立的乙個物件

之後應用層再進行系統呼叫,都會呼叫到misc裝置例項

四、misc裝置例項驅動編寫模板

如何基於misc寫乙個裝置驅動非常簡單,下面給出乙個模板

static int buzzer_open(struct inode *inode, struct file *file)

static int buzzer_close(struct inode *inode, struct file *file)

static int buzzer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

static struct file_operations buzzer_fops = ;

static struct miscdevice buzzer_dev = ;

static int __init buzzer_init(void)

static void __exit buzzer_exit(void)

記一次Redis bitmap導致的miss問題

redis bitmaps 基礎概念 redis 記憶體淘汰機制 大致需求 指令碼批量匯入使用者資料到redis中,使用bitmap標記使用者是否在匯入的白名單中。使用者量級 億。key使用了分片處理,把key分成了10w個,每個key占用 1億 10w 1000 個bit。理想是key1用於標記u...

開始單位專案 乙個MIS系統 記錄日誌

專案經理搭建了乙個svn伺服器,自己只需安裝乙個svn客戶端就可以檢視svn伺服器上的文件了.另外,如果要參加開發,只需更新eclipse中的外掛程式 具體的鏈結見 其他安裝軟體的版本 mysql 5.1.41 win32.msi,sqlyog enterprise 此客戶端對中文支援較好,所以選擇...

噴水裝置(一)

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0 輸入 第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共有n個噴水裝...