日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

首先說明:寫這個(gè)第一個(gè)linux設(shè)備驅(qū)動(dòng)程序的目的是熟悉Linux驅(qū)動(dòng)的框架以及編程流程,所以是通過打印的信息來觀察程序運(yùn)行的情況,并不是真正的實(shí)現(xiàn)了某一個(gè)具體設(shè)備的驅(qū)動(dòng),可以類比于C語言編程中的“Hello World”。

Linux下的設(shè)備驅(qū)動(dòng)架構(gòu)如下圖所示:

教你寫第一個(gè)Linux設(shè)備驅(qū)動(dòng)程序

 

在本篇文章中以first_device_driver為例進(jìn)行介紹

一般來說,寫出完整的設(shè)備驅(qū)動(dòng)程序需要如下幾個(gè)步驟:

  1. 寫出first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等函數(shù);
  2. 定義file_operations結(jié)構(gòu)體并填充其成員函數(shù)first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等;
  3. 模塊加載函數(shù),通過register_chrdev將字符設(shè)備注冊(cè)到內(nèi)核中;
  4. 寫驅(qū)動(dòng)的入口函數(shù);
  5. 寫驅(qū)動(dòng)的出口函數(shù);
  6. 通過module_init()來修飾驅(qū)動(dòng)入口函數(shù);
  7. 通過module_exit()來修飾驅(qū)動(dòng)出口函數(shù);
  8. 聲明模塊許可證;

下面進(jìn)行詳細(xì)講解

步驟一:在新創(chuàng)建的.c文件中編寫如圖例中的代碼

教你寫第一個(gè)Linux設(shè)備驅(qū)動(dòng)程序

 


教你寫第一個(gè)Linux設(shè)備驅(qū)動(dòng)程序

 

步驟二:編寫Makefile腳本

教你寫第一個(gè)Linux設(shè)備驅(qū)動(dòng)程序

 

值得提出的一點(diǎn)是,編寫Makefile是Linux驅(qū)動(dòng)工程師必備的基礎(chǔ),但是要明白我們并不需要完全的掌握Makefile的語法及編程,我們只需要能模仿著其他工程的Makefile文件寫出我們自己想要的Makefile文件即可。

步驟三:在對(duì)應(yīng)目錄中執(zhí)行make命令,生成.ko模塊文件

這一步驟較為簡單,只是在相應(yīng)目錄輸入make命令即可。

步驟四:通過U盤或者nfs網(wǎng)絡(luò)文件系統(tǒng)將該.ko文件加載到內(nèi)核中

我們?cè)诩虞d驅(qū)動(dòng)模塊之前可以先通過命令:cat /proc/devices來查看字符主設(shè)備號(hào)是否已經(jīng)被占用。proc文件系統(tǒng)是Linux在運(yùn)行時(shí)存在于內(nèi)存中的文件系統(tǒng),它記錄著系統(tǒng)運(yùn)行的實(shí)時(shí)信息,當(dāng)關(guān)閉系統(tǒng)時(shí),proc文件系統(tǒng)也隨之釋放。

然后可通過命令:insmod first_drv.ko將模塊掛載到內(nèi)核, 通過命令:cat /proc/devices可以觀察first_drv設(shè)備是否已經(jīng)掛載成功;另外也可以通過modprobe來加載驅(qū)動(dòng)模塊,這兩者的區(qū)別在于modprobe可以解決加載模塊時(shí)的依賴關(guān)系,它是通過/lib/modules/#uname -r/modules.dep(.bb)文件來查找依賴關(guān)系的,而insmod不能解決模塊間的依賴問題。

步驟五:創(chuàng)建dev/first_driver設(shè)備節(jié)點(diǎn)

通過命令:mknod /dev/first_driver 100 0 來創(chuàng)建設(shè)備節(jié)點(diǎn)。

步驟六:編寫應(yīng)用程序進(jìn)行測(cè)試

測(cè)試的應(yīng)用程序如下:

教你寫第一個(gè)Linux設(shè)備驅(qū)動(dòng)程序

 

在這里我們可以發(fā)現(xiàn)測(cè)試程序里的open()函數(shù)實(shí)際就是調(diào)用了驅(qū)動(dòng)中的first_drv_open()函數(shù),而write()函數(shù)實(shí)際調(diào)用了驅(qū)動(dòng)中的first_drv_write()函數(shù)。本質(zhì)上是這樣的一個(gè)執(zhí)行過程:用戶空間的open()函數(shù)->文件系統(tǒng)的sys_open()函數(shù)->驅(qū)動(dòng)的first_drv_open()函數(shù)。

另外很重要的一點(diǎn),上文中圖例中的程序是需要手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn),從而提供給用戶程序訪問的,如此一來當(dāng)驅(qū)動(dòng)模塊較多的時(shí)候就很麻煩,所以Linux也提供自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的接口,建議使用自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的機(jī)制。如下是自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的方法:

1、首先創(chuàng)建一個(gè)class設(shè)備類,然后在class類下,創(chuàng)建一個(gè)class_device,即在類下面創(chuàng)建類的設(shè)備;

2、在驅(qū)動(dòng)入口函數(shù)中添加步驟:firstdrv_class= class_create(THIS_MODULE,"first_drv");irstdrv_class_devs=class_device_create(firstdrv_class,NULL,MKDEV(major,0),NULL,"first_drv");

3、在驅(qū)動(dòng)出口函數(shù)中添加:class_device_unregister(firstdrv_class_devs);class_destroy(firstdrv_class);

這個(gè)自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的功能是基于Linux支持的熱拔插功能,Linux內(nèi)核中每當(dāng)設(shè)備出現(xiàn)變動(dòng)時(shí),都會(huì)處理對(duì)應(yīng)的信息,使用戶程序?qū)?dev目錄下的設(shè)備進(jìn)行操作。

最后,此驅(qū)動(dòng)程序運(yùn)行的實(shí)際效果就是打印信息,這個(gè)Linux設(shè)備驅(qū)動(dòng)例程可以類比于C語言中的“Hello World”例程,希望可以幫助大家初步認(rèn)識(shí)Linux的設(shè)備驅(qū)動(dòng)程序。

分享到:
標(biāo)簽:驅(qū)動(dòng)程序
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定