亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2021-07-16 09:23:30占華林徐濤濤陳亮亮于子正李明鑫
        科學(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)勢(shì)。首先是Linux 開源免費(fèi);然后是Linux 的內(nèi)核體積小且易于模塊化,適應(yīng)性和可配置性好適合各種平臺(tái),它同時(shí)還支持多任務(wù)、多用戶;最后是Linux 有很多開發(fā)論壇,提供豐富開發(fā)資料,對(duì)開發(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è)備文件與之相對(duì)應(yīng),對(duì)設(shè)備的打開、讀寫、控制和關(guān)閉等所有操作都是通過/dev/目錄下對(duì)應(yīng)的文件進(jìn)行操作。設(shè)備節(jié)點(diǎn)有時(shí)會(huì)自動(dòng)創(chuàng)建,可是字符設(shè)備驅(qū)動(dòng)并不直接負(fù)責(zé)這一項(xiàng)操作。因此我們?cè)谠O(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è)備號(hào)。Linux 管理的所有設(shè)備都有與之對(duì)應(yīng)的目錄,內(nèi)核通過驅(qū)動(dòng)程序來識(shí)別設(shè)備。一般來說驅(qū)動(dòng)程序通過主設(shè)備號(hào)快速匹配外部設(shè)備,但同一類設(shè)備數(shù)量不只一個(gè)(或者說一個(gè)驅(qū)動(dòng)程序可以同時(shí)匹配多個(gè)設(shè)備),所以必須增加次設(shè)備號(hào),它給驅(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 所示的流程對(duì)硬件設(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)對(duì)設(shè)備的訪問。

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

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

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

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

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

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

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

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

        將編輯好驅(qū)動(dòng)程序源文件和頭文件放置內(nèi)核相對(duì)應(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)核對(duì)應(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)程序模塊鏡像使用插入的方法到嵌入式平臺(tái)。插入命令: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 測(cè)試鍵盤驅(qū)動(dòng)程序

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

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

        結(jié)束語

        本論文講述了字符設(shè)備驅(qū)動(dòng)的基本原理及編寫字符設(shè)備驅(qū)動(dòng)程序的方法?;赟3C2410+HD7279 平臺(tái)上,演示了鍵盤字符設(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)核
        萬物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
        尋找更強(qiáng)的字符映射管理器
        強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
        字符代表幾
        一種USB接口字符液晶控制器設(shè)計(jì)
        電子制作(2019年19期)2019-11-23 08:41:50
        基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
        Linux內(nèi)核mmap保護(hù)機(jī)制研究
        消失的殖民村莊和神秘字符
        驅(qū)動(dòng)程序更新與推薦
        驅(qū)動(dòng)程序更新與推薦
        国产精品亚洲一区二区三区久久| 日韩激情小视频| 欧美日韩激情在线一区二区| 日本在线观看一区二区三区视频| 日韩精品在线免费视频| 狠狠噜天天噜日日噜无码| 国产视频毛片| 色青青女同性恋视频日本熟女 | 免费成人在线电影| 亚洲乱码视频在线观看| 亚洲av成人一区二区三区色| 亚洲视频在线免费不卡| 亚洲中文字幕无码中文字在线 | 老女人下面毛茸茸的视频| 国产特黄级aaaaa片免| 国产亚洲精品第一综合麻豆| 中文字幕高清无码不卡在线| 国产免费人成视频在线| 亚洲精品久久久久成人2007| 日韩亚洲中字无码一区二区三区| 日韩精品极品视频在线观看蜜桃| 国产日产韩国av在线| 亚洲av成人中文无码专区| 欧美日韩国产亚洲一区二区三区| 熟女不卡精品久久av| 波多野结衣av一区二区全免费观看| 久久男人av资源网站无码| 久99久精品免费视频热77| 男女上床免费视频网站| 国产特级毛片aaaaaa视频| 在线播放a欧美专区一区| 亚洲一区二区三区综合网| 午夜天堂一区人妻| 久久老子午夜精品无码怎么打| 日本中文字幕一区二区高清在线| 东风日产车是不是国产的| 国产精品∧v在线观看| 999精品全免费观看视频| 亚洲综合有码中文字幕| 少妇被又大又粗又爽毛片| 国产内射合集颜射|