驅動 linux裝置驅動 字元裝置驅動開發

2022-05-06 18:03:08 字數 3268 閱讀 7931

preface

前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!

linux

裝置驅動入門篇

》:《linux

裝置驅動掃盲篇》:

fedora下的字元裝置驅動開發》:

開發乙個基本的字元裝置驅動

在linux核心驅動中,字元裝置是最基本的裝置驅動。

字元裝置包括了裝置最基本的操作,如開啟裝置、關閉裝置、i/o控制等。

功能:❶建立乙個名為globalchar的虛擬裝置,裝置內部只有乙個全域性變數供使用者操作。裝置提供了❷讀函式讀取全域性變數的值並且返回給使用者,❸寫函式把使用者設定的值寫入全域性變數。

**如下:

#include #include #include #include module_license("gpl");

module_author("mystery");

#define dev_name "globalchar"

static ssize_t globalread(struct file *, char *, size_t, loff_t *);

static ssize_t globalwrite(struct file *, const char *, size_t, loff_t *);

static int char_major = 0;

static int globaldata = 0; // "globaldata" 裝置的全域性變數

//初始化字元裝置驅動的file_operations結構體

static const struct file_operations globalchar_fops =

; //注意分號啊!!!

//模組初始化函式

static int __init globalchar_init(void)

else

return ret;

}//模組解除安裝函式

static void __exit globalchar_exit(void)

//裝置驅動讀函式

static ssize_t globalread(struct file *filp, char *buf, size_t len, loff_t *off)

return sizeof(int);

}//裝置驅動寫函式

static ssize_t globalwrite(struct file *filp, const char *buf, size_t len, loff_t *off)

return sizeof(int);

}module_init(globalchar_init);

module_exit(globalchar_exit);

在核心中運算元據要區分資料的**,對於使用者空間的資料要使用copy_from_user()函式複製,使用copy_to_user()函式回寫,不能直接操作使用者空間的資料,否則會產生記憶體訪問錯誤。

②編寫makefile

obj-m := globalchardev.o

kdir := /lib/modules/$(shell uname -r)/build

srcpwd := $(shell pwd)

all:

make -c $(kdir) m=$(srcpwd) modules

③編譯並載入核心模組④檢視核心分配的主裝置號

⑤使用mknod命令建立乙個裝置檔案

mknod命令使用-m引數指定globalchar裝置可以被所有使用者訪問。

249即上面查詢的主裝置號。

到這裡,我們就已經正確地新增了乙個字元裝置到核心,下面需要測試一下驅動程式能否正常工作。

測試字元裝置驅動

為了測試編寫的字元裝置是否能正常工作,我們編寫乙個應用程式測試一下能否正常讀寫字元裝置。

測試**:

#include #include #include #include #define dev_name "/dev/globalchar"

int main()

read(fd, &num, sizeof(int));

printf("the globalchar is %d \n", num); //獲取當前裝置數值

printf("please input a number written to globalchar: ");

scanf("%d", &num);

write(fd, &num, sizeof(int)); //寫入新的數值

read(fd, &num, sizeof(int));

printf("the globalchar is %d \n", num); //重新讀取裝置數值

close(fd);

return 0;

}

程式首先使用open函式開啟裝置檔案,然後使用read()函式讀取字元裝置的值,open()系統呼叫最終會被解釋為字元裝置註冊的read呼叫。測試結果:

從程式輸出結果來看,最初從裝置得到的數值是0,輸入520後寫入到字元裝置,重新讀出的數值也是520,與設定相同,表示裝置驅動程式功能正確。

總結

linux字元裝置驅動也不過如此嘛,嘿嘿,雖然只實現了read和write兩個函式,不過其它函式也大同小異。

重點:實踐再實踐!!!

本文出自 「成鵬致遠」 部落格,請務必保留此出處

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...

Linux裝置驅動之字元裝置驅動

一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...

Linux裝置驅動 字元裝置驅動介面函式

核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是register chrdev region alloc chrdev region 和register chrdev 在linux2.6核心以前註冊字元裝置的函式介面是register chrdev,登出字元裝置介面函式是unregiste...