linux驅動--內核和驅動關係

 

關鍵詞: linux驅動,內核

 

 

概述

Linux設備驅動屬於內核的一部分,Linux內核的一個模塊可以以兩種方式被編譯和加

載:

(1)直接編譯進Linux內核,隨同Linux啓動時加載。

(2)編譯成一個可加載和刪除的模塊。

驅動程序向內核添加了一些函數,是內核的一部分。例如Open(), Release(), Read(), Write()。這些函數由內核在適當的時候來調用,可以用來完成硬件訪問等操作。驅動程序佔kernel源代碼超過50%。

內核中printk()函數的設計目的並不是爲了和用戶交流,它實際上是內核的一種日誌機制,用來記錄下日誌信息或者給出警告提示。如果syslogd 和klogd 守護進程在運行的話,則不管是否向控制檯輸出,消息都會被追加進/var/log/messages 文件。klogd只處理內核消息,syslogd 處理其他系統消息,比如應用程序。

Linux內核模塊關係圖

 模塊關係圖

設備驅動的併發控制

自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直循環查看是否該自旋鎖的保持者已經釋放了鎖,“自旋”就是“在原地打轉”。自旋鎖適合於保持時間非常短的情況,它可以在任何上下文使用。

信號量則引起調用者睡眠,它把進程從運行隊列上拖出去,除非獲得鎖。信號量適合於保持時間較長的情況,會只能在進程上下文使用。

 

如果被保護的共享資源需要在中斷上下文訪問(包括底半部即中斷處理句柄和頂半部即軟中斷),就必須使用自旋鎖。

 

設備驅動的內存與IO訪問

         內核虛擬內存映射到連續的物理內存。

 內存映射

CPU 通常並沒有爲這些已知的外設I/O內存資源的物理地址預定義虛擬地址範圍,驅動程序並不能直接通過物理地址訪問I/O 內存資源,而必須將它們映射到核心虛地址空間內(通過頁表),然後才能根據映射所得到的核心虛地址範圍,通過訪內指令訪問這些I/O內存資源。Linux 在io.h 頭文件中聲明瞭函數ioremap(),用來將I/O 內存資源的物理地址映射到核心虛地址空間(3GB-4GB)。

 

         驅動中使用的地址是虛擬地址。外設的IO地址需要映射到虛擬地址。

 

 

 

 

參考資料

Linux設備驅動開發詳解(2)    Linux設備驅動調試、移植  

http://zh.wikipedia.org/zh/Linux%E5%86%85%E6%A0%B8        Linux內核 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章