linux驅動開發第1講:帶你編寫一個最簡單的字符設備驅動

2020-08-29 技術簡說

關注「技術簡說」,一步一步教你開發linux內核和驅動。

hello world!是廣大程式設計師入門一門新語言的第一步。

今天,我們來看一個hello驅動,希望這是大家入門linux內核驅動的良好開局。

我的環境是ubuntu 14.04,內核版本 4.4.0-31-generic,本節我會開發一個基於ubuntu 14.04下的最簡單的hello驅動,帶大家領略驅動的魅力。

開發linux內核驅動需要以下4個步驟:

  1. 編寫hello驅動代碼
  2. 編寫makefile
  3. 編譯和加載hello驅動
  4. 編寫應用程式測試hello驅動

驅動代碼如下 helloDev.c,這是一個最小、最簡單的驅動,我去掉了其他的不相干代碼,儘量讓大家能了解驅動本身。

include <linux/moduleparam.h>include <linux/fs.h>include <linux/poll.h>include <linux/slab.h>define OK (0)34;hello_open\r\n&34;hello_write\r\n&34;hello_read\r\n&34;helloworld&34;register_chrdev_region ok \n&34;register_chrdev_region error n&34; hello driver init \n&34;GPL&KDIR := /lib/modules/`uname -r`/buildall: make -C $(KDIR) M=$(PWD)clean: rm -rf *.o *.ko *.mod.c *.symvers *.c~ *~endif

linux應用層程序在編譯的時候,需要連結c運行時庫和glibc庫。那驅動需不需要呢?

驅動也需要,但是驅動不能連結和使用應用層的任何lib庫,驅動需要引用內核的頭文件和函數。所以,編譯的時候需要指定內核源碼的地址。為了開發方便,也可以安裝內核開發包,之後引用這個內核開發包的目錄也可以。本例為:/lib/modules/4.4.0-31-generic/build

驅動文件和Makefile都有了,那麼接下來就可以編譯和加載驅動了!

在驅動目錄下,執行make進行編譯:

編譯出來的驅動文件,名稱為:helloDev.ko

接下來把這個驅動加載到內核:

helloDriver加載成功,列印出了:

[11837.379638] register_chrdev_region ok

[11837.379642] hello driver init

可見,執行insmod的時候,驅動文件裡的hello_init被調用了。

那驅動文件裡的hello_exit什麼時候會被調用呢?

可能聰明的你已經猜到了,那就是執行 rmmod helloDev.ko的時候。

本節來看驅動的測試。

我們需要編寫一個應用層的程序來對hello驅動進行測試:(test.c)

include <stdio.h>include <sys/select.h>34;hello world&34;/dev/hello&34;%d\r\n&34;open file error\r\n&34;open successe\r\n&34;%d %d\r\n&34;%s\r\n& mknod /dev/hello c 232 0

備註:這裡的232和0要跟驅動文件裡定義的主次設備號對應起來!

然後再次執行測試程序,發現成功了:

root@ubuntu:/home/jinxin/drivers/helloDev

然後再次執行dmesg查看驅動輸出,發現驅動裡的hell_open, hello_write, hello_read被依次調用了。

這就是一個完整的、最簡單的驅動的開發和測試的流程。

我想大家可能會有幾個問題:

1.驅動測試的時候為什麼要有設備文件,設備文件的作用是什麼?hello驅動的設備文件創建的時候為什麼要指定主設備號為232, 此設備號為0?

2.對/dev/hello執行write()調用的時候,怎麼就調用到了驅動裡的hello_write()裡去了?

3.測試程序的read和write的返回值為什麼都是0?

針對以上可能的問題,敬請期待《linux內核驅動第2講》,我會一一回答以上問題。

關注「技術簡說」,一步一步教你開發linux內核和驅動。

相關焦點

  • Linux內核學習:簡單的字符設備驅動
    學習Linux內核最好的入門方式之一是從字符設備驅動開始模仿(來自於《奔跑吧 Linux內核——入門篇》)。對於我們日常生活中存在的大量設備,如攝像頭,USB充電器,藍牙,Wi-Fi等,這些設備在電氣特性和實現原理均不相同,對Linux系統來說如何抽象和描述他們呢?Linux很早就根據設備共同特徵將其劃分為三大類型:1,字符設備;塊設備;網絡設備。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    本文引用地址:http://www.eepw.com.cn/article/257106.htm1.實驗目的該實驗是編寫最簡單的字符驅動程序,這裡的設備也就是一段內存,實現簡單的讀寫功能,並列出常用格式的Makefile以及驅動的加載和卸載腳本。讀者可以熟悉字符設備驅動的整個編寫流程。
  • 「正點原子FPGA連載」第二十一章字符設備驅動開發
    本章我們從Linux驅動開發中最基礎的字符設備驅動開始,重點學習Linux下字符設備驅動開發框架。本章會以一個虛擬的設備為例,講解如何進行字符設備驅動開發,以及如何編寫測試APP來測試驅動工作是否正常,為以後的學習打下堅實的基礎。字符設備驅動簡介字符設備是Linux驅動中最基本的一類設備驅動,字符設備就是一個一個字節,按照字節流進行讀寫操作的設備,讀寫數據是分先後順序的。比如我們最常見的LED、按鍵、IIC、SPI,LCD等等都是字符設備,這些設備的驅動就叫做字符設備驅動。
  • linux內核字符設備驅動到platform驅動架構改造過程
    關注」技術簡說「(13站同名),帶你由淺入深學習linux內核源碼。linux內核開發100講免費教程,每周二、四晚9點準時更新,敬請收看。進我主頁點」視頻「欄目即可觀看。改造前的字符設備驅動源碼:include <linux/moduleparam.h>include <linux/fs.h>include <linux/poll.h>include <linux/slab.h>define OK (0)34;hello_open
  • linux驅動開發第2講:應用層的write如何調用到驅動中的write
    關注「技術簡說」,帶你一步一步學習linux內核驅動。雖然應用層可以用open, write,read操縱一切,但是在內核裡面,卻需要不同的部分(或者說驅動)來真正實現這一切。本文接著,來講述linux應用程式中的write()函數如何調用到hello驅動裡的write()函數,並順道回答上一講最後的幾個遺留問題。
  • 「正點原子FPGA連載」第二十三章新字符設備驅動實驗
    經過前兩章實驗的實戰操作,我們已經掌握了Linux字符設備驅動開發的基本步驟,字符設備驅動開發重點是使用register_chrdev函數註冊字符設備,當不再使用設備的時候就使用unregister_chrdev函數註銷字符設備,驅動模塊加載成功以後還需要手動使用mknod命令創建設備節點。
  • 內核不斷升級 如何學習linux設備驅動
    【IT168技術】面對不斷升級的linux內核、GNU開發工具、linux環境下的各種圖形庫,很多linux應用程式開發人員和linux設備驅動開發人員即興奮,又煩躁。興奮的是新的軟體軟體、工具給我提供了更強大的功能,煩躁的是適應新軟體的特性、搭建新環境是一項非常繁瑣的事情。
  • A003 windows客戶端、Linux伺服器、Linux字符設備驅動程序 整體
    現在編寫一個簡單是示例,展現windows客戶端、Linux伺服器、Linux字符設備驅動程序,三者作為一個整體,完成某種功能。所要展現的功能是:Windows客戶端輸入一個出生年份,網絡傳輸給Linux伺服器,Linux伺服器又將該出生年份傳遞給Linux字符設備驅動程序內核模塊,Linux字符設備驅動程序計算出年齡,Linux伺服器讀取到該年齡值,併網絡傳輸給Windows客戶端顯示、其一、Linux字符設備驅動程序
  • linux系統和驅動中按鍵驅動的編寫詳解
    設備樹修改完後就可以編譯設備樹文件,然後用fsbl,u-boot,設備樹來製作boot.bin了。放到SD卡,啟動linux系統。接下來進入關鍵環節,key驅動的編寫。 2. 按鍵驅動代碼剖析 對於一個剛剛入門的人來說,其實了解了驅動的基本框架就好了。
  • 嵌入式Linux設備驅動開發之:字符設備驅動編程
    本文引用地址:http://www.eepw.com.cn/article/257111.htm設備驅動程序可以使用模塊的方式動態加載到內核中去。加載模塊的方式與以往的應用程式開發有很大的不同。以往在開發應用程式時都有一個main()函數作為程序的入口點,而在驅動開發時卻沒有main()函數,模塊在調用insmod命令時被加載,此時的入口點是init_module()函數,通常在該函數中完成設備的註冊。同樣,模塊在調用rmmod命令時被卸載,此時的入口點是cleanup_module()函數,在該函數中完成設備的卸載。
  • Linux環境下的USB攝像頭驅動開發
    ,攝像頭作為數字圖像採集的基礎,驅動程序的開發顯得尤為重要。作為作業系統內核與硬體設備之間的接口,驅動程序是否優良,直接影響著硬體設備能否正常、高效運轉。帶有USB(通用串行總線)接口的攝像頭因其具有支持熱插拔、接口通用性好、實時性強、較高的傳輸速率、低成本、易於擴展等優點而備受青睞。但是嵌入式系統中支持USB攝像頭的驅動程序很少,因此,研究和開發嵌入式環境下的USB攝像頭驅動程序具有應用價值和現實意義。
  • 「正點原子FPGA連載」第二十二章Linux LED驅動開發
    1)摘自【正點原子】領航者 ZYNQ 之linux驅動開發指南2)實驗平臺:正點原子領航者ZYNQ開發板3)平臺購買地址:https://item.taobao.com/item.htm?上一章我們詳細的講解了字符設備驅動開發步驟,並且用一個虛擬的chrdevbase設備為例帶領大家完成了第一個字符設備驅動的開發。
  • PWM在ARM Linux中的原理和蜂鳴器驅動實例開發
    1. 什麼是PWM? PWM(脈衝寬度調製)簡單的講是一種變頻技術之一,是靠改變脈衝寬度來控制輸出電壓,通過改變周期來控制其輸出頻率。
  • 免費《linux內核開發100講》更新時間、講解方式、內容大綱的約定
    關注」技術簡說「,帶你由淺入深學習linux內核源碼。linux內核開發100講教程全部免費,每周二、周四晚上九點準時更新,敬請收看。進我主頁點」視頻「欄目即可觀看。但是暫且先給出一部分大綱吧:編譯linux內核和文件系統打包文件系統並通過qemu啟動linux系統linux內核源碼各個目錄功能講解linux內核源碼編譯過程解析內核開發準備工作帶你實現史上最簡單的字符設備驅動應用層的write如何調用到驅動裡的write
  • 手把手教Linux驅動3-之字符設備架構詳解,建議收藏
    在內核中,和字符驅動程序相比,塊驅動程序具有完全不同的接口。塊設備文件(類型為b):任何網絡事物都需要經過一個網絡接口形成,網絡接口是一個能夠和其他主機交換數據的設備。接口通常是一個硬體設備,但也可能是個純軟體設備,比如迴環(loopback)接口。
  • 嵌入式Linux之我行——LED驅動在2440上的實例開發
    一、開發環境主機:VMWare--Fedora 9開發板:Mini2440--64MB Nand編譯器:arm-linux-gcc-4.3.2二、實現步驟
  • 手把手教Linux驅動3-之字符設備架構詳解,建議收藏
    字符設備驅動程序通常至少要實現open、close、read和write的系統調用。字符終端(/dev/console)和串口(/dev/ttyS0以及類似設備)就是兩個字符設備,它們能很好的說明「流」這種抽象概念。
  • 基於Linux平臺下的FPGA的ARM驅動開發方法
    隨著產品研發周期的逐步縮短,定製型產品的開發使FPGA在後面的應用面越來越廣。例如在2G和3G通信,以及以後的4G通信和wimax等等通信類設備中,它與DSP、MPU一起將大量出現在其中。S3C2410微處理器是一款由Samsung為手持設備設計的低功耗、高度集成的微處理器,採用272腳FBGA封裝,內含一個ARM920T內核和一些片內外圍設備。
  • 基於Linux系統的觸控螢幕驅動方案
    引言本文引用地址:http://www.eepw.com.cn/article/168330.htm觸控螢幕作為一種輸入設備,具有堅固耐用、反應速度快、節省空間、易於交流等優點,提供簡單、方便、自然的人機互動方式,目前被廣泛應用於工業控制、電子查詢
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    相信讀者已經對Linux作業系統有了一個概觀。對於一些具體命令。筆者決定需要用到的時候再做說明。現在我們來看看第二個概念:2、什麼是Linux設備驅動設備驅動最通俗的解釋就是驅使硬體設備行動。/linux/driver/tty/serial/samsung.c)driver是驅動程序的目錄。如圖所示:前文對linux設備驅動程序有了一個大概的描述。下面我們具體看一下linux下的驅動。