這是乙個簡單的字元驅動程式,在初始化和退出的時候顯示一段話
#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...