linux驅動文件

2021-06-06 17:55:29 字數 3390 閱讀 6110

應用程式開發人員不應去關心硬體,不應去看電路是怎麼構造的,這是不合理的,那我們要做什麼?寫應用程式的人直接去用: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 載入模組時的初始化函式,也就是驅動模組的入口函式...