在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式Linux模塊編譯步驟詳細概述讓你少走彎路

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:易水寒 ? 2018-08-12 10:56 ? 次閱讀

今天將直接了當的帶你進入linux的模塊編譯,當然在介紹的過程當中,我也會添加一些必要的注釋,以便初學者能夠看懂。之所以要有這篇文章,主要是因為從書本上學的話,可能要花更長的時間才能學會整個過程,因為看書的話是一個學習過程,而本文更像是一個培訓。所以實踐性和總結性更強。讀完本文后你將會學到編譯一個模塊和模塊makefile的基本知識。以及加載(卸載)模塊,查看系統消息的一些知識。如果你已經是一個linux模塊編譯高手,您也可以指點指點哪里說的不足。

第一步:準備源代碼

首先我們還是要來編寫一個符合linux格式的模塊文件,這樣我們才能開始我們的模塊編譯。假設我們有一個源文件mymod.c。它的源碼如下:

mymod.c

1. #include /* 引入與模塊相關的宏 */

2. #include /* 引入module_init() module_exit()函數 */

3. #include /* 引入module_param() */

4

5. MODULE_AUTHOR("Yu Qiang");

6. MODULE_LICENSE("GPL");

7

8. static int nbr = 10;

9. module_param(nbr, int, S_IRUGO);

10.

11. static int __init yuer_init(void)

12.{

13. int i;

14. for(i=0; i

15. {

16. printk(KERN_ALERT "Hello, How are you. %d ", i);

17. }

18. return 0;

19.}

20.

21.static void __exit yuer_exit(void)

22.{

23. printk(KERN_ALERT"I come from yuer's module, I have been unlad. ");

24.}

25.

26. module_init(yuer_init);

27. module_exit(yuer_exit);

我們的源文件就準備的差不多了,這就是一個linux下的模塊的基本結構。第9行是導出我們的符號變量nbr。這樣在你加載這個模塊的時候可以動態修改這個變量的值。稍后將演示。yuer_init()函數將在模塊加載的時候運行,通過輸出的結果可以看到我們的模塊是否加載成功。

第二步:編寫Makefile文件

首先還是來看看我們Makefile的源文件,然后我們再來解釋;

Makefile

obj-m := modules.o #要生成的模塊名

modules-objs:= mymod.o #生成這個模塊名所需要的目標文件

KDIR := /lib/modules/`uname -r`/build

PWD := $(shell pwd)

default:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions

現在我來說明一下這個Makefile。請記住是大寫的Makefile而不是小寫的makefile;

obj-m :這個變量是指定你要聲稱哪些模塊模塊的格式為 obj-m := <模塊名>.o

modules-objs :這個變量是說明聲稱模塊modules需要的目標文件 格式要求 <模塊名>-objs := <目標文件>

切記:模塊的名字不能取與目標文件相同的名字。如在這里模塊名不能取成 mymod;

KDIR :這是我們正在運行的操作系統內核編譯目錄。也就是編譯模塊需要的環境

M= :指定我們源文件的位置

PWD :這是當前工作路徑$(shell )是make的一個內置函數。用來執行shell命令。

第三步:編譯模塊

現在我們已經準備好了我們所需要的源文件和相應的Makefile。我們現在就可以編譯了。在終端進入源文件目錄輸入make

運行結果:

make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'

CC [M] /home/yuqiang/桌面/mymodule/mymodules.o

LD [M] /home/yuqiang/桌面/mymodule/modules.o

Building modules, stage 2.

MODPOST 1 modules

CC /home/yuqiang/桌面/mymodule/modules.mod.o

LD [M] /home/yuqiang/桌面/mymodule/modules.ko

make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'

第四步:加載/卸載我們的模塊

從上面的編譯中我可以看到。已經有一個modules.ko生成了。這就是我們的模塊了。現在我們就可以來加載了。

首先在終端輸入:sudo insmod modules.ko

現在我們來看看我們的模塊加載成功沒有呢?

在終端輸入:dmesg | tail -12 這是查看內核輸出信息的意思。tail -12 顯示最后12條;

顯示結果如下:

[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0

[18046.790019] usb 5-8: USB disconnect, address 9

[19934.224812] Hello, How are you. 0

[19934.224817] Hello, How are you. 1

[19934.224818] Hello, How are you. 2

[19934.224820] Hello, How are you. 3

[19934.224821] Hello, How are you. 4

[19934.224822] Hello, How are you. 5

[19934.224824] Hello, How are you. 6

[19934.224825] Hello, How are you. 7

[19934.224826] Hello, How are you. 8

[19934.224828] Hello, How are you. 9

看到了吧。我們的模塊的初始化函數yuer_init();已經成功運行了。說明我們的模塊已經加載成功;

現在我們再來卸載模塊試試看。

在終端輸入:sudo rmmod modules

在終端輸入:dmesg | tail -3

[19934.224826] Hello, How are you. 8

[19934.224828] Hello, How are you. 9

[20412.046932] I come from yuer's module, I have been unlad.

可以從打印的信息中看到,我們的模塊的退出函數已經被執行了。說明我們的模塊已經被成功的卸載了。到目前位置我們就已經算是對模塊的編譯到編譯運行算是有了一個整體上的認識了。對于以后深入的學習還是應該有點幫助的。下面我們將在看看于模塊相關的一些簡單的操作。

第五步:加載模塊時傳遞參數

在終端輸入:sudo insmod module_name.ko nbr=4

在終端輸入:dmesg | tail -6

顯示結果如下:

[20800.655694] Hello, How are you. 9

[21318.675593] I come from onefile module, I have been unlad.

[21334.425373] Hello, How are you. 0

[21334.425378] Hello, How are you. 1

[21334.425380] Hello, How are you. 2

[21334.425381] Hello, How are you. 3

這樣我們就可以看到在模塊加載的時候動態設置了我們的一個變量。初始化函數中的循環只執行了4次。

可能你會問我怎么知道一個模塊可以設置那些變量呢。當然,你可以先不設變量加載一次。然后可以在終端輸入ls /sys/module//parameters/來查看。在這里我們是這樣輸入的

在終端輸入:ls /sys/moedle/modules/parameters/

顯示結果:

nbr

如果我們的模塊加載成功了。最后我們還可以通過modinfo來查看我們的模塊信息。如下

在終端輸入:sudo modinfo modules.ko

顯示結果:

filename: modules.ko

license: GPL

author: Yu Qiang

srcversion: 20E9C3C4E02D130E6E92533

depends:

vermagic: 2.6.24-24-generic SMP mod_unload 586

parm: nbr:int

總結:

今天介紹的相關知識都好像有一點淺嘗轍止的感覺。因為這里主要是通過一條線式方式來講解了模塊編寫的相關過程,其實在這個過程中還有很多可以發散的地方。例如:

在寫到MODULE_AUTHOR("Yu Qiang")的時候,你應該想到還有

MODULE_DESCRIPTION(模塊用途的簡單描述);

MODULE_VERSION(模塊的版本字符串);

MODULE_ALIAS(模塊的別名);

...

在寫到module_param(nbr, int, S_IRUGO);的時候,你應該想到還有

EXPORT_SYMBOL(name); 可以導出模塊的函數,這也是模塊編寫的最終目的

...

在用到insmod 和 modinfo的時候。你應該想到還有

depmod 分析可加載模塊的依賴性,并生成modules.dep文件和映射文件

modprobe Linux內核添加刪除模塊

...

如果要成為一名專業的linux模塊開發人員,還要走很多的路,就看各位的了,祝大家學習順利。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5083

    文章

    19129

    瀏覽量

    305404
  • Linux
    +關注

    關注

    87

    文章

    11306

    瀏覽量

    209572
  • Makefile
    +關注

    關注

    1

    文章

    125

    瀏覽量

    19185

原文標題:少走彎路系列!嵌入式Linux 模塊編譯步驟入門

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    <新手求教嵌入式的學習路線>

    本人想從事嵌入式開發,但是自己現在只有C、51單片機、模電、數電、verilog的功底。現在想學習嵌入式,只知道要先從LINUX開始,其他一頭霧水。求過來人給點建議,先學什么再學什么,有哪些書,也就是學習路線,好
    發表于 08-15 09:34

    嵌入式工作的前輩帶我,小弟想入行,求前輩帶

    小弟年齡比較大了,現在自學Linux,和一些基礎的嵌入式知識,學習的熱情肯定有的,但是我想找一位從事嵌入式的前輩指導下,不勝感謝,希望指導我可以我在學習的道路上
    發表于 03-01 19:18

    嵌入式系統入門需要哪些器材

    嵌入式系統入門需要哪些器材?球高手推薦,希望少走彎路
    發表于 11-05 00:46

    少走彎路Linux編程思想轉變

    為基于Linux操作系統編程,講這個思想轉變的書幾乎沒有,初學者走了很多彎路,撞了很多難墻。筆者因此寫上自己的學習心得,希望能給和我一樣轉變做嵌入式
    發表于 12-30 10:10

    少走彎路系列!嵌入式Linux下 u***驅動開發方法

    嵌入式Linux下的u***屬于所有驅動中相當復雜的一個子系統,要想將她徹底征服,至少需要個把月的時間,不信?那是沒做過。本人做過2年的嵌入式驅動開發,u***占了一大半的時間。期間
    發表于 04-06 11:15

    快速學習C語言的途徑,少走彎路

    `快速學習C語言的途徑,少走彎路 標準C語言能干什么? 坦白講,在今天軟件已經發展了半個多世紀,單純的C語言什么都干不了。標準C語言庫只提供了一些通用的邏輯運算方法以及字符串處理,當然字符串在C
    發表于 10-19 10:51

    新人來咯,剛剛學labview有什么建議少走彎路嗎?

    我剛剛來發燒友,對這不是很熟,剛剛學labview,大家有什么建議少走彎路嗎?還有什么辦法賺到更多的幣,不然下載不了東西
    發表于 03-15 16:30

    少走彎路!分享PCB設計中的布線經驗

    少走彎路!分享PCB設計中的布線經驗。
    發表于 04-25 09:31

    提高單片機抗干擾能力,的設計少走彎路

    如何提高單片機抗干擾少走彎路 搞過產品的朋友都有體會,一個設計看似簡單,硬件設計和代碼編寫很快就搞定,但在調試過程中卻或多或少的意外,這些都是抗干擾能力不夠的體現。 下面討論一下如何
    發表于 10-13 22:21 ?978次閱讀

    熱水器安裝有竅門 注意這些事項能讓少走彎路

    熱水器是家庭常備家電之一,不過常聽有人抱怨熱水器沒安裝好,叫人上門安裝還很貴,這熱水器安裝到底有什么講究?今天咱們就一次性來說清楚,大家少走彎路
    發表于 04-16 17:17 ?1818次閱讀

    STM32嵌入式入門必看之文章給你詳細的講解

    STM32嵌入式入門必看之文章-----介紹非常詳細!(學習STM32的理由!!!!)為什么要寫這篇文章呢?這是一篇關于嵌入式入門的文章,因為我在進入嵌入式這個領域之前,也是遇到過非常
    發表于 06-18 16:52 ?20次下載

    嵌入式linux編譯 ko,嵌入式linux:編譯linux驅動模塊

    嵌入式系統應用中,嵌入式linux是非常重要的一個方面,而linux驅動編譯又是嵌入式
    發表于 11-01 16:31 ?9次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>編譯</b> ko,<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>:<b class='flag-5'>編譯</b><b class='flag-5'>linux</b>驅動<b class='flag-5'>模塊</b>

    Linux嵌入式Linux系統的移植(上篇:交叉編譯器、連接方式)

    的移植要點搭建交叉開發環境bootloader的選擇與移植kernel的設置、編譯、移植和調試根文件系統的制作嵌入式Linux系統的移植基本步驟確定目標機、主機的連接方式安裝交叉
    發表于 11-01 16:57 ?14次下載
    【<b class='flag-5'>Linux</b>】<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統的移植(上篇:交叉<b class='flag-5'>編譯</b>器、連接方式)

    示波器校準的步驟,熟知10步,少走彎路

    很多人對于示波器校準還不是很清楚,下面安泰維修專業從事儀器儀表維修工程師帶大家了解一下關于示波器校準的10個具體步驟少走彎路!有需要的朋友可以閱讀全文! 一)測試
    的頭像 發表于 11-10 17:04 ?3.5w次閱讀
    示波器校準的<b class='flag-5'>步驟</b>,熟知10步,<b class='flag-5'>讓</b><b class='flag-5'>你</b><b class='flag-5'>少走彎路</b>!

    硬件電路設計有這么多坑,如何少走彎路?看大牛怎么說

    硬件電路設計有這么多坑,如何少走彎路?看大牛怎么說
    的頭像 發表于 11-27 17:34 ?656次閱讀
    主站蜘蛛池模板: 操她视频网站| 2020国产v亚洲v天堂高清| 天堂影院jav成人天堂免费观看| 114毛片免费观看网站| 天天色啪| 天堂资源最新版在线官网| 神马午夜在线观看| 久久久久久久免费| 1024你懂的在线播放欧日韩| 人人爽影院| 日本在线视频二区| 欧美3p精品三区| 49vv婷婷网| fxxx性xxx性| 天堂网www中文在线资源| 色婷婷六月| 亚洲第八页| 色玖玖| 久久国产精品网| cum4k在线| 免费国产午夜高清在线视频| aa视频在线| 男女视频在线看| 性欧美大胆高清视频| 人成电影免费观看在线| 国模伊人| 天天干夜夜想| 男人日女人的网站| 高清不卡一区| 日韩成人黄色| 岛国片欧美一级毛片| 人人艹人人艹| 国产在线观看黄| 一级日本高清视频免费观看| 日韩在线视频www色| 久久伊人精品青青草原高清| 2017亚洲男人天堂| 黄色免费看网站| 激情综合网色播五月| 91福利专区| 日本三级吹潮|