姜遠志
摘 要:本文分析了linux下的驅動開發,對原理進行了分析,詳細描述了IO結構,并對填充實例進行了詳細分析。
關鍵詞:嵌入式;系統開發;驅動
Linux由于具有內核強大且穩定,易于擴展和裁減,效率高,豐富的硬件支持等許多優點,在嵌人式系統中得到了廣泛的應用。本文基于嵌人式操作系統下設備驅動程序的開發需要,闡述相關技術原理及設計要點,探求嵌人式Linux系統中設備驅動程序的構建方法。
1 嵌入式Linux系統驅動
嵌入式Linux系統中的設備驅動程序和Linux中的大多數驅動程序一樣,也是采用層次型的體系結構。編寫設備驅動程序,其主要工作就是編寫子函數,并填充file_operations的各個域。Linux的設備驅動程序模塊按照方式編譯可以分為兩類。
一類是靜態鏈接的設備驅動程序模塊,這類模塊在編制完成后要與內核一起編譯,其與內核是不可分割的整體,在系統引導時與內核一起加載并駐留內存。
另一類設備驅動程序采用可動態加載的模塊。其驅動程序代碼在使用之前動態地加載到內存中,在設備使用完畢后即從內存中移去其代碼。
嵌入式Linux系統往往應用環境相對固定,系統都經過優化,盡可能地精簡。嵌入式Linux系統不能夠像桌面Linux那樣靈活地使用insmod/rmmod加載卸載設備驅動程序。從嵌入式系統的整體性能考慮,采用靜態鏈接模塊能夠使得整個系統的性能得到提高。許多廣泛應用的嵌入式Linux系統都采用靜態鏈接的設備驅動程序模塊。
2 驅動程序原理
編寫設備驅動程序的原理即基于I/O設備管理采用的分層模型,l/O設備管理軟件位于內核中的最底層,設備驅動程序是操作系統內核和機器硬件之間的接El,設備驅動程序為應用程序屏蔽了硬件的細節。硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。
⑴工作原理。作為內核的一部分,設備驅動程序完成對設備初始化和釋放、把數據從內核傳送到硬件和從硬件讀取數據、讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據和檢測處理設備出現的錯誤的功能。Linux設備主要分兩類:字符設備和塊設備,其主要區別是:在對字符設備發出讀/寫請求時,實際的硬件1/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作為高速緩存,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的l/O操作。
⑵I/O接口。邏輯l/O層通過內核定義的兩個數據結構塊設備轉換表(blkdevs)和字符設備轉換表(chrdevs)來實現與設備驅動程序的接口。每個設備驅動程序在設備轉換表中占據一個表項。每個Linux設備文件都有兩個設備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個設備驅動程序的不同的硬件設備。用戶進程利用系統調用在對設備文件進行read/write等各種操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然后讀取數據結構相應的函數指針,接著把控制權交給函數。
3 實例分析
編寫設備驅動程序的主要工作就是編寫子函數,并填充file_operations的各個域,以下為驅動程序test.c的主要內容。函數read_test()是為read調用準備的。當調用read時,read_test()被調用,它把用戶的緩沖區全部寫1。函數中的bur是read調用的一個參數,是用戶進程空間的一個地址。但是在read_test()被調用時,系統進入核心態,所以不能使用bur這個地址,必須用put_user(),這是kernel提供的一個函數,用于向用戶傳送數據。
unsigned int test_major = 0;
static int read_test(struct inode* node, struct file *file, char *bur, int count)
{ int left;
if(verify_area(VERIFY_WRITE, bur, count) = = -EFAULT )
return –EFAULT;
for(1eft = count; left > 0; left--)
{ __put_user(1, bur, 1);
bur ;}
return count;}
以下是驅動程序下半部分的其他幾個函數。
static int write_tibet(struct inode inode, struct file *file, const char *bur, int count)
{return count;}
static int open_tibet(struct inode *inode, struct file *file)
{MOD-INC-USE-COUNT;
return 0;}
static void release_tibet(struct inode *inode, struct file *file)
{MOD-DEC-USE-COUNT;}
4 總結
論文對linux的驅動開發進行了分析,指出了其開發原理以及加載方式的分類,并且以實例進行了說明。
[參考文獻]
[1]周明德.UNIX/Linux內核[M].北京:清華大學出版社,2004.
[2]倪繼利.Linux內核分析及編程[M].北京:電子工業出版社,2005.1.