精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux驅動實踐:帶你一步一步編譯內核驅動程序

系統 Linux
今天給大家分享一些筆記本里的一些存貨: Linux 系統中的驅動和中斷相關。在這部分,會以 GPIO 為例子,重點描述其中的關鍵節點。

[[434709]]

別人的經驗,我們的階梯!

大家好,我是道哥。今天給大家分享一些筆記本里的一些存貨: Linux 系統中的驅動和中斷相關。

大概會用 6~7 篇的文章,由淺入深的為大家介紹Linux 中驅動程序的編寫方法。

文章的順序,也是我之前自己學習時的順序。

以前的學習記錄比較零散,現在只是把它們按照一定的順序重新梳理一下。

這幾篇文章,理論知識會少一些,更注重實際的操作。

我會把操作用引導的代碼,全部上傳到網盤上,在文末有下載說明。

只要根據文中介紹的步驟進行操作,就一定可以操作成功。

學習的困惑

記得以前我在開始學習驅動開發的時候,找來很多文章、資料來學習,但是總是覺得缺少了點全局視角。

就好像:我想看清一座山的全貌,但總是被困在一個、又一個山谷中一樣。

主要的困惑有 3 點:

  1. 每一篇文章的介紹都是正確的,但是如果把很多文章放在一起看,就會發現怎么說的都不一樣啊?
  2. 有些文章注重函數的介紹,但是缺乏一個全局的視角,從整體上來觀察驅動程序的結構;
  3. 對于一個新手來說,能夠邊學習、邊實踐,這是最好的學習方式,但是很多文章不會注意這方面。雖然文章內容很漂亮,但是不知道怎么去實踐、驗證。

因此,這幾篇文章我們就從最簡單的驅動模塊編譯開始,然后介紹字符設備驅動程序。

在這部分,會以 GPIO 為例子,重點描述其中的關鍵節點。

最后再介紹在中斷處理程序中,如何利用信號量、小任務、工作隊列,把內核事件傳遞到應用層來處理。

作為第一個開篇文章,從最簡單的內核編譯開始。

實際操作一下:如何把一個最簡單的驅動程序(hello),按照 2 種方式進行編譯:

  1. 編譯進內核;
  2. 編譯為一個獨立的驅動模塊;

實踐環境

為了便于測試,以下操作都是在 Ubuntu16.04 操作系統里完成的。

編譯Linux驅動程序,肯定需要內核源碼,這里選擇的是 linux-4.15 版本,可以在官網下載。

文末有下載方式。

下載之后,把linux-4.15.tar.gz解壓到Ubuntu中任意目錄即可,例如:解壓到~/tmp/目錄下:

  1. $ tar -zxvf linux-4.15.tar.gz -C ~/tmp/ 

編譯進內核

創建驅動程序目錄

linux 中的驅動,一般都放在 linux-4.15/drivers/ 目錄下,因此在這個目錄中創建一個hello文件夾。

  1. $ mkdir linux-4.15/drivers/hello 

對于一個驅動來說,最重要的就是3個文件:

  1. 源代碼
  2. Kconfig
  3. Makefile

只要按照固定的格式來編寫這3個文件,linux內核的編譯腳本就可以確保把我們的驅動程序編譯進去。

創建源文件

首先是源碼,在hello文件夾中創建源文件 hello.c:

  1. $ cd linux-4.15/drivers/hello 
  2. $ touch hello.c 

源文件hello.c的內容是:

  1. #include <linux/module.h> 
  2. #include <linux/init.h> 
  3.  
  4. // 當驅動被加載的時候,執行此函數 
  5. static int __init hello_init(void) 
  6.     printk(KERN_ALERT "welcome, hello"\n"); 
  7.     return 0; 
  8.  
  9. // 當驅動被卸載的時候,執行此函數 
  10. static void __exit hello_exit(void) 
  11.     printk(KERN_ALERT "bye, hello\n"); 
  12.  
  13. // 版權聲明 
  14. MODULE_LICENSE("GPL"); 
  15.  
  16. // 以下兩個函數屬于 Linux 的驅動框架,只要把驅動兩個函數地址注冊進去即可。 
  17. module_init(hello_init); 
  18. module_exit(hello_exit); 

有兩個小地方注意一下:

  1. 在內核中,打印函數是 printk,而不是 printf;
  2. 打印信息的級別有好幾個,從 DEBUG 到 EMERG,這里使用的是 KERN_ALERT,方便查看打印信息。

創建 Kconfig 文件

這個文件是用來對內核進行配置的,當執行 make menuconfig 指令的時候,這個文件就被解析。

先創建文件:

  1. $ cd linux-4.15/drivers/hello 
  2. $ touch Kconfig 

添加如下內容:

  1. config HELLO 
  2. tristate "hello driver" 
  3. help 
  4.   just a simplest driver. 
  5. default y 

第一行內容 config HELLO ,在執行配置的時候,將會生成一個變量 CONFIG_HELLO ,而這個變量,將會在編譯的時候,被 Makefile 引用。

最后一行的 default y ,就表示把 CONFIG_HELLO 的值設置成 y,從而讓這個驅動被編譯到內核中。

現在,hello驅動中的KConfig配置文件已經準備好了,但是還需要這個配置文件登記到 Linux 內核的整體配置文件中。

也就是把它登記在 linux-4.15/drivers/Kconfig 文件的末尾:

  1. source "drivers/hello/Kconfig" 
  2.  
  3. endmenu   // 加在這一句的上面 

現在,可以來執行下面指令,看一下具體的配置界面:

  1. $ cd linux-4.15/ 
  2. $ make distclean 
  3. $ make ARCH=x86_64 defconfig 
  4. $ make ARCH=x86_64 menuconfig 

第2條指令,是用來把默認的配置保存到當前目錄下的 .config 配置文件,也就是把一個默認的配置文件復制過來,作為我們自己的配置文件。

以后再修改配置參數時,修改的內容就會存儲在 .config 文件中,

第3條指令,是用來配置內核的,可以進入 Device Drivers 菜單,然后在最底層看到我們的 hello driver 被標記成星號, 這表示被編譯進內核。

按向下方向鍵,把高亮定位到 Device Drivers ---> ,然后敲回車鍵,進入到 Device Drivers 的配置界面。

按向下方向鍵,一直到最后一個條目,就可以看到我們的 hello 驅動了,如下:

可以看到 hello driver 前面顯示的是型號 *,這表示:該驅動將會編譯進內核。

我們可以按下空格鍵試一下,會在三種標記中切換:型號,M,空值。M 標記意思是編譯成驅動模塊。

我們這里選擇星號(編譯進內核),然后按下右方向鍵,最下方的幾個按鍵的焦點移動到按鈕上:

按下回車鍵,就會彈出保存對話框,選擇默認保存文件 .config 即可,然后在按鈕高亮的時候,按下回車鍵即可保存。

此時,在彈出的確認窗口中,選擇 ,按下回車鍵即可:

此時,返回到 Device Drivers 的配置界面,在最下面的按鈕中,選擇讓 高亮,然后一路退出即可。

創建 Makefile 文件

Makefile 文件是make工具的腳本,首先創建它:

  1. $ cd linux-4.15/drivers/hello 
  2. $ touch Makefile 

其中的內容只有一行:

  1. obj-$(CONFIG_HELLO) += hello.o 
  1. CONFIG_HELLO 可以看做一個變量,在編譯的時候,這個變量的值可能是:y, n 或者 m。
  2. 在剛才的 Kconfig 參數配置中,CONFIG_HELLO 被設置為 y,于是這句話就被翻譯成:obj-y += hello,表示把 hello 驅動編譯進內核。

現在,hello驅動程序的Makefile已經創建好了,我們還要讓linux內核的編譯框架知道這個文件才行。

在文件 linux-4.15/drivers/Makefile 中的末尾,添加如下內容:

  1. obj-$(CONFIG_HELLO)    += hello/ 

編譯

萬事俱備,只欠編譯!依次執行如下指令:

  1. $ cd linux-4.15/ 
  2. $ make -j4 

make指令執行結束之后,編譯得到的內核中(vmlinux)就包含了我們的hello驅動。

編譯為驅動模塊

編譯為驅動模塊,也有兩種 操作方式:

編譯所有的驅動模塊

  1. 在執行 make ARCH=x86_64 menuconfig 指令的時候,把 hello 配置成 M;
  2. 然后在 linux-4.15 中執行編譯模塊指令:make -j4 modules。

編譯成功之后,就可以得到文件: linux-4.15/drivers/hello/hello.ko。

這樣的編譯指令,是把所有的模塊都編譯了一次(在輸出信息中,可以看到編譯了很多模塊)。

只編譯 hello 這一個驅動模塊

另外一種編譯驅動模塊的方式是:進入hello目錄,只編譯這一個驅動模塊。

這種編譯方法,就需要修改hello目錄下的Makefile文件了,內容如下:

可以把 hello 目錄下的所有文件刪除,只保留源文件 hello.c,然后新建 Makefile 文件。

  1. ifneq ($(KERNELRELEASE),) 
  2.         obj-m := hello.o 
  3. else 
  4.         KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
  5.         PWD := $(shell pwd) 
  6. default
  7.         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 
  8. clean: 
  9.         $(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean 
  10. endif 

然后,在hello文件夾中執行make指令,即可得到驅動模塊 hello.ko 。

驗證一下

加載驅動:

  1. $ cd linux-4.15/drivers/hello 
  2. $ sudo insmod ./hello.ko 

此時終端窗口是沒有任何輸出的,需要輸入指令 dmesg | tail ,可以看到 hello_init 函數的輸出內容:

卸載驅動:

  1. $ sudo rmmod hello 

再次輸入 dmesg | tail ,可以看到 hello_exit 函數的輸出內容:

本文轉載自微信公眾號「IOT物聯網小鎮」

 

責任編輯:姜華 來源: IOT物聯網小鎮
相關推薦

2021-11-22 08:14:23

Linux Linux驅動Linux 系統

2019-03-05 14:09:27

Docker存儲容器

2019-07-09 15:23:22

Docker存儲驅動

2018-12-24 10:04:06

Docker存儲驅動

2019-11-04 10:06:19

MySQL索引

2022-08-29 15:19:09

CSS煙花動畫

2009-07-06 19:29:37

云計算私有云服務器虛擬化

2010-07-12 17:10:23

Android應用程序

2017-09-13 09:05:29

iOS11iOS蘋果

2015-05-25 09:51:55

Azure混合云平臺VPN技術

2019-09-18 07:20:34

深度學習人臉識別人工智能

2011-06-07 16:03:48

匿名SQL Server

2018-03-07 15:24:41

PythonMySQL

2013-03-18 16:09:27

JavaEEOpenfire

2013-11-11 13:24:21

cocos2dx 2.Android編譯

2012-03-22 10:33:33

思杰XenDesktop

2009-12-18 16:27:43

Cisco路由器配置

2017-09-28 09:40:36

圖像分類準確率

2022-09-30 15:37:19

Web網站服務器

2009-12-17 08:57:28

Windows 7磁盤分區
點贊
收藏

51CTO技術棧公眾號

欧美日韩一区综合| 日韩美女视频在线观看| 日韩无码精品一区二区| 亚洲精品**中文毛片| 欧美国产综合一区二区| 成人做爰66片免费看网站| 日韩精品1区2区| 欧美gay男男猛男无套| 精品免费日韩av| 黄色三级视频片| 天堂av资源在线观看| 久久久久久久久一| 成人精品一二区| 久草视频在线免费| 在线观看的日韩av| 俺去啦;欧美日韩| 91视频在线网站| 91精品久久久久久综合五月天| 色94色欧美sute亚洲线路二| 日韩精品在线观看av| 在线免费观看黄色av| av在线一区二区三区| 成人羞羞国产免费| 日本视频www色| 亚洲三级色网| 九九热精品视频国产| 国产毛片欧美毛片久久久| 精品亚洲自拍| 精品乱人伦一区二区三区| 日韩在线不卡一区| 亚洲精品粉嫩美女一区| 五月婷婷综合在线| 欧美图片激情小说| 香蕉久久aⅴ一区二区三区| 国产精品国产精品国产专区不片 | 99精品视频在线免费播放| 欧美日韩国产激情| 亚洲人精品午夜射精日韩| av文字幕在线观看| 综合精品久久久| 亚洲欧美日韩在线综合| 国产精品久久久久一区二区国产| 99国产精品一区| 国产精品入口免费| 亚洲精品中文字幕成人片 | 日批在线观看视频| 超碰精品在线观看| 欧美岛国在线观看| 最新国产精品自拍| 成人av婷婷| 精品久久久久久久人人人人传媒| 麻豆传媒在线看| 免费观看性欧美大片无片| 欧美一区三区二区| 91免费视频污| 一区二区亚洲视频| 亚洲缚视频在线观看| 久久精品aⅴ无码中文字字幕重口| 久久综合给合| 精品少妇一区二区三区视频免付费| 香蕉视频色在线观看| 日韩在线观看中文字幕| 日韩欧美国产小视频| 丰满人妻一区二区三区免费视频棣| av成人男女| 日韩精品极品视频免费观看| 波多野结衣a v在线| 精品理论电影在线| 最近免费中文字幕视频2019| 美女视频久久久| 女人香蕉久久**毛片精品| 欧美富婆性猛交| 精品午夜福利在线观看| 中文在线不卡| 国产精品一区二区性色av| 一起草av在线| 国产91精品入口| 久久久久久久久久久久久久一区| 黄色av网址在线免费观看| 国产精品天天看| 久久久久久久久久久综合| 国产伦理精品| 欧美专区日韩专区| 亚洲精品久久久久久| 欧美天堂社区| 自拍偷拍亚洲在线| 亚洲国产成人精品综合99| 国产精品亚洲欧美| 国产深夜精品福利| 日批视频免费播放| 国产精品久久久久久久久久久免费看| 午夜久久久久久久久久久| av在线最新| 欧美剧在线免费观看网站| 日本性生活一级片| 久久综合88| 97视频国产在线| 国产又黄又粗又猛又爽| 99国产精品久久久久久久久久| 日本精品二区| 欧美精品videossex少妇| 色狠狠av一区二区三区| www.四虎精品| 日韩理论片av| 77777亚洲午夜久久多人| 国产精品视频无码| xnxx国产精品| 欧美又粗又长又爽做受| 91九色综合| 日韩精品免费在线视频观看| 国产女人18水真多毛片18精品| 国产精品视频久久一区| av成人在线电影| 日本电影全部在线观看网站视频| 亚洲国产日韩一级| 911av视频| 国产最新精品| 欧美一区二区三区艳史| 成人毛片视频免费看| 国产精品久线观看视频| 无遮挡又爽又刺激的视频| 都市激情久久| 欧美黑人视频一区| 91在线视频国产| 中文字幕欧美日韩一区| 国产裸体舞一区二区三区| 国产精品17p| 欧美激情三级免费| 99久久精品国产色欲| 国产精品乱码一区二三区小蝌蚪| 日本中文字幕片| 三级小说欧洲区亚洲区| 亚州av一区二区| 高清国产mv在线观看| 亚洲情趣在线观看| 国产美女18xxxx免费视频| 日韩一级毛片| 国产美女精品免费电影| yw视频在线观看| 欧美综合视频在线观看| www.色天使| 媚黑女一区二区| 麻豆av一区| 国模套图日韩精品一区二区| 日韩精品高清在线观看| www.欧美色| 日本一区二区三区国色天香| 宅男噜噜噜66国产免费观看| 国内精品久久久久久久久电影网 | 97精品久久久久中文字幕| 久久艹国产精品| jizz性欧美2| 国模叶桐国产精品一区| 色香蕉在线视频| 狠狠躁夜夜躁人人爽超碰91| 无套内谢大学处破女www小说| 欧美亚洲一级| 午夜一区二区三区| 欧美91在线|欧美| 久热99视频在线观看| 精品久久人妻av中文字幕| 亚洲最新视频在线观看| 69亚洲乱人伦| 久久久久国产精品午夜一区| 日韩在线电影一区| 四虎国产精品免费久久| 欧美精品日韩www.p站| 蜜桃91麻豆精品一二三区| 午夜精彩视频在线观看不卡| 中文字幕被公侵犯的漂亮人妻| 日韩av中文字幕一区二区三区 | 亚洲性视频h| 麻豆av一区二区三区| 小明成人免费视频一区| 久久影视免费观看| 日韩在线观看视频一区二区三区| 色综合欧美在线视频区| 极品尤物一区二区| 国产不卡高清在线观看视频| 各处沟厕大尺度偷拍女厕嘘嘘| 狠狠操综合网| 97操在线视频| 日韩精品三区| 欧美xxxx做受欧美.88| 日批视频在线播放| 精品视频免费看| 6080国产精品一区二区| 国产欧美韩日| 久久uomeier| 最近中文字幕2019免费| 亚洲av永久纯肉无码精品动漫| 亚洲成人精品一区| 91视频最新网址| av资源网一区| 国内国产精品天干天干| 中国女人久久久| 一区二区三区四区国产| 黄色网一区二区| 国产又爽又黄的激情精品视频| av中文字幕在线看| www.欧美精品一二三区| 婷婷五月综合久久中文字幕| 欧美视频一区二| 日韩精品在线不卡| 亚洲欧美日韩久久| 非洲一级黄色片| www..com久久爱| 亚洲高清在线不卡| 日日夜夜免费精品视频| 欧美精品卡一卡二| 影音先锋日韩在线| 日韩欧美三级一区二区| 久久久久观看| 99porn视频在线| 九九九伊在线综合永久| 97色在线观看| 国产啊啊啊视频在线观看| 日韩在线中文字| 国产小视频免费在线观看| 精品国产精品网麻豆系列| 91久久久久国产一区二区| 日本韩国视频一区二区| 日韩少妇高潮抽搐| 一区二区三区国产豹纹内裤在线 | 一本一道人人妻人人妻αv| 性感美女久久精品| 麻豆视频在线观看| 亚洲欧美日韩中文播放| 99热这里只有精品4| 日本一区二区三区在线不卡| 好吊日免费视频| www..com久久爱| 中文字幕人妻一区二区三区| 国产风韵犹存在线视精品| 男人插女人下面免费视频| 亚洲一区久久| 国产精品秘入口18禁麻豆免会员| 亚洲天堂黄色| 久久在线中文字幕| 精品91在线| www.好吊操| 亚洲国产一区二区三区a毛片 | 99在线视频免费| 国产午夜久久久久| xxxx日本黄色| 欧美激情一区二区三区| 色www亚洲国产阿娇yao| 中文字幕乱码久久午夜不卡| 久久久久亚洲AV成人无在| 中文字幕乱码亚洲精品一区 | 欧美大片aaaa| 日本黄色播放器| 欧美成人有码| 精品久久久久久无码中文野结衣| 亚洲人成久久| 久久久免费视频网站| 美女精品在线| 黑人粗进入欧美aaaaa| 免费日本视频一区| 蜜桃福利午夜精品一区| 国产一区二区在线观看免费 | 亚洲成av人片在线观看www| 成人免费观看网站| 欧美美女在线直播| 欧美精品与人动性物交免费看| 欧美人与牛zoz0性行为| 视频一区不卡| 一二三区不卡| 丝袜人妻一区二区三区| 麻豆精品网站| 中文字幕精品一区二区三区在线| 国产精品一级黄| 女尊高h男高潮呻吟| 欧美激情综合网| 欧美日韩国产精品综合| 精品久久久久久久大神国产| www.久久久久久久| 日韩一级黄色大片| 五月婷婷久久久| 色琪琪综合男人的天堂aⅴ视频| 18+激情视频在线| 欧美在线视频网| 日韩大陆av| 国产视频一区二区三区四区| 精品一区电影| 男人天堂网站在线| 久久亚洲欧洲| 黑人巨大猛交丰满少妇| 91麻豆swag| 欧美色图亚洲视频| 一道本成人在线| 国产99视频在线| 亚洲欧美日韩中文在线| 色a资源在线| 国产成人中文字幕| 亚洲一二av| 亚洲国产另类久久久精品极度| 黄色精品网站| 亚洲一级免费在线观看| 97超碰欧美中文字幕| 麻豆网址在线观看| 色琪琪一区二区三区亚洲区| 亚洲欧美激情国产综合久久久| 中文字幕日韩有码| 欧美久久天堂| 99久久精品免费看国产四区 | 麻豆国产一区二区三区四区| 欧美裸体网站| 136国产福利精品导航网址| 亚洲小视频网站| 国产性色一区二区| 日本免费一二三区| 欧美一区二区久久久| 波多野结衣在线网站| 7777精品久久久久久| 日韩高清二区| 中国成人在线视频| 日本欧洲一区二区| 加勒比精品视频| 一区二区三区在线高清| 91午夜交换视频| 最新69国产成人精品视频免费| 色是在线视频| 国产区一区二区| 欧美日本三区| 青青草精品在线| 亚洲三级电影网站| 在线免费看91| 视频直播国产精品| 香蕉视频亚洲一级| 久久久久久久久四区三区| 激情视频一区二区三区| 日本人妻一区二区三区| 亚洲美腿欧美偷拍| 99视频在线观看免费| 久久精品欧美视频| 亚洲成人1区| 亚洲美女搞黄| 激情五月激情综合网| 中文字幕91视频| 欧美日韩高清不卡| 在线免费看黄| 成人免费网站在线观看| 午夜精品毛片| 久久精品国产99久久99久久久| 亚洲四区在线观看| 国产成人a人亚洲精品无码| 久久综合久中文字幕青草| 精品国产乱码久久久久久樱花| 国产高清免费在线| 国产麻豆精品在线| 黄色一级视频免费| 亚洲国产精品网站| 韩国美女久久| 亚洲精品乱码久久久久久蜜桃91 | 牛夜精品久久久久久久99黑人| 国产裸体视频网站| 亚洲二区在线观看| 天堂av中文字幕| 国产成人精品在线| 日韩欧美午夜| 992kp免费看片| 亚洲444eee在线观看| 青青青手机在线视频观看| 国产精品av电影| 99久久综合| 国产高潮视频在线观看| 欧美性猛交xxxx久久久| 北条麻妃在线| 波多野结衣成人在线| 欧美亚洲在线| 91传媒免费观看| 精品国产一区二区三区忘忧草| 成年男女免费视频网站不卡| 日韩国产一区久久| 国产中文一区二区三区| 日韩精品视频播放| 一本大道亚洲视频| 视频一区日韩| 日韩视频第二页| 中文字幕一区二区在线播放 | 成人免费观看男女羞羞视频| 亚洲影院在线播放| 久久久国产精品x99av| 国产精品丝袜在线播放| 日本黄大片一区二区三区| 亚洲综合一二区| 国产乱子伦三级在线播放| 97视频中文字幕| 久久久精品五月天| 欧美三级在线免费观看| 亚洲欧美一区二区三区久久| 国产一区 二区| 男人的天堂99| 樱桃视频在线观看一区| 川上优的av在线一区二区| 国产高清精品一区二区| 美女在线视频一区| 中文字幕在线观看视频网站| 久久婷婷国产麻豆91天堂|