




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章嵌入式Linux的設(shè)備驅(qū)動Linux系統(tǒng)驅(qū)動程序開發(fā)簡介常用的系統(tǒng)支持
Linux系統(tǒng)網(wǎng)絡(luò)設(shè)備驅(qū)動程序
編寫Linux網(wǎng)絡(luò)驅(qū)動程序中需要注意的問題
第7章嵌入式Linux的設(shè)備驅(qū)動Linux系統(tǒng)驅(qū)動程序7.1Linux系統(tǒng)驅(qū)動程序開發(fā)簡介Linux中設(shè)備被抽象出來,所有設(shè)備都看成文件如:系統(tǒng)中第一個IDE硬盤被表示成/dev/hda
設(shè)備的讀寫和普通文件一樣設(shè)備驅(qū)動程序主要完成這些功能:探測設(shè)備和初始化設(shè)備從設(shè)備接收數(shù)據(jù)并提交給內(nèi)核從內(nèi)核接收數(shù)據(jù)送到設(shè)備檢測和處理設(shè)備錯誤7.1Linux系統(tǒng)驅(qū)動程序開發(fā)簡介Linux中設(shè)備被抽象Linux設(shè)備驅(qū)動程序分類Linux系統(tǒng)的設(shè)備分為字符設(shè)備(chardevice),塊設(shè)備(blockdevice)和網(wǎng)絡(luò)設(shè)備(networkdevice)三種字符設(shè)備是指存取時沒有緩存的設(shè)備。如:系統(tǒng)的串口設(shè)備/dev/cua0和/dev/cua1塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機存取(randomaccess),且不管塊位于設(shè)備中何處都可以對其進行讀寫。塊設(shè)備可以通過其設(shè)備相關(guān)文件進行訪問,但更為平常的訪問方法是通過文件系統(tǒng)。只有塊設(shè)備才能支持可安裝文件系統(tǒng)。如硬盤用mknod命令創(chuàng)建的塊設(shè)備特殊文件與字符設(shè)備特殊文件
網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理,可以通過BSD套接口訪問。Linux設(shè)備驅(qū)動程序分類Linux系統(tǒng)的設(shè)備分為字符設(shè)備1、核心代碼
設(shè)備驅(qū)動是核心的一部分,象核心中其它代碼一樣,出錯將導(dǎo)致系統(tǒng)的嚴重損傷。一個編寫奇差的設(shè)備驅(qū)動甚至能使系統(tǒng)崩潰并導(dǎo)致文件系統(tǒng)的破壞和數(shù)據(jù)丟失。
2、核心接口
設(shè)備驅(qū)動必須為Linux核心或者其從屬子系統(tǒng)提供一個標準接口。例如終端驅(qū)動為Linux核心提供了一個文件I/O接口而SCSI設(shè)備驅(qū)動為SCSI子系統(tǒng)提供了一個SCSI設(shè)備接口,同時此子系統(tǒng)為核心提供了文件I/O和buffercache接口。
Linux核心中的設(shè)備驅(qū)動具有的共性:1、核心代碼Linux核心中的設(shè)備驅(qū)動具有的共性:3、核心機制與服務(wù)
設(shè)備驅(qū)動可以使用標準的核心服務(wù)如內(nèi)存分配、中斷發(fā)送和等待隊列等等。
4、動態(tài)可加載
多數(shù)Linux設(shè)備驅(qū)動可以在核心模塊發(fā)出加載請求時加載,同時在不再使用時卸載。這樣核心能有效地利用系統(tǒng)資源。
5、可配置
Linux設(shè)備驅(qū)動可以連接到核心中。6、動態(tài)性
當系統(tǒng)啟動及設(shè)備驅(qū)動初始化時將查找它所控制的硬件設(shè)備。如果某個設(shè)備的驅(qū)動為一個空過程并不會有什么問題。此時此設(shè)備驅(qū)動僅僅是一個冗余的程序,它除了會占用少量系統(tǒng)內(nèi)存外不會對系統(tǒng)造成什么危害。3、核心機制與服務(wù)驅(qū)動程序的幾個概念1、輪詢與中斷輪詢方式意味著需要經(jīng)常讀取設(shè)備的狀態(tài),一直到設(shè)備狀態(tài)表明請求已經(jīng)完成為止。如果設(shè)備驅(qū)動被連接進入核心,這時使用輪詢方式將會帶來災(zāi)難性后果:核心將在此過程中無所事事,直到設(shè)備完成此請求。但是輪詢設(shè)備驅(qū)動可以通過使用系統(tǒng)定時器,使核心周期性調(diào)用設(shè)備驅(qū)動中的某個例程來檢查設(shè)備狀態(tài)。定時器過程可以檢查命令狀態(tài)及Linux軟盤驅(qū)動的工作情況。使用定時器是輪詢方式中最好的一種,但更有效的方法是使用中斷。驅(qū)動程序的幾個概念1、輪詢與中斷輪詢方式意味著需要經(jīng)常讀取設(shè)基于中斷的設(shè)備驅(qū)動會在它所控制的硬件設(shè)備需要服務(wù)時引發(fā)一個硬件中斷。如以太網(wǎng)設(shè)備驅(qū)動從網(wǎng)絡(luò)上接收到一個以太數(shù)據(jù)報時都將引起中斷。Linux核心需要將來自硬件設(shè)備的中斷傳遞到相應(yīng)的設(shè)備驅(qū)動。這個過程由設(shè)備驅(qū)動向核心注冊其使用的中斷來協(xié)助完成。此中斷處理例程的地址和中斷號都將被記錄下來。在/proc/interrupts文件中你可以看到設(shè)備驅(qū)動所對應(yīng)的中斷號及類型:0:727432timer1:20534keyboard2:0cascade3:79691+serial4:28258+serial5:1soundblaster11:20868+aic7xxx13:1matherror14:247+ide015:170+ide1基于中斷的設(shè)備驅(qū)動會在它所控制的硬件設(shè)備需要服務(wù)時引發(fā)一個硬2、直接內(nèi)存訪問(DMA)DMA控制器可以在不受處理器干預(yù)的情況下在設(shè)備和系統(tǒng)內(nèi)存之間高速傳輸數(shù)據(jù)。設(shè)備驅(qū)動使用DMA時必須十分小心。首先DMA控制器沒有任何虛擬內(nèi)存的概念,它只存取系統(tǒng)中的物理內(nèi)存。同時用作DMA傳輸緩沖的內(nèi)存空間必須是連續(xù)物理內(nèi)存塊。這意味著不能在進程虛擬地址空間內(nèi)直接使用DMA。但是你可以將進程的物理頁面加鎖以防止在DMA操作過程中被交換到交換設(shè)備上去。另外DMA控制器所存取物理內(nèi)存有限。DMA通道地址寄存器代表DMA地址的高16位而頁面寄存器記錄的是其余8位。所以DMA請求被限制到內(nèi)存最低16M字節(jié)中。2、直接內(nèi)存訪問(DMA)DMA控制器可以在不受處理器干Linux通過dma_chan(每個DMA通道一個)數(shù)組來跟蹤DMA通道的使用情況。dma_chan結(jié)構(gòu)中包含有兩個域,一個是指向此DMA通道擁有者的指針,另一個指示DMA通道是否已經(jīng)被分配出去。當敲入cat/proc/dma打印出來的結(jié)果就是dma_chan結(jié)構(gòu)數(shù)組。Linux通過dma_chan(每個DMA通道一個)數(shù)組來3、
內(nèi)存設(shè)備驅(qū)動必須謹慎使用內(nèi)存。由于它屬于核心,所以不能使用虛擬內(nèi)存。Linux為設(shè)備驅(qū)動提供了一組核心內(nèi)存分配與回收過程。核心內(nèi)存以2的次冪大小的塊來分配。如512或128字節(jié),此時即使設(shè)備驅(qū)動的需求小于這個數(shù)量也會分配這么多。所以設(shè)備驅(qū)動的內(nèi)存分配請求可得到以塊大小為邊界的內(nèi)存。這樣核心進行空閑塊組合更加容易。請求分配核心內(nèi)存時Linux需要完成許多額外的工作。如果系統(tǒng)中空閑內(nèi)存數(shù)量較少,則可能需要丟棄些物理頁面或?qū)⑵鋵懭虢粨Q設(shè)備。一般情況下Linux將掛起請求者并將此進程放置到等待隊列中直到系統(tǒng)中有足夠的物理內(nèi)存為止。3、
內(nèi)存設(shè)備驅(qū)動必須謹慎使用內(nèi)存。由于它屬于核心,所以4、設(shè)備驅(qū)動與核心的接口
Linux核心與設(shè)備驅(qū)動之間必須有一個以標準方式進行互操作的接口。每一類設(shè)備驅(qū)動:字符設(shè)備、塊設(shè)備及網(wǎng)絡(luò)設(shè)備都提供了通用接口以便在需要時為核心提供服務(wù)。這種通用接口使得核心可以以相同的方式來對待不同的設(shè)備及設(shè)備驅(qū)動。如SCSI和IDE硬盤的區(qū)別很大但Linux對它們使用相同的接口。Linux動態(tài)性很強。每次Linux核心啟動時如遇到不同的物理設(shè)備將需要不同的物理設(shè)備驅(qū)動。4、設(shè)備驅(qū)動與核心的接口Linux核心與設(shè)備驅(qū)動之間必須4.1
字符設(shè)備字符設(shè)備是Linux設(shè)備中最簡單的一種字符設(shè)備初始化時,它的設(shè)備驅(qū)動通過在device_struct結(jié)構(gòu)的chrdevs數(shù)組中添加一個入口來將其注冊到Linux核心上。設(shè)備的主設(shè)備標志符用來對此數(shù)組進行索引(如對tty設(shè)備的索引4)
4.1
字符設(shè)備字符設(shè)備是Linux設(shè)備中最簡單的一種4.2塊設(shè)備塊設(shè)備也支持以文件方式訪問。Linux在blkdevs數(shù)組中維護所有已注冊的塊設(shè)備。象chrdevs數(shù)組一樣,blkdevs也使用設(shè)備的主設(shè)備號進行索引。其入口也是device_struct結(jié)構(gòu)。和字符設(shè)備不同的是系統(tǒng)有幾類塊設(shè)備。SCSI設(shè)備是一類而IDE設(shè)備則是另外一類。和普通文件操作接口一樣,每個塊設(shè)備驅(qū)動必須為buffercache提供接口。每個塊設(shè)備驅(qū)動將填充其在blk_dev數(shù)組中的blk_dev_struct結(jié)構(gòu)入口。數(shù)組的索引值還是此設(shè)備的主設(shè)備號。4.2塊設(shè)備塊設(shè)備也支持以文件方式訪問。Linux在bbuffercache塊設(shè)備請求上圖表示每個請求有指向一個或多個buffer_hear結(jié)構(gòu)的指針,每個請求讀寫一塊數(shù)據(jù)。一旦設(shè)備驅(qū)動完成了請求則它必須將每個buffer_heard結(jié)構(gòu)從request結(jié)構(gòu)中清除。buffercache塊設(shè)備請求上圖表示每個請求有指向一4.3網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備,即Linux的網(wǎng)絡(luò)子系統(tǒng),是一個發(fā)送與接收數(shù)據(jù)包的實體。它一般是一個象以太網(wǎng)卡的物理設(shè)備。每個網(wǎng)絡(luò)設(shè)備都用一個device結(jié)構(gòu)來表示,所有傳輸與接收到的網(wǎng)絡(luò)數(shù)據(jù)用一個sk_buff結(jié)構(gòu)來表示。這些數(shù)據(jù)結(jié)構(gòu)使得網(wǎng)絡(luò)協(xié)議頭可以更容易的添加與刪除。4.3網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備,即Linux的網(wǎng)絡(luò)子系統(tǒng),是一網(wǎng)絡(luò)設(shè)備特殊文件僅在于系統(tǒng)網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)與初始化時建立。它們使用標準的命名方法,每個名字代表一種類型的設(shè)備。多個相同類型設(shè)備將從0開始記數(shù)。這樣以太網(wǎng)設(shè)備被命名為/dev/eth0,/dev/eth1,/dev/eth2等等。一些常見的網(wǎng)絡(luò)設(shè)備如下:/dev/ethN以太網(wǎng)設(shè)備/dev/slNSLIP設(shè)備/dev/pppNPPP設(shè)備/dev/loLoopback設(shè)備網(wǎng)絡(luò)設(shè)備特殊文件僅在于系統(tǒng)網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)與初始化時建立。它編寫驅(qū)動程序的一些基本概念讀寫幾乎所有設(shè)備都有輸入和輸出。每個驅(qū)動程序要負責本設(shè)備的讀寫操作。操作系統(tǒng)的其他不需要知道對設(shè)備的具體讀寫操作怎樣進行,這些都由驅(qū)動程序屏蔽掉了。操作系統(tǒng)定義好一些讀寫接口,由驅(qū)動程序完成具體的功能。在驅(qū)動程序初始化時,需要把具有這種接口的讀寫函數(shù)注冊進操作系統(tǒng)。編寫驅(qū)動程序的一些基本概念讀寫中斷中斷在現(xiàn)代計算機結(jié)構(gòu)中有重要的地位。操作系統(tǒng)必須提供驅(qū)動程序響應(yīng)中斷的能力。一般是把一個中斷處理程序注冊到系統(tǒng)中去。操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動程序的處理程序。Linux支持中斷的共享,即多個設(shè)備共享一個中斷。PCA課件第七章嵌入式設(shè)備驅(qū)動時鐘在實現(xiàn)驅(qū)動程序時,很多地方會用到時鐘。如某些協(xié)議里的超時處理,沒有中斷機制的硬件的輪詢等。操作系統(tǒng)應(yīng)為驅(qū)動程序提供定時機制。一般是在預(yù)定的時間過了以后回調(diào)注冊的時鐘函數(shù)。時鐘常用的系統(tǒng)支持
內(nèi)存申請和釋放中斷時鐘I/O中斷打開關(guān)閉打印信息注冊驅(qū)動程序常用的系統(tǒng)支持內(nèi)存申請和釋放內(nèi)存申請和釋放include/linux/kernel.h里聲明了kmalloc()和kfree()。用于在內(nèi)核模式下申請和釋放內(nèi)存。與用戶模式下的malloc()不同,kmalloc()申請空間有大小限制。長度是2的整次方??梢陨暾埖淖畲箝L度也有限制。另外kmalloc()有priority參數(shù)Kfree()釋放的內(nèi)存必須是kmalloc()申請的內(nèi)存申請和釋放include/linux/kernel.h申請中斷和釋放中斷request_irq()、free_irq()是驅(qū)動程序申請中斷和釋放中斷的調(diào)用。在include/linux/sched.h里聲明申請中斷和釋放中斷request_irq()、free_i時鐘時鐘的處理類似中斷,也是登記一個時間處理函數(shù),在預(yù)定的時間過后,系統(tǒng)會調(diào)用這個函數(shù)。在include/linux/timer.h里聲明使用時鐘,先聲明一個timer_list結(jié)構(gòu),調(diào)用init_timer對它進行初始化。Time_list結(jié)構(gòu)里expires是標明這個時鐘的周期,單位采用jiffies的單位。jiffy指連續(xù)微處理器時鐘周期間的時間長度時鐘時鐘的處理類似中斷,也是登記一個時間處理函數(shù),在預(yù)定的I/OI/O端口的存取使用:inlineunsignedintinb(unsignedshortport);inlineunsignedintinb_p(unsignedshortport);inlinevoidoutb(charvalue,unsignedshortport);inlinevoidoutb_p(charvalue,unsignedshortport);在include/adm/io.h里定義I/OI/O端口的存取使用:中斷打開關(guān)閉系統(tǒng)提供給驅(qū)動程序開放和關(guān)閉響應(yīng)中斷的能力是在include/asm/system.h#definecli()__asm____volatile__("cli"::)#definesti()__asm____volatile__("sti"::)中斷打開關(guān)閉系統(tǒng)提供給驅(qū)動程序開放和關(guān)閉響應(yīng)中斷的能力打印信息驅(qū)動程序要輸出信息使用printk()include/linux/kernel.h里聲明打印信息驅(qū)動程序要輸出信息使用printk()注冊驅(qū)動程序如果使用模塊(module)方式加載驅(qū)動程序,需要在模塊初始化時把設(shè)備注冊到系統(tǒng)設(shè)備表里去,不再使用時,把設(shè)備從系統(tǒng)中卸除定義在drivers/net/net_init.h里的兩個函數(shù)完成這個工作Intregister_netdev(structdevice*dev);voidunregister_netdev(structdevice*dev);注冊驅(qū)動程序如果使用模塊(module)方式加載驅(qū)動程序,網(wǎng)絡(luò)驅(qū)動程序的結(jié)構(gòu)所有的Linux網(wǎng)絡(luò)驅(qū)動程序遵循通用的接口設(shè)計時采用的是面向?qū)ο蟮姆椒ㄒ粋€設(shè)備就是一個對象(device結(jié)構(gòu)),它內(nèi)部有自己的數(shù)據(jù)和方法一個網(wǎng)絡(luò)設(shè)備最基本的方法有初始化、發(fā)送和接收網(wǎng)絡(luò)驅(qū)動程序的結(jié)構(gòu)所有的Linux網(wǎng)絡(luò)驅(qū)動程序遵循通用的接網(wǎng)絡(luò)驅(qū)動程序的基本方法初始化(initialize)打開(open)關(guān)閉(stop)發(fā)送(hard_start_xmit)接收(reception)硬件幀頭(hard_header)地址解析(xarp)參數(shù)設(shè)置和統(tǒng)計數(shù)據(jù)網(wǎng)絡(luò)驅(qū)動程序的基本方法初始化(initialize)網(wǎng)絡(luò)驅(qū)動程序中用到的數(shù)據(jù)結(jié)構(gòu)最重要的是網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu)。定義在include/linux/netdevice.hsk_buffLinux網(wǎng)絡(luò)各層之間的數(shù)據(jù)傳送都是通過sk_buff網(wǎng)絡(luò)驅(qū)動程序中用到的數(shù)據(jù)結(jié)構(gòu)最重要的是網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu)。編寫Linux網(wǎng)絡(luò)驅(qū)動程序中需要注意的問題
中斷共享硬件發(fā)送忙時的處理流量控制(flowcontrol)調(diào)試編寫Linux網(wǎng)絡(luò)驅(qū)動程序中需要注意的問題中斷共享第7章嵌入式Linux的設(shè)備驅(qū)動Linux系統(tǒng)驅(qū)動程序開發(fā)簡介常用的系統(tǒng)支持
Linux系統(tǒng)網(wǎng)絡(luò)設(shè)備驅(qū)動程序
編寫Linux網(wǎng)絡(luò)驅(qū)動程序中需要注意的問題
第7章嵌入式Linux的設(shè)備驅(qū)動Linux系統(tǒng)驅(qū)動程序7.1Linux系統(tǒng)驅(qū)動程序開發(fā)簡介Linux中設(shè)備被抽象出來,所有設(shè)備都看成文件如:系統(tǒng)中第一個IDE硬盤被表示成/dev/hda
設(shè)備的讀寫和普通文件一樣設(shè)備驅(qū)動程序主要完成這些功能:探測設(shè)備和初始化設(shè)備從設(shè)備接收數(shù)據(jù)并提交給內(nèi)核從內(nèi)核接收數(shù)據(jù)送到設(shè)備檢測和處理設(shè)備錯誤7.1Linux系統(tǒng)驅(qū)動程序開發(fā)簡介Linux中設(shè)備被抽象Linux設(shè)備驅(qū)動程序分類Linux系統(tǒng)的設(shè)備分為字符設(shè)備(chardevice),塊設(shè)備(blockdevice)和網(wǎng)絡(luò)設(shè)備(networkdevice)三種字符設(shè)備是指存取時沒有緩存的設(shè)備。如:系統(tǒng)的串口設(shè)備/dev/cua0和/dev/cua1塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機存取(randomaccess),且不管塊位于設(shè)備中何處都可以對其進行讀寫。塊設(shè)備可以通過其設(shè)備相關(guān)文件進行訪問,但更為平常的訪問方法是通過文件系統(tǒng)。只有塊設(shè)備才能支持可安裝文件系統(tǒng)。如硬盤用mknod命令創(chuàng)建的塊設(shè)備特殊文件與字符設(shè)備特殊文件
網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理,可以通過BSD套接口訪問。Linux設(shè)備驅(qū)動程序分類Linux系統(tǒng)的設(shè)備分為字符設(shè)備1、核心代碼
設(shè)備驅(qū)動是核心的一部分,象核心中其它代碼一樣,出錯將導(dǎo)致系統(tǒng)的嚴重損傷。一個編寫奇差的設(shè)備驅(qū)動甚至能使系統(tǒng)崩潰并導(dǎo)致文件系統(tǒng)的破壞和數(shù)據(jù)丟失。
2、核心接口
設(shè)備驅(qū)動必須為Linux核心或者其從屬子系統(tǒng)提供一個標準接口。例如終端驅(qū)動為Linux核心提供了一個文件I/O接口而SCSI設(shè)備驅(qū)動為SCSI子系統(tǒng)提供了一個SCSI設(shè)備接口,同時此子系統(tǒng)為核心提供了文件I/O和buffercache接口。
Linux核心中的設(shè)備驅(qū)動具有的共性:1、核心代碼Linux核心中的設(shè)備驅(qū)動具有的共性:3、核心機制與服務(wù)
設(shè)備驅(qū)動可以使用標準的核心服務(wù)如內(nèi)存分配、中斷發(fā)送和等待隊列等等。
4、動態(tài)可加載
多數(shù)Linux設(shè)備驅(qū)動可以在核心模塊發(fā)出加載請求時加載,同時在不再使用時卸載。這樣核心能有效地利用系統(tǒng)資源。
5、可配置
Linux設(shè)備驅(qū)動可以連接到核心中。6、動態(tài)性
當系統(tǒng)啟動及設(shè)備驅(qū)動初始化時將查找它所控制的硬件設(shè)備。如果某個設(shè)備的驅(qū)動為一個空過程并不會有什么問題。此時此設(shè)備驅(qū)動僅僅是一個冗余的程序,它除了會占用少量系統(tǒng)內(nèi)存外不會對系統(tǒng)造成什么危害。3、核心機制與服務(wù)驅(qū)動程序的幾個概念1、輪詢與中斷輪詢方式意味著需要經(jīng)常讀取設(shè)備的狀態(tài),一直到設(shè)備狀態(tài)表明請求已經(jīng)完成為止。如果設(shè)備驅(qū)動被連接進入核心,這時使用輪詢方式將會帶來災(zāi)難性后果:核心將在此過程中無所事事,直到設(shè)備完成此請求。但是輪詢設(shè)備驅(qū)動可以通過使用系統(tǒng)定時器,使核心周期性調(diào)用設(shè)備驅(qū)動中的某個例程來檢查設(shè)備狀態(tài)。定時器過程可以檢查命令狀態(tài)及Linux軟盤驅(qū)動的工作情況。使用定時器是輪詢方式中最好的一種,但更有效的方法是使用中斷。驅(qū)動程序的幾個概念1、輪詢與中斷輪詢方式意味著需要經(jīng)常讀取設(shè)基于中斷的設(shè)備驅(qū)動會在它所控制的硬件設(shè)備需要服務(wù)時引發(fā)一個硬件中斷。如以太網(wǎng)設(shè)備驅(qū)動從網(wǎng)絡(luò)上接收到一個以太數(shù)據(jù)報時都將引起中斷。Linux核心需要將來自硬件設(shè)備的中斷傳遞到相應(yīng)的設(shè)備驅(qū)動。這個過程由設(shè)備驅(qū)動向核心注冊其使用的中斷來協(xié)助完成。此中斷處理例程的地址和中斷號都將被記錄下來。在/proc/interrupts文件中你可以看到設(shè)備驅(qū)動所對應(yīng)的中斷號及類型:0:727432timer1:20534keyboard2:0cascade3:79691+serial4:28258+serial5:1soundblaster11:20868+aic7xxx13:1matherror14:247+ide015:170+ide1基于中斷的設(shè)備驅(qū)動會在它所控制的硬件設(shè)備需要服務(wù)時引發(fā)一個硬2、直接內(nèi)存訪問(DMA)DMA控制器可以在不受處理器干預(yù)的情況下在設(shè)備和系統(tǒng)內(nèi)存之間高速傳輸數(shù)據(jù)。設(shè)備驅(qū)動使用DMA時必須十分小心。首先DMA控制器沒有任何虛擬內(nèi)存的概念,它只存取系統(tǒng)中的物理內(nèi)存。同時用作DMA傳輸緩沖的內(nèi)存空間必須是連續(xù)物理內(nèi)存塊。這意味著不能在進程虛擬地址空間內(nèi)直接使用DMA。但是你可以將進程的物理頁面加鎖以防止在DMA操作過程中被交換到交換設(shè)備上去。另外DMA控制器所存取物理內(nèi)存有限。DMA通道地址寄存器代表DMA地址的高16位而頁面寄存器記錄的是其余8位。所以DMA請求被限制到內(nèi)存最低16M字節(jié)中。2、直接內(nèi)存訪問(DMA)DMA控制器可以在不受處理器干Linux通過dma_chan(每個DMA通道一個)數(shù)組來跟蹤DMA通道的使用情況。dma_chan結(jié)構(gòu)中包含有兩個域,一個是指向此DMA通道擁有者的指針,另一個指示DMA通道是否已經(jīng)被分配出去。當敲入cat/proc/dma打印出來的結(jié)果就是dma_chan結(jié)構(gòu)數(shù)組。Linux通過dma_chan(每個DMA通道一個)數(shù)組來3、
內(nèi)存設(shè)備驅(qū)動必須謹慎使用內(nèi)存。由于它屬于核心,所以不能使用虛擬內(nèi)存。Linux為設(shè)備驅(qū)動提供了一組核心內(nèi)存分配與回收過程。核心內(nèi)存以2的次冪大小的塊來分配。如512或128字節(jié),此時即使設(shè)備驅(qū)動的需求小于這個數(shù)量也會分配這么多。所以設(shè)備驅(qū)動的內(nèi)存分配請求可得到以塊大小為邊界的內(nèi)存。這樣核心進行空閑塊組合更加容易。請求分配核心內(nèi)存時Linux需要完成許多額外的工作。如果系統(tǒng)中空閑內(nèi)存數(shù)量較少,則可能需要丟棄些物理頁面或?qū)⑵鋵懭虢粨Q設(shè)備。一般情況下Linux將掛起請求者并將此進程放置到等待隊列中直到系統(tǒng)中有足夠的物理內(nèi)存為止。3、
內(nèi)存設(shè)備驅(qū)動必須謹慎使用內(nèi)存。由于它屬于核心,所以4、設(shè)備驅(qū)動與核心的接口
Linux核心與設(shè)備驅(qū)動之間必須有一個以標準方式進行互操作的接口。每一類設(shè)備驅(qū)動:字符設(shè)備、塊設(shè)備及網(wǎng)絡(luò)設(shè)備都提供了通用接口以便在需要時為核心提供服務(wù)。這種通用接口使得核心可以以相同的方式來對待不同的設(shè)備及設(shè)備驅(qū)動。如SCSI和IDE硬盤的區(qū)別很大但Linux對它們使用相同的接口。Linux動態(tài)性很強。每次Linux核心啟動時如遇到不同的物理設(shè)備將需要不同的物理設(shè)備驅(qū)動。4、設(shè)備驅(qū)動與核心的接口Linux核心與設(shè)備驅(qū)動之間必須4.1
字符設(shè)備字符設(shè)備是Linux設(shè)備中最簡單的一種字符設(shè)備初始化時,它的設(shè)備驅(qū)動通過在device_struct結(jié)構(gòu)的chrdevs數(shù)組中添加一個入口來將其注冊到Linux核心上。設(shè)備的主設(shè)備標志符用來對此數(shù)組進行索引(如對tty設(shè)備的索引4)
4.1
字符設(shè)備字符設(shè)備是Linux設(shè)備中最簡單的一種4.2塊設(shè)備塊設(shè)備也支持以文件方式訪問。Linux在blkdevs數(shù)組中維護所有已注冊的塊設(shè)備。象chrdevs數(shù)組一樣,blkdevs也使用設(shè)備的主設(shè)備號進行索引。其入口也是device_struct結(jié)構(gòu)。和字符設(shè)備不同的是系統(tǒng)有幾類塊設(shè)備。SCSI設(shè)備是一類而IDE設(shè)備則是另外一類。和普通文件操作接口一樣,每個塊設(shè)備驅(qū)動必須為buffercache提供接口。每個塊設(shè)備驅(qū)動將填充其在blk_dev數(shù)組中的blk_dev_struct結(jié)構(gòu)入口。數(shù)組的索引值還是此設(shè)備的主設(shè)備號。4.2塊設(shè)備塊設(shè)備也支持以文件方式訪問。Linux在bbuffercache塊設(shè)備請求上圖表示每個請求有指向一個或多個buffer_hear結(jié)構(gòu)的指針,每個請求讀寫一塊數(shù)據(jù)。一旦設(shè)備驅(qū)動完成了請求則它必須將每個buffer_heard結(jié)構(gòu)從request結(jié)構(gòu)中清除。buffercache塊設(shè)備請求上圖表示每個請求有指向一4.3網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備,即Linux的網(wǎng)絡(luò)子系統(tǒng),是一個發(fā)送與接收數(shù)據(jù)包的實體。它一般是一個象以太網(wǎng)卡的物理設(shè)備。每個網(wǎng)絡(luò)設(shè)備都用一個device結(jié)構(gòu)來表示,所有傳輸與接收到的網(wǎng)絡(luò)數(shù)據(jù)用一個sk_buff結(jié)構(gòu)來表示。這些數(shù)據(jù)結(jié)構(gòu)使得網(wǎng)絡(luò)協(xié)議頭可以更容易的添加與刪除。4.3網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備,即Linux的網(wǎng)絡(luò)子系統(tǒng),是一網(wǎng)絡(luò)設(shè)備特殊文件僅在于系統(tǒng)網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)與初始化時建立。它們使用標準的命名方法,每個名字代表一種類型的設(shè)備。多個相同類型設(shè)備將從0開始記數(shù)。這樣以太網(wǎng)設(shè)備被命名為/dev/eth0,/dev/eth1,/dev/eth2等等。一些常見的網(wǎng)絡(luò)設(shè)備如下:/dev/ethN以太網(wǎng)設(shè)備/dev/slNSLIP設(shè)備/dev/pppNPPP設(shè)備/dev/loLoopback設(shè)備網(wǎng)絡(luò)設(shè)備特殊文件僅在于系統(tǒng)網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)與初始化時建立。它編寫驅(qū)動程序的一些基本概念讀寫幾乎所有設(shè)備都有輸入和輸出。每個驅(qū)動程序要負責本設(shè)備的讀寫操作。操作系統(tǒng)的其他不需要知道對設(shè)備的具體讀寫操作怎樣進行,這些都由驅(qū)動程序屏蔽掉了。操作系統(tǒng)定義好一些讀寫接口,由驅(qū)動程序完成具體的功能。在驅(qū)動程序初始化時,需要把具有這種接口的讀寫函數(shù)注冊進操作系統(tǒng)。編寫驅(qū)動程序的一些基本概念讀寫中斷中斷在現(xiàn)代計算機結(jié)構(gòu)中有重要的地位。操作系統(tǒng)必須提供驅(qū)動程序響應(yīng)中斷的能力。一般是把一個中斷處理程序注冊到系統(tǒng)中去。操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動程序的處理程序。Linux支持中斷的共享,即多個設(shè)備共享一個中斷。PCA課件第七章嵌入式設(shè)備驅(qū)動時鐘在實現(xiàn)驅(qū)動程序時,很多地方會用到時鐘。如某些協(xié)議里的超時處理,沒有中斷機制的硬件的輪詢等。操作系統(tǒng)應(yīng)為驅(qū)動程序提供定時機制。一般是在預(yù)定的時間過了以后回調(diào)注冊的時鐘函數(shù)。時鐘常用的系統(tǒng)支持
內(nèi)存申請和釋放中斷時鐘I/O中斷打開關(guān)閉打印信息注冊驅(qū)動程序常用的系統(tǒng)支持內(nèi)存申請和釋放內(nèi)存申請和釋放include/linux/kernel.h里聲明了kmalloc()和kfree()。用于在內(nèi)核模式下申請和釋放內(nèi)存。與用戶模式下的malloc()不同,kmalloc()申請空間有大小限制。長度是2的整次方??梢陨暾埖淖畲箝L度也有限制。另外kmalloc()有priority參數(shù)Kfree()釋放的內(nèi)存必須是kmalloc()申請的內(nèi)存申請和釋放include/linux/kernel.h申請中斷和釋放中斷request_irq()、free_irq()是驅(qū)動程序申請中斷和釋放中斷的調(diào)用。在include/linux/sched.h里聲明申請中斷和釋放中斷request_irq()、free_i時鐘時鐘的處理類似中斷,也是登記一個時間處理函數(shù),在預(yù)定的時間過后,系統(tǒng)會調(diào)用這個函數(shù)。在include/linux/timer.h里聲明使用時鐘,先聲明一個timer_list結(jié)構(gòu),調(diào)用init_timer對它進行初始化。Time_list結(jié)構(gòu)里expires是標明這個時鐘的周期,單位采用jiffies的單位。jiffy指連續(xù)微處理器時鐘周期間的時間長度時鐘時鐘的處理類似中斷,也是登記一個時間處理函數(shù),在預(yù)定的I/OI/O端口的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院科研過程管理制度
- 公司門禁密碼管理制度
- 大漢集團薪酬管理制度
- 單位涉案財物管理制度
- 小區(qū)綠化水泵管理制度
- 員工設(shè)備工具管理制度
- 壓鑄行業(yè)安全管理制度
- 計算機三級考試新思潮試題及答案
- 嵌入式軟件測試方法試題及答案
- 高中人教物理選擇性必修二專題05 單雙桿模型-學(xué)生版
- 新能源汽車的研究論文
- (完整word版)電梯管理證復(fù)審申請表
- 材料科學(xué)基礎(chǔ)基礎(chǔ)知識點總結(jié)
- 數(shù)控銑工圖紙(60份)(共60頁)
- 惠州市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(含答案)
- 加工設(shè)備工時單價表
- 高脂血癥藥物治療ppt課件
- 高層建筑等電位聯(lián)結(jié)安裝技術(shù)分析探討
- 模型預(yù)測控制(課堂PPT)
- OQC出貨檢驗規(guī)范及方法
評論
0/150
提交評論