2010年11月18日 星期四

驅動程式架構(轉)

驅動程式架構

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 個層面
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 來設計驅動程式
 
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計算指令,還得跟其他裝置通訊,而這通訊的過程,還得要一層一層的往底層走,然後在把資訊一層一層的往上送,這每一層的架構,都需要經過精心的設計,而這每層架構,其實要用到抽象層的方法設計,不然每個設計者都必須考慮上下層的關係,這樣的設計方法在實現上可能有難度。

沒有留言: