免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
教你寫第一個Linux設備驅(qū)動程序

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

Linux下的設備驅(qū)動架構如下圖所示:

在本篇文章中以first_device_driver為例進行介紹

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

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

下面進行詳細講解

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

步驟二:編寫Makefile腳本

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

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

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

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

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

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

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

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

步驟六:編寫應用程序進行測試

測試的應用程序如下:

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

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

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

2、在驅(qū)動入口函數(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ū)動出口函數(shù)中添加:class_device_unregister(firstdrv_class_devs);class_destroy(firstdrv_class);

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

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

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深度:一文看懂Linux內(nèi)核!Linux內(nèi)核架構和工作原理詳解
Linux中級“驅(qū)動”控制硬件必須學會的底層知識
USB驅(qū)動分析(一)
詳細講解Linux驅(qū)動程序
驅(qū)動注冊platform_driver(一)
Linux設備驅(qū)動簡析--dm9000網(wǎng)卡驅(qū)動 - Network - Neil Chiao's Blog
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服