驅動程式編寫基本流程:
1.首先是一些版本資訊,沒什麼用,但是不能少
#define __NO_VERSION__
#include <linux/modules.h>
#include <linux/version.h>
char kernel_version[] = UTS_RELEASE;
2.為了把系統調用和驅動程式關聯起來,需要一個非常關鍵的資料結構:struct file_operations。file_operations結構的每一個成員的名字都對應著一個系統調用。使用者進程利用系統調用在對裝置檔案進行諸如read/write操作時,系統調用通過裝置檔案的主裝置號找到相應的裝置驅動程式,然後讀取這個資料結構相應的函數指標,接著把控制權交給該函數。這是linux的裝置驅動程式工作的基本原理。編寫裝置驅動程式的主要工作就是編寫子函數,並填充file_operations的各個域
3.簡單驅動程式的編寫(test.c):
a.包含一些基本的標頭檔。
b.編寫一些功能函數,比如read(),write()等。這些函數被調用時系統進入核心態。
c.定義struct file_operations結構的對象,填充結構體。結構體中功能的順序不能改變,若一些功能沒有實現就用NULL填充,已經實現的功能如read()、write()分別添加到對應的位置。這步實現的是函數的註冊。到這裡驅動程式的主體可以說是寫好了。現在需要把驅動程式嵌入核心。
d.註冊裝置驅動程式,使用register_chrdev註冊字元型裝置。函數原型為:
int register_chrdev(0, "test_name", &test_file_operations)
函數返回主裝置號,若註冊成功傳回值大於0。
第一個參數:主裝置號。第二個參數:註冊的裝置名稱。第三個參數:結構體名(裝置相關操作方式,驅動程式實際執行操作的函數的指標)。
這個函數由int init_module(void)函數調用,這個函數在系統啟動時註冊到核心時調用。
e.在用rmmod卸載模組時,cleanup_module函數被調用,它釋放字元裝置test在系統字元裝置表中佔有的表項。
void cleanup_module(void)
{
unregister_chrdev(test_major, "test");
}
到這裡test.c基本就編寫完成了。一個簡單的字元裝置可以說寫好了。