Linux核心驅動之自動建立裝置檔案

2021-07-04 02:54:43 字數 2767 閱讀 3111

裝置檔案是非常重要的檔案,是應用程式與裝置驅動交換資料,控制硬體的橋梁。在驅動程式中open、release的實現過程中其中的乙個引數struct inode實質就是裝置檔案的索引,沒有這個索引也就沒有後期的各種操作,通常裝置檔案也被稱為裝置檔案節點。因此沒有裝置檔案後期的各種實現都是多餘的。

裝置檔案的建立有兩種方法,其中就是在建立檔案系統過程中用到的mknod命令。該命令的形式如下:

mknod filename (type

,c,b,l) 主裝置號 次裝置號

其中type說明是那一類裝置(字元裝置c,塊裝置b,套接字l),主裝置號用來確定那一類裝置,而次裝置號主要用來確定這一類裝置中的某乙個裝置。

例如:mknod memdev0 c 555 0 就是建立了乙個主裝置號為555,次裝置號為0的字元裝置。

這種方法比較快速,但是在編寫裝置驅動的時候很難確定那個裝置號是可以使用的,因此很不方便開發。在2.4核心中引入了devfs,但是因為效能等方面的原因,在2.6核心中被udev逐漸取代。udev的裝置命名策略、許可權控制和事件處理都是在使用者態下完成的,它利用sysfs中的資訊來進行建立裝置檔案節點等工作。其實對於我們寫程式而言並沒有多大的區別,這是核心的設計者考慮的問題。兩個都能夠實現裝置檔案的動態建立,具體的實現方法也很類似。在嵌入式中是採用mdev實現類似udev的動態建立裝置檔案,在製作檔案系統的過程中應該注意在linux system項選上mdev,不過一般預設情況下都選擇上。

在驅動中動態新增裝置檔案節點會減少麻煩。

具體的實現主要包括兩個過程。

1、建立乙個裝置類,主要依據函式class_create()實現。

2、依據裝置類建立乙個裝置檔案,主要依據device_create()

基本的實現過程應該是在裝置驅動初始化過程中首先得到申請到裝置號之後建立乙個裝置類,採用class_create()實現。

class_create(owner, name)

引數的意義:owner是指裝置的擁有者,因此可以直接this_module複製給owner,而name是裝置類的名字。返回值是乙個裝置類的指標。這樣就建立了乙個裝置類。

裝置新增到核心中以後然後根據裝置類要建立裝置檔案,依據device_create實現函式,其中的函式形式如下實現。

struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)

引數的意義分別是裝置類指標、裝置的父裝置,裝置號、以及裝置的資料、然後是裝置檔案的名字,引數具有不定性。

在裝置退出過程中我們當然也要釋放分配好的這些資源。具體的採用device_destroy釋放分配好的裝置檔案,

void device_destroy(

struct class *class, dev_t devt

)引數主要是裝置類和裝置號。

同時也要釋放裝置類。主要採用函式class_destroy()

void class_destroy(

struct class *cls

)引數是裝置類。

/*** 動態建立裝置檔案

* lzy 2012\7\24

*/#include #include #include #include #include #include #include #include "hello.h"

/************************* 裝置號 ******************************/

int mem_major = memdev_major; /* 定義主裝置號 */

module_param(mem_major, int, s_irugo); /* 主裝置號設定為模組引數 */

int mem_minor = memdev_minor; /* 定義次裝置號 */

module_param(mem_minor, int, s_irugo); /* 次裝置號設定為模組引數 */

struct mem_dev *my_devices;

static struct class *myclass;

struct file_operations my_fops =

;/**

* 註冊字元裝置

*/static void mem_init_cdev(struct mem_dev *dev, int index)

static int mem_module_init(void)

else

if(ret < 0) /* 判斷裝置號註冊是否成功 */

/*在裝置號申請完成以後可以為裝置建立乙個裝置類,用於裝置檔案的建立*/

myclass = class_create(this_module,"memdev_class"); // 在/sys/class目錄下生成memdev_class目錄

/****************** 為裝置分配空間 *****************************/

my_devices = kmalloc((memdev_nr_devs * sizeof(struct mem_dev)), gfp_kernel);

if (!my_devices)

memset(my_devices, 0, memdev_nr_devs * sizeof(struct mem_dev));

/************************ 裝置初始化 **************************************/

for(i=0; i

linux字元驅動之自動建立裝置節點

問 能不能讓系統自動建立裝置節點?答 可以,linux有udev mdev的機制,而我們的arm開發板上移植的busybox有mdev機制,那麼就使用mdev機制來自動建立裝置節點。問 檔案系統裡,在 設定了mdev機制?答 在etc init.d rcs檔案裡有一句 echo sbin mdev ...

Linux驅動(三) 完善裝置驅動自動建立裝置號

include include include include include include include argc 應用程式引數個數,包括應用程式本身 ar 具體的引數內容,字串形式 int main int argc,char ar filename ar 1 獲取檔名稱 fd open f...

linux驅動開發之自動建立裝置節點的方法

編譯工具 source insight 4.0 區分上節內容,手動建立裝置節點 mknod 檔名 型別 主裝置號 次裝置號 怎樣檢視系統裝置節點,在project window中查詢major.h就行 自動建立裝置節點的方法 define minorbits20 define minormask 1...