標籤:
從上到下,一個軟體系統可以分為:應用程式、庫、作業系統(核心)、驅動程式。開發人員可以專註於自己熟悉的部分,對於相鄰層,只需要瞭解它的介面,無需關注它的實現細節。以點亮LED為例,這4層軟體的協作關係如下:
1、應用程式使用庫提供的open函數開啟代表LED的裝置檔案。
2、庫資料open函數傳入的參數執行“swi”指令,這條指令會引起CPU異常,進入核心。
3、核心的異常處理函數根據這些參數找到相應的驅動程式,返回一個檔案控制代碼給庫,進而返回給應用程式。
4、應用程式得到檔案控制代碼後,使用庫提供的write或ioclt函數發出的控制命令。
5、庫根據write或ioclt函數傳入的參數執行“swi”指令,這條指令會引起異常,進入核心。
6、核心的異常處理函數根據這些參數調用驅動程式的相關函數,點亮LED。
7、庫(比如glibc)給應用程式提供的open、read、write、ioctl、mmap等介面函數被稱為系統調用,它們都是設定好相關寄存器後,執行某條指令引發異常進入核心。對於ARM架構的 CPU,這條指令為swi。除系統調用介面外,庫還提供其他函數,比如字串處理函數(strepy、strcmp等)、輸入/輸出函數(scanf、printf等)、資料庫,還有應用程式的啟動代碼等。 在異常處理函數中,核心會根據傳入的參數執行各種操作,比如根據裝置檔案名稱找到對應的驅動程式,調用驅動程式的相關函數等。
LED驅動的實現原理
儘管Linux驅動直接與硬體打交道,但並不是Linux驅動直接向硬體中的記憶體寫資料,而是與原生I/O記憶體(I/O Memory,位於核心空間)進行互動。所謂I/O記憶體是通過各種借口(PCI、USB、藍芽、乙太網路口等)串連到主機(PC、手機)的硬體(網卡、音效卡、網路攝影機等)
在主機記憶體中的映射。 例如,在Ubuntu Linux上啟動並執行驅動只需要訪問運行Ubuntu Linux的主機中的I/O記憶體即可,然後Linux核心會利用I/O記憶體中的資料硬體互動。
Android深度探索第七章心得