日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]操作系統(tǒng)是通過(guò)各種驅(qū)動(dòng)程序來(lái)駕馭硬件設(shè)備的,它為用戶屏蔽了各種各樣的設(shè)備,驅(qū)動(dòng)硬件是操作系統(tǒng)最基本的功能,并且提供統(tǒng)一的操作方式。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,硬件驅(qū)動(dòng)程序是操作系統(tǒng)最基本的組成部分,在Linux內(nèi)核源程序中也占有60%以上。因此,熟悉驅(qū)動(dòng)的編寫(xiě)是很重要的。

11.1設(shè)備驅(qū)動(dòng)概述11.1.1設(shè)備驅(qū)動(dòng)簡(jiǎn)介及驅(qū)動(dòng)模塊

操作系統(tǒng)是通過(guò)各種驅(qū)動(dòng)程序來(lái)駕馭硬件設(shè)備的,它為用戶屏蔽了各種各樣的設(shè)備,驅(qū)動(dòng)硬件是操作系統(tǒng)最基本的功能,并且提供統(tǒng)一的操作方式。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,硬件驅(qū)動(dòng)程序是操作系統(tǒng)最基本的組成部分,在Linux內(nèi)核源程序中也占有60%以上。因此,熟悉驅(qū)動(dòng)的編寫(xiě)是很重要的。

在第2章中已經(jīng)提到過(guò),Linux內(nèi)核中采用可加載的模塊化設(shè)計(jì)(LKMs,LoadableKernelModules),一般情況下編譯的Linux內(nèi)核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內(nèi)核中,其他的代碼可以編譯到內(nèi)核中,或者編譯為內(nèi)核的模塊文件(在需要時(shí)動(dòng)態(tài)加載)。

常見(jiàn)的驅(qū)動(dòng)程序是作為內(nèi)核模塊動(dòng)態(tài)加載的,比如聲卡驅(qū)動(dòng)和網(wǎng)卡驅(qū)動(dòng)等,而Linux最基礎(chǔ)的驅(qū)動(dòng),如CPU、PCI總線、TCP/IP協(xié)議、APM(高級(jí)電源管理)、VFS等驅(qū)動(dòng)程序則直接編譯在內(nèi)核文件中。有時(shí)也把內(nèi)核模塊叫做驅(qū)動(dòng)程序,只不過(guò)驅(qū)動(dòng)的內(nèi)容不一定是硬件罷了,比如ext3文件系統(tǒng)的驅(qū)動(dòng)。因此,加載驅(qū)動(dòng)就是加載內(nèi)核模塊。

這里,首先列舉一些模塊相關(guān)的命令。

n lsmod列出當(dāng)前系統(tǒng)中加載的模塊,其中左邊第一列是模塊名,第二列是該模塊大小,第三列則是使用該模塊的對(duì)象數(shù)目。如下所示:

$lsmod

ModuleSizeUsedby

Autofs120680(autoclean)(unused)

eepro100181281

iptable_nat 192520(autoclean)(unused)

ip_conntrack185401(autoclean)[iptable_nat]

iptable_mangle22720(autoclean)(unused)

iptable_filter22720(autoclean)(unused)

ip_tables119365[iptable_natiptable_mangleiptable_filter]

usb-ohci193280(unused)

usbcore545281[usb-ohci]

ext3677282

jbd444802[ext3]

aic7xxx1147043

sd_mod115843

scsi_mod985122[aic7xxxsd_mod]

n rmmod是用于將當(dāng)前模塊卸載。

n insmod和modprobe是用于加載當(dāng)前模塊,但insmod不會(huì)自動(dòng)解決依存關(guān)系,即如果要加載的模塊引用了當(dāng)前內(nèi)核符號(hào)表中不存在的符號(hào),則無(wú)法加載,也不會(huì)去查在其他尚未加載的模塊中是否定義了該符號(hào);modprobe可以根據(jù)模塊間依存關(guān)系以及/etc/modules.conf文件中的內(nèi)容自動(dòng)加載其他有依賴(lài)關(guān)系的模塊。

11.1.2設(shè)備分類(lèi)

本書(shū)在前面也提到過(guò),Linux的一個(gè)重要特點(diǎn)就是將所有的設(shè)備都當(dāng)做文件進(jìn)行處理,這一類(lèi)特殊文件就是設(shè)備文件,它們可以使用前面提到的文件、I/O相關(guān)函數(shù)進(jìn)行操作,這樣就大大方便了對(duì)設(shè)備的處理。它通常在/dev下面存在一個(gè)對(duì)應(yīng)的邏輯設(shè)備節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)以文件的形式存在。

Linux系統(tǒng)的設(shè)備分為3類(lèi):字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。

n 字符設(shè)備通常指像普通文件或字節(jié)流一樣,以字節(jié)為單位順序讀寫(xiě)的設(shè)備,如并口設(shè)備、虛擬控制臺(tái)等。字符設(shè)備可以通過(guò)設(shè)備文件節(jié)點(diǎn)訪問(wèn),它與普通文件之間的區(qū)別在于普通文件可以被隨機(jī)訪問(wèn)(可以前后移動(dòng)訪問(wèn)指針),而大多數(shù)字符設(shè)備只能提供順序訪問(wèn),因?yàn)閷?duì)它們的訪問(wèn)不會(huì)被系統(tǒng)所緩存。但也有例外,例如幀緩存(framebuffer)是一個(gè)可以被隨機(jī)訪問(wèn)的字符設(shè)備。

n 塊設(shè)備通常指一些需要以塊為單位隨機(jī)讀寫(xiě)的設(shè)備,如IDE硬盤(pán)、SCSI硬盤(pán)、光驅(qū)等。塊設(shè)備也是通過(guò)文件節(jié)點(diǎn)來(lái)訪問(wèn),它不僅可以提供隨機(jī)訪問(wèn),而且可以容納文件系統(tǒng)(例如硬盤(pán)、閃存等)。Linux可以使用戶態(tài)程序像訪問(wèn)字符設(shè)備一樣每次進(jìn)行任意字節(jié)的操作,只是在內(nèi)核態(tài)內(nèi)部中的管理方式和內(nèi)核提供的驅(qū)動(dòng)接口上不同。

通過(guò)文件屬性可以查看它們是哪種設(shè)備文件(字符設(shè)備文件或塊設(shè)備文件)。

$ls–l/dev

crw-rw----1rootuucp4,6408-3022:58ttyS0/*串口設(shè)備,c表示字符設(shè)備*/

brw-r-----1rootfloppy2,008-3022:58fd0/*軟盤(pán)設(shè)備,b表示塊設(shè)備*/

n 網(wǎng)絡(luò)設(shè)備通常是指通過(guò)網(wǎng)絡(luò)能夠與其他主機(jī)進(jìn)行數(shù)據(jù)通信的設(shè)備,如網(wǎng)卡等。

內(nèi)核和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序之間的通信調(diào)用一套數(shù)據(jù)包處理函數(shù),它們完全不同于內(nèi)核和字符以及塊設(shè)備驅(qū)動(dòng)程序之間的通信(read()、write()等函數(shù))。Linux網(wǎng)絡(luò)設(shè)備不是面向流的設(shè)備,因此不會(huì)將網(wǎng)絡(luò)設(shè)備的名字(例如eth0)映射到文件系統(tǒng)中去。

對(duì)這3種設(shè)備文件編寫(xiě)驅(qū)動(dòng)程序時(shí)會(huì)有一定的區(qū)別,本書(shū)在后面會(huì)有相關(guān)內(nèi)容的講解。

11.1.3設(shè)備號(hào)

設(shè)備號(hào)是一個(gè)數(shù)字,它是設(shè)備的標(biāo)志。就如前面所述,一個(gè)設(shè)備文件(也就是設(shè)備節(jié)點(diǎn))可以通過(guò)mknod命令來(lái)創(chuàng)建,其中指定了主設(shè)備號(hào)和次設(shè)備號(hào)。主設(shè)備號(hào)表明設(shè)備的類(lèi)型(例如串口設(shè)備、SCSI硬盤(pán)),與一個(gè)確定的驅(qū)動(dòng)程序?qū)?yīng);次設(shè)備號(hào)通常是用于標(biāo)明不同的屬性,例如不同的使用方法、不同的位置、不同的操作等,它標(biāo)志著某個(gè)具體的物理設(shè)備。高字節(jié)為主設(shè)備號(hào),底字節(jié)為次設(shè)備號(hào)。

例如,在系統(tǒng)中的塊設(shè)備IDE硬盤(pán)的主設(shè)備號(hào)是3,而多個(gè)IDE硬盤(pán)及其各個(gè)分區(qū)分別賦予次設(shè)備號(hào)1、2、3…

$ls–l/dev

crw-rw----1rootuucp4,6408-3022:58ttyS0/*主設(shè)備號(hào)4,此設(shè)備號(hào)64*/

11.1.4驅(qū)動(dòng)層次結(jié)構(gòu)

Linux下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,運(yùn)行在內(nèi)核模式下,也就是說(shuō)設(shè)備驅(qū)動(dòng)程序?yàn)閮?nèi)核提供了一個(gè)I/O接口,用戶使用這個(gè)接口實(shí)現(xiàn)對(duì)設(shè)備的操作。圖11.1顯示了典型的Linux輸入/輸出系統(tǒng)中各層次結(jié)構(gòu)和功能。

圖11.1Linux輸入/輸出系統(tǒng)


層次結(jié)構(gòu)和功能

Linux設(shè)備驅(qū)動(dòng)程序包含中斷處理程序和設(shè)備服務(wù)子程序兩部分。

設(shè)備服務(wù)子程序包含了所有與設(shè)備操作相關(guān)的處理代碼。它從面向用戶進(jìn)程的設(shè)備文件系統(tǒng)中接受用戶命令,并對(duì)設(shè)備控制器執(zhí)行操作。這樣,設(shè)備驅(qū)動(dòng)程序屏蔽了設(shè)備的特殊性,使用戶可以像對(duì)待文件一樣操作設(shè)備。

設(shè)備控制器獲得系統(tǒng)服務(wù)有兩種方式:查詢和中斷。因?yàn)長(zhǎng)inux的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,在設(shè)備查詢期間系統(tǒng)不能運(yùn)行其他代碼,查詢方式的工作效率比較低,所以只有少數(shù)設(shè)備如軟盤(pán)驅(qū)動(dòng)程序采取這種方式,大多設(shè)備以中斷方式向設(shè)備驅(qū)動(dòng)程序發(fā)出輸入/輸出請(qǐng)求。

11.1.5設(shè)備驅(qū)動(dòng)程序與外界的接口

每種類(lèi)型的驅(qū)動(dòng)程序,不管是字符設(shè)備還是塊設(shè)備都為內(nèi)核提供相同的調(diào)用接口,因此內(nèi)核能以相同的方式處理不同的設(shè)備。Linux為每種不同類(lèi)型的設(shè)備驅(qū)動(dòng)程序維護(hù)相應(yīng)的數(shù)據(jù)結(jié)構(gòu),以便定義統(tǒng)一的接口并實(shí)現(xiàn)驅(qū)動(dòng)程序的可裝載性和動(dòng)態(tài)性。Linux設(shè)備驅(qū)動(dòng)程序與外界的接口可以分為如下3個(gè)部分。

n 驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口:這是通過(guò)數(shù)據(jù)結(jié)構(gòu)file_operations(在本書(shū)后面會(huì)有詳細(xì)介紹)來(lái)完成的。

n 驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口:這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化。

n 驅(qū)動(dòng)程序與設(shè)備的接口:這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互,這與具體設(shè)備密切相關(guān)。

它們之間的相互關(guān)系如圖11.2所示。

圖11.2設(shè)備驅(qū)動(dòng)程序與外界的接口

11.1.6設(shè)備驅(qū)動(dòng)程序的特點(diǎn)

綜上所述,Linux中的設(shè)備驅(qū)動(dòng)程序有如下特點(diǎn)。

(1)內(nèi)核代碼:設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,如果驅(qū)動(dòng)程序出錯(cuò),則可能導(dǎo)致系統(tǒng)崩潰。

(2)內(nèi)核接口:設(shè)備驅(qū)動(dòng)程序必須為內(nèi)核或者其子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)接口。比如,一個(gè)終端驅(qū)動(dòng)程序必須為內(nèi)核提供一個(gè)文件I/O接口;一個(gè)SCSI設(shè)備驅(qū)動(dòng)程序應(yīng)該為SCSI子系統(tǒng)提供一個(gè)SCSI設(shè)備接口,同時(shí)SCSI子系統(tǒng)也必須為內(nèi)核提供文件的I/O接口及緩沖區(qū)。

(3)內(nèi)核機(jī)制和服務(wù):設(shè)備驅(qū)動(dòng)程序使用一些標(biāo)準(zhǔn)的內(nèi)核服務(wù),如內(nèi)存分配等。

(4)可裝載:大多數(shù)的Linux操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序都可以在需要時(shí)裝載進(jìn)內(nèi)核,在不需要時(shí)從內(nèi)核中卸載。

(5)可設(shè)置:Linux操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序可以集成為內(nèi)核的一部分,并可以根據(jù)需要把其中的某一部分集成到內(nèi)核中,這只需要在系統(tǒng)編譯時(shí)進(jìn)行相應(yīng)的設(shè)置即可。

(6)動(dòng)態(tài)性:在系統(tǒng)啟動(dòng)且各個(gè)設(shè)備驅(qū)動(dòng)程序初始化后,驅(qū)動(dòng)程序?qū)⒕S護(hù)其控制的設(shè)備。如果該設(shè)備驅(qū)動(dòng)程序控制的設(shè)備不存在也不影響系統(tǒng)的運(yùn)行,那么此時(shí)的設(shè)備驅(qū)動(dòng)程序只是多占用了一點(diǎn)系統(tǒng)內(nèi)存罷了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉