驅動程式架構

 

驅動程式架構

Linux 驅動程式的整體架構如下:

  1. application 透過 system call 介面與 kernel 溝通。
  2. 透過 kernel 的 VFS 層與 Linux 驅動程式物件溝通。
  3. Linux 驅動程式可分為 3 大類型,如下圖綠色部份。
 
Linux 驅動程式可分為 3 大類型
l   character device driver
字符裝置一般是無法隨機定址的,例如:音效卡。但也有可以隨機定址的,只不過存取隨機資料需要的時間,取決於資料在裝置的位址,例如:磁帶機。
l   block device driver
區塊裝置的資料可以隨機定址。傳輸一個資料區塊所需要的時機很短,而且差不多都相同,典型的區塊裝置:硬碟、軟碟、光碟機。
l   network device driver
 
 
驅動程式本身可分成 2 個層面
l virtual device driver
Virtual device driver 的主題重要性大於 physical device driver,如何善用 Linux 所提供的介面 (interface) 來設計驅動程式,並配合 user application 來設計應用程式是這個主題的重點。與 user application 如何互動,是撰寫驅動程式時所要考慮的重要一環,只考量驅動程式本身的設計,而忽略或輕忽 user application 的設計,是錯誤的觀念。
virtual device driver跟 user application有較大的關聯性,往上層支援 Linux kernel 所提供的 Virtual File System 層,並藉此實作 system calls。使用者可透過 system call interface 與 device driver 溝通。Virtual device driver 的目的在於善用 Linux 的 APIs 來設計驅動程式
 
l physical device driver
 
驅動程式 VS 硬體
往下層使用 Linux kernel 所提供的 device interface 來存取並控制實體硬體裝置。
透過 I/O port 或 I/O memory來控制裝置
 
System Call 與驅動程式的關係
System call 是 user application 與 Linux device driver 的溝通介面。
User application 透過呼叫 system call 來「叫起」driver 的 task,user application 要呼叫 system call 必須呼叫 GNU C 所提供的「wrapper function」,每個 system call 都會對應到 driver 內的一個 task,此 task 即是 file_operation 函數指標所指的函數。
Linux 驅動程式與 user application 間的溝通方式是透過 system call,實際上 user application 是以 device file 與裝置驅動程式溝通。要達成此目的,驅動程式必須建構在此「file」之上,因此 Linux 驅動程式必須透過 VFS(virtual file system)層來實作 system call。
一般程式控制 IO的流程:User application -> system call ->wrapper function -> file_operation function -> virtual file system
Device File
Device files 是 UNIX 系統的獨特觀念,在 UNIX 系統底下我們把外部的周邊裝置均視為一個檔案,並透過此檔案與實體硬體溝通,這樣的檔案就叫做 device files,或 special files。
Linux device driver 與 user 的重要溝通橋梁為 device files,在 Linux 系統底下,我們看到的 device files 如圖所示。檔案屬性的第一個位元如果顯示為 “c” 表示這是一個字元型裝置的 device file、若為 “b” 表示這是一個區塊型裝置的Device file。
Device file 的 major number 代表一個特定的裝置,例如 major number 為 1 為 null 虛擬裝置,major number 定義於 kernel 文件目錄 Documentation/devices.txt 。Minor number 代表裝置上的子裝置,例如同一個硬碟上的分割區就用不同的 minor number 來代表,但其 major number 相同。
 
 
 
一般我們使用電腦,總以為這就是應該有的,如USB、鍵盤、滑鼠,似乎都已經習以為常,但卻不知道我們在使用任何程式時,其實電腦不只要在CPU計算指令,還得跟其他裝置通訊,而這通訊的過程,還得要一層一層的往底層走,然後在把資訊一層一層的往上送,這每一層的架構,都需要經過精心的設計,而這每層架構,其實要用到抽象層的方法設計,不然每個設計者都必須考慮上下層的關係,這樣的設計方法在實現上可能有難度。
其實從開始接觸程式到現在,很難得有機會碰到這麼底層的東西,一般最底層就是到kernel而已,這次有機會可以往下接觸到驅動的部分,對於某些硬體架構也有更深一層的了解,借此未來對於驅動以及韌體方面,可能就不再陌生,至少不會再害怕接觸到硬體的部分,真是獲益良多的一次讀書會。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值