編輯:關於android開發
從上到下,一個軟件系統可以分為:應用程序、庫、操作系統(內核)、驅動程序。開發人員可以專注於自己熟悉的部分,對於相鄰層,只需要了解它的接口,無需關注它的實現細節。以點亮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等)、數據庫,還有應用程序的啟動代碼等。 在異常處理函數中,內核會根據傳入的參數執行各種操作,比如根據設備文件名找到對應的驅動程序,調用驅動程序的相關函數等。
盡管Linux驅動直接與硬件打交道,但並不是Linux驅動直接向硬件中的內存寫數據,而是與本機的I/O內存(I/O Memory,位於內核空間)進行交互。所謂I/O內存是通過各種借口(PCI、USB、藍牙、以太網口等)連接到主機(PC、手機)的硬件(網卡、聲卡、攝像頭等)
在主機內存中的映射。 例如,在Ubuntu Linux上運行的驅動只需要訪問運行Ubuntu Linux的主機中的I/O內存即可,然後Linux內核會利用I/O內存中的數據硬件交互。
Linux內核提供了多個與I/O內存交互的函數,如ioread16,ioread32,iowrite16,iowrite32等。Linux內核的內存管理模塊負責同步I/O內存與硬件中的數據。原理如圖:
每一個連接Linux的硬件在I/O內存中都會有映射首地址。在使用ioread32、iowrite32等函數讀寫I/O內存是需要指定這些首地址。開發板上的LED也有其映射首地址。
春秋旅行安卓客戶端源碼項目,旅行安卓客戶端源碼春秋旅行安卓客戶端源碼,這是一款高度模仿春秋旅行app開發的一款應用,通過抓包工具獲取到的接口,希望大家能夠喜歡,並且對大家
Android--Dialog對話框 在Android開發當中,在界面上彈出一個Dialog對話框使我們經常需要做的,本篇做一下記錄,以備遺忘時查詢。 dialog就
【React Native開發】React Native控件之DrawerLayoutAndroid抽屜導航切換組件講解(13) (一)前言 今天我們一起來看一下抽屜
Android(Java)控制GPIO的方法及耗時分析,androidgpio 前面兩篇分別介紹了通過腳本和C代碼讀寫/sys/class/gpio以控制GPIO。實際