精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品亚洲免费视频| 欧美女优在线视频| 亚洲高清一区二区三区| 国模精品一区二区三区| 波多野结衣一区二区三区在线| 色综合狠狠操| 日韩av在线不卡| www午夜视频| 123区在线| 国产精品理论在线观看| 国产日韩精品推荐| 91禁在线观看| 性伦欧美刺激片在线观看| 日韩一中文字幕| 久久中文字幕人妻| 久久av网站| 欧美主播一区二区三区| 国产精品videossex国产高清| 久久久久久女乱国产| 国产在线视频一区二区| 欧美中文字幕视频在线观看| 亚洲熟女www一区二区三区| 免费久久精品| 精品福利一二区| 在线免费看污网站| 亚洲电影有码| 欧美日韩国产一区二区| 一本色道久久88亚洲精品综合| 国产大片在线免费观看| 成人av网站在线观看免费| 成人免费观看网址| 日韩欧美国产另类| 久久精品一本| 国模精品视频一区二区| 成人在线观看高清| 日韩久久综合| 在线亚洲国产精品网| 国产网站无遮挡| 韩国女主播一区二区三区| 91精品国产高清一区二区三区| 欧美精品aaaa| 二吊插入一穴一区二区| 精品久久中文字幕| 99色这里只有精品| 国产啊啊啊视频在线观看| 亚洲三级电影全部在线观看高清| 日韩高清dvd| 黄色片免费在线| 久久久亚洲精品石原莉奈| 久久精品日产第一区二区三区精品版 | 欧美激情一区二区三区久久久 | 中文字幕在线视频播放| 色悠久久久久综合先锋影音下载| 欧美久久久久免费| 国产又大又黄又猛| 999精品视频在线观看| 欧美日韩精品欧美日韩精品一| 福利在线一区二区三区| 超碰这里只有精品| 欧美日韩一区 二区 三区 久久精品| 亚洲欧美自偷自拍另类| 欧美电影在线观看网站| 欧美日韩精品专区| 青青草原国产在线视频| 成人精品视频在线观看| 日韩一二三区不卡| 中文字幕天堂av| 亚洲va久久| 国产亚洲精品久久久优势| 1024手机在线观看你懂的| 国产高清一区| 久久久亚洲网站| 超碰中文字幕在线| 日韩成人伦理电影在线观看| 国产精品午夜国产小视频| 国产一区二区视频免费观看 | 一起草在线视频| 亚洲专区视频| 日韩一区二区在线视频| 久久免费播放视频| 久久av在线| 成人精品一区二区三区电影黑人 | 亚洲色图50p| 五月天色婷婷丁香| 亚洲美女黄色| 国产精品久久久久秋霞鲁丝| 99久久精品日本一区二区免费| 粉嫩欧美一区二区三区高清影视| 久久亚洲综合网| 免费高清完整在线观看| 亚洲一区二区三区中文字幕在线 | 国产一区二区精品久久99| 国产二区不卡| 午夜伦理在线| 污片在线观看一区二区| 一本色道久久亚洲综合精品蜜桃| 91精品短视频| 在线观看精品自拍私拍| 久青草免费视频| 日韩电影在线一区二区| 成人91视频| 69av亚洲| 欧美性猛交xxxx偷拍洗澡| 亚洲一区二区在线视频观看| 清纯唯美亚洲经典中文字幕| 精品国产欧美一区二区五十路| 国产精品自拍视频一区| 麻豆精品新av中文字幕| 九九九九九精品| 国产理论在线观看| 91久久精品一区二区三| 无码人妻一区二区三区精品视频| 国产影视精品一区二区三区| 久久久欧美精品| 国产又粗又猛又爽| 久久精品男人天堂av| 97在线免费视频观看| 国产精品99精品一区二区三区∴| 国产视频在线观看一区二区| 欧美交换国产一区内射| 精品一区二区三区日韩| 欧美三日本三级少妇三99| 里番在线播放| 日韩视频在线观看一区二区| jizz18女人高潮| 久久精品主播| 久久久久se| gogo高清在线播放免费| 欧美一级理论性理论a| 四虎成人免费影院| 久久一区二区三区四区五区| 国产一区二区精品在线| 在线观看操人| 欧美一区二区三区的| а天堂中文在线资源| 久久欧美肥婆一二区| 激情五月综合色婷婷一区二区| 在线黄色网页| 日韩欧美中文一区二区| 最新一区二区三区| 久久99精品国产.久久久久久| 日韩精品福利视频| 三级成人在线| 在线视频中文亚洲| 正在播放亚洲精品| 欧美国产一区二区| 久久久精品麻豆| 日韩欧美不卡| 91精品久久久久久久久久久久久| av在线免费观看网| 欧美日本国产一区| 国产suv精品一区二区68| 精品一区二区三区视频在线观看| 中文字幕成人一区| 精品麻豆剧传媒av国产九九九| 久久久999精品视频| 国产乱人乱偷精品视频a人人澡 | 蜜臀av.com| 日韩欧美另类中文字幕| 欧美第一黄色网| 可以免费观看的毛片| 亚洲v日本v欧美v久久精品| 涩视频在线观看| 国产精品资源| 日韩欧美一区二区视频在线播放| a成人v在线| 免费91麻豆精品国产自产在线观看 | 久久久99999| 国产成人免费视频一区| 成人网站免费观看入口| 欧美人妖在线| 91精品视频一区| 国产一二三在线| 亚洲天堂视频在线观看| 亚洲性在线观看| 亚洲国产一区二区三区青草影视| 国产网站无遮挡| 久久国产精品99久久人人澡| 激情五月六月婷婷| 国产精品亚洲人成在99www| 国产精品一区二区三区成人| 91精选在线| 日韩国产一区三区| 中文字幕人妻精品一区| 亚洲午夜精品网| 人妻av无码一区二区三区| 久久99精品久久久| 91九色在线观看视频| 93在线视频精品免费观看| 成人xxxxx色| 国产成人精品一区二三区在线观看 | 99在线观看免费视频精品观看| 日本高清一区| jizz性欧美23| 国产精品自拍小视频| bl在线肉h视频大尺度| 亚洲图片欧美日产| 性一交一乱一透一a级| 色狠狠一区二区三区香蕉| www深夜成人a√在线| 久久夜色精品一区| 原创真实夫妻啪啪av| 在线午夜精品| a级黄色片网站| 亚洲区小说区| 国产精品高清一区二区三区| 草民电影神马电影一区二区| 97视频在线免费观看| dj大片免费在线观看| 伊人久久男人天堂| 五月婷婷综合久久| 日韩欧美综合一区| 亚洲一区中文字幕在线| 狠狠躁18三区二区一区| 强行糟蹋人妻hd中文| 中日韩免费视频中文字幕| 最近日本中文字幕| 国产盗摄视频一区二区三区| 日韩爱爱小视频| 母乳一区在线观看| 欧美成人三级在线视频| 综合亚洲视频| 中文字幕精品—区二区日日骚| 视频一区欧美| 久久精品国产一区二区三区不卡| 成人三级av在线| 亚洲mm色国产网站| 欧美三级电影网址| 国产精品精品久久久| 欧美电影免费观看网站| 97超级碰碰人国产在线观看| 久久不射影院| 欧美国产亚洲视频| www免费视频观看在线| 深夜福利一区二区| eeuss影院在线观看| 国产亚洲精品美女久久久| 久久综合九色综合久| 亚洲欧美中文日韩在线| 欧美在线一卡| 日韩电影免费观看中文字幕| 日韩在线观看视频一区二区三区| 精品免费日韩av| 丰满熟妇人妻中文字幕| 日韩久久久精品| 亚洲av无码一区二区乱子伦| 欧美成va人片在线观看| 亚洲黄色a级片| 精品不卡在线视频| 日本精品999| 亚洲精品久久久久中文字幕二区| 午夜成人鲁丝片午夜精品| 亚洲国产精品网站| 日本福利在线观看| 亚洲欧美日韩图片| 国产日韩精品在线看| 这里只有精品丝袜| 黄色av电影在线播放| 欧美大胆a视频| caoporn-草棚在线视频最| 欧美亚洲另类视频| 91超碰碰碰碰久久久久久综合| 国产精品美女主播| 日韩五码电影| 99在线热播| 日韩超碰人人爽人人做人人添| 欧美精品国产精品久久久| av中文一区| 国产树林野战在线播放| 黄页网站一区| 激情五月开心婷婷| 久久精品国产在热久久| 久久aaaa片一区二区| av不卡在线观看| 国产综合精品久久久久成人av| 国产精品麻豆久久久| 欧美精品成人久久| 欧美日韩一区二区三区| 在线免费av网| 日韩女优制服丝袜电影| 亚洲色图 校园春色| 中文字幕在线精品| 免费看电影在线| 秋霞av国产精品一区| 欧美日韩视频免费看| 国产精品视频免费一区| 国产不卡一区| 国产91视频一区| 日韩国产欧美在线视频| 欧美专区第二页| 久久九九国产精品| 麻豆国产尤物av尤物在线观看| 欧美日韩一区二区免费在线观看 | 男女啪啪的视频| 在线亚洲观看| 四虎成人在线播放| 国产午夜精品久久| 国产午夜小视频| 在线电影欧美成精品| 天堂网在线观看视频| 深夜福利国产精品| xxxxxx欧美| 97人人澡人人爽| 不卡在线一区二区| 日本中文字幕网址| 国产麻豆成人精品| 在线观看日本中文字幕| 亚洲成精国产精品女| 国产精品久久影视| 亚洲欧美一区二区三区久久| 牛牛在线精品视频| 国产一区在线播放| 久久av影视| 2018日日夜夜| 国产成人欧美日韩在线电影| 国产精品视频看看| 色哦色哦哦色天天综合| 特黄视频在线观看| 不卡av在线网站| 四虎国产精品免费久久5151| 久久66热这里只有精品| 欧美激情综合| 8x8x成人免费视频| 国产精品毛片久久久久久| 日韩久久中文字幕| 亚洲电影免费观看高清完整版在线观看 | 黄色片免费在线观看| 国产精品电影一区| 要久久电视剧全集免费 | 免费av成人在线| 国产精品jizz| 午夜精品福利一区二区三区蜜桃| 不卡av中文字幕| 九九视频直播综合网| 国产精品一区二区精品视频观看| 亚洲乱码一区二区三区| 日韩成人精品视频| 一级黄色录像毛片| 91福利小视频| 成在在线免费视频| 国产精品免费网站| 日韩精品一区二区三区免费观看| 成人性生生活性生交12| 国产亚洲一本大道中文在线| 久久国产视频一区| 亚洲欧洲日本专区| 日韩pacopacomama| 日韩三级电影网站| 石原莉奈一区二区三区在线观看| wwwwxxxx国产| 欧美亚洲国产怡红院影院| 国产女人在线视频| 国产福利成人在线| 成人精品电影| 亚洲精品永久视频| 亚洲人成在线播放网站岛国| 国产av无码专区亚洲a∨毛片| 久久伊人精品天天| 91综合精品国产丝袜长腿久久| 久久99中文字幕| 337p粉嫩大胆色噜噜噜噜亚洲| www.久久久久久久| 色999日韩欧美国产| 91精品网站在线观看| 激情成人开心网| 2019国产精品| 中文字幕人妻丝袜乱一区三区| 久久好看免费视频| **爰片久久毛片| 国产成人黄色片| 国产精品日韩成人| 国产99视频在线| 欧美一级免费看| 不卡在线一区| 性xxxxxxxxx| 色噜噜久久综合| www视频在线免费观看| 久久精精品视频| 久久电影网电视剧免费观看| 亚洲av无码一区二区三区在线| 亚洲成人网在线| 四虎成人在线| 久久人妻无码一区二区| 久久综合精品国产一区二区三区| 中文字幕在线观看免费| 欧美夫妻性生活视频| 精品一区免费| 国产精品嫩草影视| 色综合咪咪久久| 在线免费观看污| 日韩精品欧美专区| 丁香桃色午夜亚洲一区二区三区| 无码人妻精品一区二区三区9厂| 久久精视频免费在线久久完整在线看| 成人av激情人伦小说| 亚洲 欧美 日韩系列| 亚洲国产色一区| 毛片网站在线免费观看| 久久香蕉综合色| 国产aⅴ精品一区二区三区色成熟|