歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux驅動程序與應用程序函數的聯系

Linux驅動程序與應用程序函數的聯系

日期:2017/2/28 16:24:52   编辑:Linux教程

Linux下我們在使用設備的時候,都會用到write這個函數,通過這個函數我們可以象使用文件那樣向設備傳送數據。可是為什麼用戶使用write函數就可以把數據寫到設備裡面去,這個過程到底是怎麼實現的呢?

這個奧秘就在於設備驅動程序的write實現中,這裡我結合一些源代碼來解釋如何使得一個簡簡單單的write函數能夠完成向設備裡面寫數據的復雜過程。

這裡的源代碼主要來自兩個地方。第一是oreilly出版的《Linux device driver》中的實例,第二是Linux Kernel 2.2.14核心源代碼。我只列出了其中相關部分的內容,如果讀者有興趣,也可以查閱其它源代碼。不過我不是在講解如何編寫設備驅動程序,所以不會對每一個細節都進行說明,再說有些地方我覺得自己還沒有吃透。

由於《Linux device driver》一書中的例子對於我們還是復雜了一些,www.linuxidc.com我將其中的一個例程簡化了一下。這個驅動程序支持這樣一個設備:核心空間中的一個長度為10的數組kbuf[10]。我們可以通過用戶程序open它,read它,write它,close它。這個設備的名字我稱為short_t。

現在言歸正傳。

對於一個設備,它可以在/dev下面存在一個對應的邏輯設備節點,這個節點以文件的形式存在,但它不是普通意義上的文件,它是設備文件,更確切的說,它是設備節點。這個節點是通過mknod命令建立的,其中指定了主設備號和次設備號。主設備號表明了某一類設備,一般對應著確定的驅動程序;次設備號一般是區分是標明不同屬性,例如不同的使用方法,不同的位置,不同的操作。這個設備號是從/proc/devices文件中獲得的,所以一般是先有驅動程序在內核中,才有設備節點在目錄中。這個設備號(特指主設備號)的主要作用,就是聲明設備所使用的驅動程序。驅動程序和設備號是一一對應的,當你打開一個設備文件時,操作系統就已經知道這個設備所對應的驅動程序是哪一個了。這個"知道"的過程後面就講。

我們再說說驅動程序的基本結構吧。這裡我只介紹動態模塊型驅動程序(就是我們使用insmod加載到核心中並使用rmmod卸載的那種),因為我只熟悉這種結構。

模塊化的驅動程序由兩個函數是固定的:int init_module(void) ;void

cleanup_module(void)。前者在insmod的時候執行,後者在rmmod的時候執行。

init_nodule在執行的時候,進行一些驅動程序初始化的工作,其中最主要的工作有三件:注冊設備;申請I/O端口地址范圍;申請中斷IRQ。這裡和我們想知道的事情相關的只有注冊設備。

Copyright © Linux教程網 All Rights Reserved