国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Linux 操作系統(tǒng)字符設(shè)備驅(qū)動(dòng)程序開發(fā)

2021-07-16 09:23占華林徐濤濤陳亮亮于子正李明鑫
科學(xué)技術(shù)創(chuàng)新 2021年20期
關(guān)鍵詞:驅(qū)動(dòng)程序字符內(nèi)核

占華林 徐濤濤 陳亮亮 于子正 李明鑫

(江西科技師范大學(xué),江西南昌 330013)

任何一個(gè)計(jì)算機(jī)系統(tǒng)的運(yùn)轉(zhuǎn)都是系統(tǒng)中軟硬件共同努力的結(jié)果,沒有硬件的軟件是空中樓閣,而沒有軟件的硬件則只是一堆廢鐵。計(jì)算機(jī)系統(tǒng)發(fā)現(xiàn)外部設(shè)備并與外部設(shè)備通信,依靠驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)程序運(yùn)行在內(nèi)核空間,作為外部設(shè)備與應(yīng)用軟件橋梁。在所有嵌入式操作系統(tǒng)里,嵌入式Linux 系統(tǒng)相比于其他的系統(tǒng),在嵌入式領(lǐng)域有著獨(dú)特的優(yōu)勢。首先是Linux 開源免費(fèi);然后是Linux 的內(nèi)核體積小且易于模塊化,適應(yīng)性和可配置性好適合各種平臺,它同時(shí)還支持多任務(wù)、多用戶;最后是Linux 有很多開發(fā)論壇,提供豐富開發(fā)資料,對開發(fā)者而言是強(qiáng)大的技術(shù)外援。所以本論文是基于Linux 操作系統(tǒng)上開發(fā)字符設(shè)備驅(qū)動(dòng)程序。

1 字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)基礎(chǔ)

1.1 基本原理

1.1.1 創(chuàng)建設(shè)備節(jié)點(diǎn)。在Linux 操作系統(tǒng)中所有設(shè)備都當(dāng)作文件來處理,每個(gè)設(shè)備在/dev 目錄下都有一個(gè)設(shè)備文件與之相對應(yīng),對設(shè)備的打開、讀寫、控制和關(guān)閉等所有操作都是通過/dev/目錄下對應(yīng)的文件進(jìn)行操作。設(shè)備節(jié)點(diǎn)有時(shí)會(huì)自動(dòng)創(chuàng)建,可是字符設(shè)備驅(qū)動(dòng)并不直接負(fù)責(zé)這一項(xiàng)操作。因此我們在設(shè)計(jì)字符設(shè)備驅(qū)動(dòng)時(shí)會(huì)需要手動(dòng)創(chuàng)建節(jié)點(diǎn),使用mknod 命令在文件系統(tǒng)上人工創(chuàng)建。除此之外Linux 中有一組函數(shù)可以用來在/ dev目錄下創(chuàng)建設(shè)備節(jié)點(diǎn),即class_create ( ) 和device_create ( )。1.1.2 主次設(shè)備號。Linux 管理的所有設(shè)備都有與之對應(yīng)的目錄,內(nèi)核通過驅(qū)動(dòng)程序來識別設(shè)備。一般來說驅(qū)動(dòng)程序通過主設(shè)備號快速匹配外部設(shè)備,但同一類設(shè)備數(shù)量不只一個(gè)(或者說一個(gè)驅(qū)動(dòng)程序可以同時(shí)匹配多個(gè)設(shè)備),所以必須增加次設(shè)備號,它給驅(qū)動(dòng)程序提供了一種能從同一驅(qū)動(dòng)管理下的同類型設(shè)備分辨出目標(biāo)設(shè)備的方法。1.1.3 用戶空間和內(nèi)核空間。嵌入式系統(tǒng)屬于多用戶、多任務(wù)操作系統(tǒng),不能因?yàn)槟硞€(gè)用戶或某個(gè)任務(wù)的非法操作造成死機(jī)現(xiàn)象,所以用程序運(yùn)行在用戶空間,而驅(qū)動(dòng)程序則運(yùn)行在內(nèi)核空間,內(nèi)核空間維護(hù)計(jì)算機(jī)系統(tǒng)全局穩(wěn)定性,驅(qū)動(dòng)程序運(yùn)行時(shí)受到內(nèi)核程序較多約束,因?yàn)樵趦?nèi)核中運(yùn)行任一程序出現(xiàn)問題都會(huì)造成計(jì)算機(jī)系統(tǒng)死機(jī)。而應(yīng)用程序運(yùn)行較“寬松”。1.1.4 應(yīng)用程序與硬件設(shè)備的訪問。計(jì)算機(jī)系統(tǒng)中的應(yīng)用程序通過運(yùn)行在內(nèi)核空間的驅(qū)動(dòng)程序來訪問計(jì)算機(jī)外部設(shè)備。應(yīng)用程序按照如圖1 所示的流程對硬件設(shè)備進(jìn)行訪問。首先是應(yīng)用程序調(diào)用操作系統(tǒng)提供的系統(tǒng)函數(shù),從而訪問內(nèi)核空間,然后內(nèi)核空間的結(jié)構(gòu)file_operations 來實(shí)現(xiàn)驅(qū)動(dòng)程序中的相關(guān)函數(shù),從而實(shí)現(xiàn)對設(shè)備的訪問。

圖1 應(yīng)用程序到硬件設(shè)備的訪問

1.2 重要結(jié)構(gòu)file_operations

要實(shí)現(xiàn)用戶空間對內(nèi)核空間的調(diào)用,必須依賴Linux 操作系統(tǒng)內(nèi)核中一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu):file_operations。此結(jié)構(gòu)存放在內(nèi)核include/linux/fs.h 文件中,所以用到此結(jié)構(gòu)的代碼都應(yīng)包含此頭文件#include <linux/fs.h>。file_operations 結(jié)構(gòu)如下:

Linux 使用 file_operations 訪問驅(qū)動(dòng)中的函數(shù)時(shí),file_operations 中存儲著對設(shè)備進(jìn)行各種操作的函數(shù)指針f_ops,file_operations 中每一個(gè)成員名都對應(yīng)一個(gè)調(diào)用函數(shù),如:file_open( )、file_allocate( )、file_read( )、file_write( )、file_ioctl( )、file_close( )等。比如在對系統(tǒng)進(jìn)行數(shù)據(jù)存取的時(shí)候,系統(tǒng)通過設(shè)備的設(shè)備號來找到驅(qū)動(dòng),然后讀取驅(qū)動(dòng),開始執(zhí)行函數(shù)。例如:應(yīng)用程序要對某個(gè)外部設(shè)備進(jìn)行如open 操作時(shí),這時(shí)匹配該外部設(shè)備的驅(qū)動(dòng)程序就會(huì)執(zhí)行對應(yīng)的fopen 函數(shù)。

2 字符設(shè)備驅(qū)動(dòng)程序開發(fā)

字符設(shè)備驅(qū)動(dòng)程序開發(fā)涉及到知識點(diǎn)較多,開發(fā)起來顯得有點(diǎn)復(fù)雜。但規(guī)律可循,總結(jié)如下流程:

第一步:編寫驅(qū)動(dòng)程序文件

準(zhǔn)備工作(定義設(shè)備名稱、定義主次設(shè)備號)、設(shè)備注冊、定義結(jié)構(gòu)體file_operations、實(shí)現(xiàn)結(jié)構(gòu)體內(nèi)的功能函數(shù)、設(shè)備注銷等。具體下來有以下工作:a.初始化外部設(shè)備的相關(guān)寄存器。包括定時(shí)寄存器、中斷寄存器、串口寄存器;b.初始化硬件設(shè)備參數(shù);c.注冊設(shè)備。通過主次設(shè)備號與次設(shè)備號將驅(qū)動(dòng)程序與設(shè)備關(guān)聯(lián)起來,內(nèi)核會(huì)調(diào)用函數(shù)register_chrdev 來注冊匹配的外部設(shè)備;d.注冊外部設(shè)備中斷函數(shù)。內(nèi)核會(huì)調(diào)用函數(shù)request_irq( )來注冊匹配的外部設(shè)備的中斷函數(shù);

第二步:驅(qū)動(dòng)程序放進(jìn)Linux 內(nèi)核

將編輯好驅(qū)動(dòng)程序源文件和頭文件放置內(nèi)核相對應(yīng)的文件下./kernel/drivers/char,同時(shí)修改Linux 內(nèi)核配置文件***.config,在使用make menuconfig 命令時(shí)在配置頁面里出現(xiàn)相應(yīng)的配置選項(xiàng),使用空格鍵選中,保存后退出,再使用預(yù)安裝好的交叉編譯工具鏈進(jìn)行交叉編譯。需要說明的,設(shè)備驅(qū)動(dòng)程序編譯有兩種方法,一種是編譯進(jìn)內(nèi)核,另一種是編譯成模塊。一般來說,調(diào)試階段編譯成模塊形式,驅(qū)動(dòng)程序穩(wěn)定后,編譯進(jìn)內(nèi)核。修改內(nèi)核配置文件如下:

a.修改Makefile 文件。

在kernel/drivers/char 目錄下

的Makefile 文件中填加如下代碼,編譯后會(huì)生成DEVICE_DRIVER.o 文件:

DEVICE_DRIVER.o

b.修改配置菜單

在Linux 內(nèi)核對應(yīng)的目錄下kernel/drivers/char 修改配置文件config.in。在comment 'Character devices' 下面添加。運(yùn)行make menuconfig 命令時(shí),選中support for DEVICE_DRIVER,編譯后則選中的驅(qū)動(dòng)程序就會(huì)編譯進(jìn)內(nèi)核:

bool'supportforDEVICE_DRIVER'CONFIG_DEVICE_DRIVER

第三步:交叉編譯

在kernel/目錄下使用如下命令進(jìn)行交叉編譯。

make dep

make clean

Make zImage

第四步:下載燒錄

使用相關(guān)應(yīng)用軟件將新的內(nèi)樣鏡像文件下載燒錄到板載Flash 內(nèi),或?qū)Ⅱ?qū)動(dòng)程序模塊鏡像使用插入的方法到嵌入式平臺。插入命令:insmod device_driver.o。再使用命令創(chuàng)設(shè)備節(jié)點(diǎn):mknod /dev/device_name c 50 0。

3 字符設(shè)備驅(qū)動(dòng)程序舉例

在Linux 環(huán)境下,以鍵盤驅(qū)動(dòng)程序?yàn)槔M(jìn)行說明。硬件基本情況是:S3C2410+HD7279(鍵盤數(shù)碼管模塊)。

3.1 編寫鍵盤驅(qū)動(dòng)程序

a.編寫file_operations 結(jié)構(gòu)。

d.初始化鍵盤硬件函數(shù)。

3.2 測試鍵盤驅(qū)動(dòng)程序

設(shè)備驅(qū)動(dòng)編譯后,接著編寫測試程序kbd.c 用來檢測驅(qū)動(dòng)程序的效果。

fd = open("/dev/Kbd7279", 0)

結(jié)束語

本論文講述了字符設(shè)備驅(qū)動(dòng)的基本原理及編寫字符設(shè)備驅(qū)動(dòng)程序的方法?;赟3C2410+HD7279 平臺上,演示了鍵盤字符設(shè)備驅(qū)動(dòng)程序開發(fā)并進(jìn)行了驗(yàn)證。本文可認(rèn)為是字符設(shè)備驅(qū)動(dòng)開發(fā)范例,為初學(xué)字符設(shè)備驅(qū)動(dòng)開發(fā)提供參考。

猜你喜歡
驅(qū)動(dòng)程序字符內(nèi)核
多內(nèi)核操作系統(tǒng)綜述①
強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
活化非遺文化 承啟設(shè)計(jì)內(nèi)核
論高級用字階段漢字系統(tǒng)選擇字符的幾個(gè)原則
字符代表幾
一種USB接口字符液晶控制器設(shè)計(jì)
圖片輕松變身ASCⅡ藝術(shù)畫
阻止Windows Update更新驅(qū)動(dòng)程序
微軟發(fā)布新Edge瀏覽器預(yù)覽版下載換裝Chrome內(nèi)核
計(jì)算機(jī)硬件設(shè)備驅(qū)動(dòng)程序分析