編寫字元裝置驅動遇到的問題

2021-05-24 15:27:41 字數 1431 閱讀 1988

這是乙個簡單的字元驅動程式,在初始化和退出的時候顯示一段話

#ifndef __kernel__

#define __kernel__

#endif

#ifndef module

#define module

#endif

#include

#include

#include

static int __init hello_init(void)

printk("hello world!/n");

return 0;

void __exit hello_exit(void)

printk("bye!/n");

module_init(hello_init);

module_exit(hello_exit);

module_license("gpl");

以下是我寫的makefile

ifneq ($(kernelrelease),)

obj-m:=test.o

else

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

pwd:=$(shell pwd)

default:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -rf *.o *.mod.c *.mod.o *.ko

endif

我make出test.ko檔案 然後sudo insmod test.ko 載入驅動,之後在/dev檔案下面用sudo mknod test c 254 0   ,來建立節點,這樣驅動就載入好了,但後寫乙個簡單到不能再簡單的測試程式

#include

#include

#include

#include

#include

int main()

int fd;

if((fd=open("/dev/test",o_rdwr))==-1)

else

printf("fail!/n");

但是最後執行的結果卻是這樣

dickens@ubuntu:~/123$ ./tmp

opened!

就是說只列印出了測試程式中的話,按道理裝置已經開啟了,也就應該執行初始化程式中的那個printk但是實際沒有,這是怎麼回事?!

***********************************給力的分割線***********************************===

問題解決了,是這樣的

驅動列印了。只有在字元模式下才能看到這個。進入圖形介面,是看不到這個列印語句的

要用dmesg看才行,printk不能輸出到使用者空間,如果要的話應該是copy_to_user

字元裝置驅動編寫步驟

1.標準字元裝置驅動 a.註冊裝置號 如 if key major 靜態註冊 err register chrdev region devno,1,device name else b.記憶體申請給cdev 當cdev定義為指標時 然後呼叫以下函式進行裝置初始化並新增該裝置 void cdev in...

字元裝置驅動編寫步驟

1.標準字元裝置驅動 a.註冊裝置號 如 if key major 靜態註冊 err register chrdev region devno,1,device name else b.記憶體申請給cdev 當cdev定義為指標時 然後呼叫以下函式進行裝置初始化並新增該裝置 void cdev in...

字元裝置驅動編寫方法

字元裝置驅動編寫方法 1.標準字元裝置驅動 a.註冊裝置號 如 if key major 靜態註冊 err register chrdev region devno,1,device name else b.記憶體申請給cdev 當cdev定義為指標時 然後呼叫以下函式進行裝置初始化並新增該裝置 v...