Linux驅動包含三種:字符設備驅動、塊設備驅動、網絡設備驅動。理解和掌握字符設備驅動是更重要的 linux
學習編寫驅動須要:
程序員
• 學會查看開發板原理圖
• 學會查看處理器的數據手冊(datasheet)
• 對外部設備操做的步驟(三部曲)
– 經過原理圖找到設備鏈接的PIN腳
– 根據該PIN腳找到控制這個引腳的相關寄存器,並找到寄存器對應的物理地址
– 最後,經過編寫程序來實現對該設備的操做
編程
好比led0的管腳在底板中叫KP_COL0,對應到核心板管腳叫KP_COL0,對應帶4412管腳是AA4(GPL2_0)安全
而後相關的寄存器有GPL2CON、GPL2DAT、GPL2PUD、GPL2DRV、GPL2CONPDN、GPL2PUDPDN。瞭解了寄存器功能,就能夠寫函數對此控制了網絡
嵌入式控制芯片地址的方式:架構
0x11000104 ----比方說有一個地址 unsigned int *pintx; ----定義一個32位的指針地址 pintx = 0x11000104; ----給地址指針賦值 *pintx = 0; ----對地址的內容吸入數據 *((unsigned int *)0x11000104) = 0; ----一樣的能夠直接這樣寫
精簡指令集的指令長度和運行時間都是同樣的。函數
可使一些須要計算機處理的多項操做在時間上重疊進行,便於提升電路的工做頻率性能
• Memory Management Unit(MMU)
• 虛擬地址到物理地址的轉換
– 如何經過物理地址找到虛擬地址呢?(ioremap)
• 輔助實現虛擬內存
• 輔助實現多任務管理
學習
處理器有了MMU,那麼就有了虛擬內存的概念spa
虛擬存儲器的空間大小取決於計算機的訪存能力而不是實際外存的大小。 - 32位 2^32 = 4G
使存儲系統既具備至關於外存的容量又有接近於主存的訪問速度。 - 硬盤 EMMC FLASH
• 頻率
• 性能 (MIPS/MHz)
– ARM7 處理速度爲0.9MIPS/MHz,常見的主時鐘通常爲20MHz-133MHz
– ARM9 處理速度爲1.1MIPS/MHz,常見的主時鐘通常爲100MHz-233MHz
– CORTEX-A9處理速度2.5 MIPS/MHz,主時鐘通常爲1000MHz-1600MHz
• 功耗
• 面積(成本)
• 從程序員的角度分析
– 將linux底層和應用分開,作應用的作應用,作底層的作底層,各幹各的。經濟學的原理是,分工產生效率
• 從安全性的角度分析,爲了保護內核。現代CPU一般都實現了不一樣的
工做模式。以ARM爲例:ARM實現了7種工做模式,不一樣模式下CPU能夠執行的指令或者訪問的寄存器不一樣:
– (1)用戶模式 usr (2)系統模式 sys(3)管理模式 svc(4)快速中斷 fiq(5)外部中斷 irq(6)數據訪問終止 abt(7)未定義指令異常
– 以(2)X86爲例:X86實現了4個不一樣級別的權限,Ring0—Ring3 ;Ring0下能夠執行特權指令,能夠訪問IO設備;Ring3則有不少的限制
– 以Android爲例:將應用放到Java虛擬機上面運行,應用更加遠離底層
• 用戶空間和內核空間是程序執行的兩種不一樣狀態,咱們能夠經過「系統調用」和「硬件中斷「來完成用戶空間到內核空間的轉移
• System Call Interface (SCI層)
– 爲用戶空間提供了一套標準的系統調用函數來訪問Linux內核。
• Procees Management(PM)
– 進程管理是建立進程(fork、exec),中止進程(kill、exit),並控制他們之間的通訊(signal等)。還包括進程調度,控制活動進程如何共享CPU
• Memory Management(MM)
– 內存管理的主要做用是控制多個進程安全的共享內存區域
• Virtual File Systems(VFS)
– 虛擬文件系統,隱藏各類文件系統的具體細節,爲文件操做提供統一的接口
– Linux提供了一個大的通用模型,使這個模型包含了全部文件系統功能的集合(一切皆文件)
• Device Drivers設備驅動
– Linux內核中有大量的代碼在設備驅動程序部分,用於控制特定的硬件設備。
– Linux驅動通常分爲網絡設備、塊設備、字符設備、雜項設備
• 網絡協議棧
– 內核網絡協議棧爲Linux提供了豐富的網絡協議實現。
• arch目錄
– arch目錄是平臺目錄。內核支持的全部CPU架構,在該目錄下都有對應的子目錄。每一個CPU的子目錄,又進一步分解爲boot,mm,kernel等子目錄,分別控制系統引導,內存管理,系統調用。還有動態調頻,主頻率設置部分等
• Linux很複雜,很強大。
– 內核源碼解壓編譯後有1.3G,經過裁減編譯出的linux鏡像zImage不到4M
– 4M源碼鏡像中,還有大部分不用咱們關心
– 咱們只須要了解對寫代碼有幫助的部分,掌握咱們須要掌握的代碼
– 前面Linux代碼中只有紅色標記的一部分是須要了解或者掌握的
• 做爲開發者只須要學會使用它,咱們要重點學習只是其中很小的一部分。
– 對架構有必定的瞭解便可
– 學習的重點是驅動開發相關的知識、函數的調用、驅動的協議、簡單的硬件知識