操作系統--7Linux驅動程序編寫基礎

用戶通過加載內核模塊可以方便地給內核添加功能,也可以通過內核模塊將內核不需要用的功能卸載。

現代的操作系統的內核主要分爲單內核和微內核兩種。單內核操作系統內部可以劃分成層次或模塊,但運行時時一個大的二進制映像,模塊間的交互通過直接調用其他模塊中的函數來實現。微內核操作系統內核中僅包含資源控制與通信功能,其他功能都在內核,由用戶態下運行的服務進程實現,通過微內核提供的消息傳遞機制完成進程之間的通信。

LINUX操作系統是一種單內核結構的操作系統,但是在其基礎上引入了模塊機制,克服了單內核的缺點,一定程度上解決了單內核功能的適應性、靈活性和可伸縮性問題。

Linux提供的模塊機制的完整叫法是動態可加載內核模塊(LKM),一般簡稱爲內核模塊或模塊。內核模塊是一個目標文件,其代碼可以在運行時鏈接到內核或從內核中解除鏈接。利用內核模塊的主要優點如下:

1)模塊化方法

2)平臺無關性

3)節省內存使用

4)無性能損失

內核在管理內核模塊時,主要有兩個任務一是符號表管理,二是維護內核模塊引用計數。

內核提供了init_module()和delete_module()兩個系統調用實現內核模塊的動態安裝和卸載。LINUX系統限制只包含CAP_SYS_MODULE權限的用戶才能對內核模塊進行安裝和卸載。linux系統也提供了insmod、rmmod和modprope三個命令行工具供用戶在命令行下對內核模塊進行操作。

7.3中斷服務例程

驅動程序可以採用兩種方式等待外設完成操作。一種是查詢方式,驅動程序在提交命令後就開始查詢設備的狀態寄存器,當狀態寄存器表明操作完成時,驅動程序才繼續後續的處理。另一種是利用中斷,驅動程序提交命令後立即進入休眠狀態,設備結束操作之後,產生中斷信號,操作系統則根據設備的中斷信號負責喚醒驅動程序。

在LINUX中,多個設備可以共享同一個中斷。對於一箇中斷,內核維護了一箇中斷服務例程(ISR)的鏈表。當中斷到來時,該中斷的每一箇中斷服務例程都會被一次調用。內核允許設備驅動將自己的中斷服務例程插入響應中斷的隊列。

7.3.1概述

由於受中斷向量數量較少的硬件限制,不能給每一個外設分配一根單獨的中斷號。爲了解決這個問題,一些外設必須共享同一個中斷號。共享同一個中斷號的多個外設發出的中斷信號是相同的。當共享中斷號的任何一個外設產生中斷,處理器都會轉跳到同一個中斷處理程序。爲了使每個設備能夠有獨立的中斷處理程序,LINUX引入了中斷服務例程的概念。

中斷處理程序與中斷服務例程是兩個不同的概念。

中斷處理程序相當於某個中斷的總處理程序,並不服務於任何特定的設備。當發生中斷後,中斷處理程序的主要工作是做一些通用的現場保護,並把該中斷所包含的所有的ISR依次運行一遍。

中斷服務例程:ISR是爲某一個具體設備服務的程序。每個外設都有各自的ISR與之對應。

爲了使整個中斷處理過程的時間儘可能縮短,每一個ISR被運行時,ISR要檢測該中斷是不是由ISR所對應設備發出的,如果不是,ISR應立即退出。

7.4上半部和下半部

當中斷髮生時,中斷服務例程被串行化執行。爲了提高內核處理中斷的吞吐量,提高內核的響應速度,把中斷服務例程分成上半部和下半部。上半部會立即被內核執行下半部分會被推遲執行。下半部的執行並不需要指明一個確切的時間,只要把這些任務推遲,讓它們在系統不太繁忙併且中斷恢復後執行就可以。

LINUX提供的下半部實現機制主要有軟中斷、tasklet和工作隊列軟中斷只能被靜態定義,執行的速度快,一般用於對時間要求非常嚴格的場合;tasklet是下半部處理的首選機制,能夠動態被創建,但它在執行過程中不能睡眠工作隊列在一個內核線程的上下文中執行,在工作隊列中的任務是能夠睡眠的,並且工作隊列中的任務還可以在指定延時後才被執行。

————————————————————————————————————

系統調用是操作系統內核和應用程序之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接口。設備驅動程序的本質是實現邏輯設備到物理設備的轉換,啓動相應的I/O設備,發出I/O命令,完成相應的I/O操作,它是內核與外圍設備數據交流的核心代碼。在應用程序看來,硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。

LINUX2.6內核開發了全新的設備模型,採用sysfs文件系統,該文件系統類似proc文件系統的特殊文件系統,用於將系統中的設備組織成層次結構,並向用戶模式程序提供詳細的內核數據結構信息。

LINUX2.6引入新的設備管理機制kobject,通過這個數據結構使所有設備在底層都具有統一接口,提供基本的對象管理,是構成linux2.6設備模型的核心機構,與sysfs文件系統緊密關聯,每個在內核中註冊的kobject對象都對應於sysfs文件系統中的一個目錄。

LINUX中的任一設備在設備模型中都有一個device對象描述,對應數據結構struct device.

系統中的每個驅動程序都由一個device_driver對象描述,對應的數據結構使struct device_driver.


發佈了27 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章