應用程式開發人員不應去關心硬體,不應去看電路是怎麼構造的,這是不合理的,那我們要做什麼?寫應用程式的人直接去用:open ,read,write,ioctl等等這些標準的介面來呼叫我們的驅動程式。於是:
在應用程式裡有open
,在驅動程式裡也有對應的
dev_open;
在應用程式裡有,read
,在驅動程式裡也有對應的
dev_,read;
在應用程式裡有write
,在驅動程式裡也有對應的
dev_write;
在應用程式裡有ioctl
,在驅動程式裡也有對應的
dev_ioctl;
這是最簡單的一種對應方法。最終應用程式怎麼調到驅動程式中的dev_open
,dev_,read
,dev_write
,dev_ioctl
等,中間有哪些東西,首先我們寫乙個應用程式:
int main()
int fd1,fd2;
int val = 1;
fd1 = open("/dev/led", o_rdwr);
write(fd1,&val,4);
fd2 = open("hello.txt", o_rdwr);
write(fd2,&val,4);
這個應用程式裡的open ,write
不是我們實現的,是
c庫實現的。它們一樣屬於應用層。當我們的應用程式呼叫
open,read,write
這些系統呼叫介面的時候,它會進入核心,驅動程式也屬於核心的一部分,
c庫怎麼會進入到核心,
open,read,write
函式實現其實它是通過乙個
swi val
的彙編指令,這個指令會引發乙個異常,相當於中斷一樣。當發生異常的時候就會進入核心的異常處裡函式裡,
(畫乙個核心框圖:應用層,
c庫;係數呼叫介面,
vfs虛擬檔案系統,驅動程式(
led_open,led_read,led_write))
系統呼叫介面做的事情是在異常處裡函式裡面根據發生中斷的原因(
val值)呼叫不同的處裡函式。比如使用
open
時傳入的是
val1,
使用read
時傳入的是
val2,
使用write
時傳入的是
val3,
核心系統呼叫介面就會根據傳入的
val值去呼叫(
vfs)驅動程式。
驅動程式框架:
first_drv.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
(1)只寫
open
和write
函式:
static int first_drv_open(struct inode *inode,struct file *file)
printk("first_drv_open\n");
return 0;
static ssize_t first-drv_write(stuct file *file,const char __user *buf , size_t count, loff_t *poss)
printk("first_drv_write\n");
return 0;
(2)函式寫出來了,怎麼告訴核心(為什麼要告訴核心,就是讓核心找到驅動程式函式):
定義乙個file_oprations
結構並填充它。
static stuct file_oprations first_drv_fops =
else
printk("first_drv_write\n");
return 0;
static stuct file_oprations first_drv_fops = ;
printf 與
printk
的區別:
printf()是在應用程式裡使用;
printk()是在驅動程式(核心模組)裡應用;另外還有優先順序。
例: printk(
kern_emerg"hello, mini2440 module is installed !\n");
核心列印:控制台優先順序配置
/proc/sys/kernel/printk
6 4 1 7
. console_loglevel
.default_message_loglevel
.minimum_console_level
.default_console_loglevel
優先順序控制列印,列印不到螢幕上,在其它地方會有列印,
如vi /var/log/messages
printk有
8個優先順序:
「< 0 >
」 kern_emerg
用於緊急訊息,常常是那些崩潰前的訊息。
「< 1 >
」 kern_alert
需要立刻行動的訊息。
「< 2 >
」 kern_crit
嚴重情況。
「< 3 >
」 kern_err
錯誤情況。
「< 4 >
」 kern_warning
有問題的警告。
「< 5 >
」 kern_notice
正常情況,但是仍然值得注意。
「< 6 >
」 kern_info
資訊型訊息。
「< 7 >
」 kern_debug
用作除錯訊息。
有時會發現printk()
沒有加這個級別,沒有加並不代表沒有級別,沒有指定的優先順序的
printk()
預設使用「
< 4 >
」 kern_warning。
驅動模組安裝與解除安裝:
模組方式:
1)載入:
insmod (insmod hello.ko)
2)解除安裝:
rmmod (rmmod hello)
3)檢視:
lsmod
直接編譯進核心:
1)修改
kconfig ? makefile ?
檔案。
2)進入
make menuconfig
進行配置。
Linux驅動 按鍵驅動
開發板 tiny6410 核心版本 linux2.6.38 要想寫出案件驅動 需要複習的知識 1 混雜裝置的使用原理 2 系統呼叫驅動函式的原理 3 中斷處理機制 4 阻塞性裝置驅動的書寫規範 1 混雜裝置的註冊和使用比較簡單,以前也複習過,這裡不再複習 3 中斷處理機制 也有部落格內容中斷處理機制...
linux 字元驅動驅動
由於沒有經過完整測試 中可能會有不足之出,如有發現還請斧正 這是乙個學文件,所有 僅供學習使用,請勿在生產環境中使用 字元驅動是linux驅動學習的第一站,該 完成了乙個最簡單的字元驅動以及乙個最小化打測試 應用測試 僅做了open的測試 int main int argc,char argv pr...
linux驅動(一) linux驅動框架
編寫linux驅動先看一下驅動框架是什麼樣子的。驅動編寫和應用層編寫有什麼區別呢?一 首先 入口函式的問題。應用層編寫我們的入口就是main函式,但在驅動編寫時不是這樣的,有兩種情況,1 預設情況下 int init init module void 載入模組時的初始化函式,也就是驅動模組的入口函式...