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個噴水裝...