0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

今天將直接了當(dāng)?shù)膸氵M(jìn)入linux的模塊編譯,當(dāng)然在介紹的過程當(dāng)中,我也會(huì)添加一些必要的注釋,以便初學(xué)者能夠看懂。之所以要有這篇文章,主要是因?yàn)閺臅旧蠈W(xué)的話,可能要花更長(zhǎng)的時(shí)間才能學(xué)會(huì)整個(gè)過程,因?yàn)榭磿脑捠且粋€(gè)學(xué)習(xí)過程,而本文更像是一個(gè)培訓(xùn)。所以實(shí)踐性和總結(jié)性更強(qiáng)。讀完本文后你將會(huì)學(xué)到編譯一個(gè)模塊和模塊makefile的基本知識(shí)。以及加載(卸載)模塊,查看系統(tǒng)消息的一些知識(shí)。如果你已經(jīng)是一個(gè)linux模塊編譯高手,您也可以指點(diǎn)指點(diǎn)哪里說的不足。

第一步:準(zhǔn)備源代碼

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

mymod.c

1. #include /* 引入與模塊相關(guān)的宏 */

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

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);

我們的源文件就準(zhǔn)備的差不多了,這就是一個(gè)linux下的模塊的基本結(jié)構(gòu)。第9行是導(dǎo)出我們的符號(hào)變量nbr。這樣在你加載這個(gè)模塊的時(shí)候可以動(dòng)態(tài)修改這個(gè)變量的值。稍后將演示。yuer_init()函數(shù)將在模塊加載的時(shí)候運(yùn)行,通過輸出的結(jié)果可以看到我們的模塊是否加載成功。

第二步:編寫Makefile文件

首先還是來看看我們Makefile的源文件,然后我們?cè)賮斫忉?

Makefile

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

modules-objs:= mymod.o #生成這個(gè)模塊名所需要的目標(biā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

現(xiàn)在我來說明一下這個(gè)Makefile。請(qǐng)記住是大寫的Makefile而不是小寫的makefile;

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

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

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

KDIR :這是我們正在運(yùn)行的操作系統(tǒng)內(nèi)核編譯目錄。也就是編譯模塊需要的環(huán)境

M= :指定我們?cè)次募奈恢?/p>

PWD :這是當(dāng)前工作路徑$(shell )是make的一個(gè)內(nèi)置函數(shù)。用來執(zhí)行shell命令。

第三步:編譯模塊

現(xiàn)在我們已經(jīng)準(zhǔn)備好了我們所需要的源文件和相應(yīng)的Makefile。我們現(xiàn)在就可以編譯了。在終端進(jìn)入源文件目錄輸入make

運(yùn)行結(jié)果:

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'

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

從上面的編譯中我可以看到。已經(jīng)有一個(gè)modules.ko生成了。這就是我們的模塊了。現(xiàn)在我們就可以來加載了。

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

現(xiàn)在我們來看看我們的模塊加載成功沒有呢?

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

顯示結(jié)果如下:

[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

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

現(xiàn)在我們?cè)賮硇遁d模塊試試看。

在終端輸入: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.

可以從打印的信息中看到,我們的模塊的退出函數(shù)已經(jīng)被執(zhí)行了。說明我們的模塊已經(jīng)被成功的卸載了。到目前位置我們就已經(jīng)算是對(duì)模塊的編譯到編譯運(yùn)行算是有了一個(gè)整體上的認(rèn)識(shí)了。對(duì)于以后深入的學(xué)習(xí)還是應(yīng)該有點(diǎn)幫助的。下面我們將在看看于模塊相關(guān)的一些簡(jiǎn)單的操作。

第五步:加載模塊時(shí)傳遞參數(shù)

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

在終端輸入:dmesg | tail -6

顯示結(jié)果如下:

[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

這樣我們就可以看到在模塊加載的時(shí)候動(dòng)態(tài)設(shè)置了我們的一個(gè)變量。初始化函數(shù)中的循環(huán)只執(zhí)行了4次。

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

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

顯示結(jié)果:

nbr

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

在終端輸入:sudo modinfo modules.ko

顯示結(jié)果:

filename: modules.ko

license: GPL

author: Yu Qiang

srcversion: 20E9C3C4E02D130E6E92533

depends:

vermagic: 2.6.24-24-generic SMP mod_unload 586

parm: nbr:int

總結(jié):

今天介紹的相關(guān)知識(shí)都好像有一點(diǎn)淺嘗轍止的感覺。因?yàn)檫@里主要是通過一條線式方式來講解了模塊編寫的相關(guān)過程,其實(shí)在這個(gè)過程中還有很多可以發(fā)散的地方。例如:

在寫到MODULE_AUTHOR("Yu Qiang")的時(shí)候,你應(yīng)該想到還有

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

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

MODULE_ALIAS(模塊的別名);

...

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

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

...

在用到insmod 和 modinfo的時(shí)候。你應(yīng)該想到還有

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

modprobe Linux內(nèi)核添加刪除模塊

...

如果要成為一名專業(yè)的linux模塊開發(fā)人員,還要走很多的路,就看各位的了,祝大家學(xué)習(xí)順利。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5060

    文章

    18979

    瀏覽量

    302236
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11213

    瀏覽量

    208736
  • Makefile
    +關(guān)注

    關(guān)注

    1

    文章

    125

    瀏覽量

    19158

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

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    <新手求教嵌入式的學(xué)習(xí)路線>

    本人想從事嵌入式開發(fā),但是自己現(xiàn)在只有C、51單片機(jī)、模電、數(shù)電、verilog的功底?,F(xiàn)在想學(xué)習(xí)嵌入式,只知道要先從LINUX開始,其他一頭霧水。求過來人給點(diǎn)建議,先學(xué)什么再學(xué)什么,有哪些書,也就是學(xué)習(xí)路線,好
    發(fā)表于 08-15 09:34

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

    小弟年齡比較大了,現(xiàn)在自學(xué)Linux,和一些基礎(chǔ)的嵌入式知識(shí),學(xué)習(xí)的熱情肯定有的,但是我想找一位從事嵌入式的前輩指導(dǎo)下,不勝感謝,希望指導(dǎo)我可以我在學(xué)習(xí)的道路上
    發(fā)表于 03-01 19:18

    嵌入式系統(tǒng)入門需要哪些器材

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

    少走彎路!Linux編程思想轉(zhuǎn)變

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

    少走彎路系列!嵌入式Linux下 u***驅(qū)動(dòng)開發(fā)方法

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

    快速學(xué)習(xí)C語言的途徑,少走彎路

    `快速學(xué)習(xí)C語言的途徑,少走彎路 標(biāo)準(zhǔn)C語言能干什么? 坦白講,在今天軟件已經(jīng)發(fā)展了半個(gè)多世紀(jì),單純的C語言什么都干不了。標(biāo)準(zhǔn)C語言庫只提供了一些通用的邏輯運(yùn)算方法以及字符串處理,當(dāng)然字符串在C
    發(fā)表于 10-19 10:51

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

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

    少走彎路!分享PCB設(shè)計(jì)中的布線經(jīng)驗(yàn)

    少走彎路!分享PCB設(shè)計(jì)中的布線經(jīng)驗(yàn)。
    發(fā)表于 04-25 09:31

    提高單片機(jī)抗干擾能力,的設(shè)計(jì)少走彎路

    如何提高單片機(jī)抗干擾少走彎路 搞過產(chǎn)品的朋友都有體會(huì),一個(gè)設(shè)計(jì)看似簡(jiǎn)單,硬件設(shè)計(jì)和代碼編寫很快就搞定,但在調(diào)試過程中卻或多或少的意外,這些都是抗干擾能力不夠的體現(xiàn)。 下面討論一下如何
    發(fā)表于 10-13 22:21 ?936次閱讀

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

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

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

    STM32嵌入式入門必看之文章-----介紹非常詳細(xì)!(學(xué)習(xí)STM32的理由?。。。。槭裁匆獙戇@篇文章呢?這是一篇關(guān)于嵌入式入門的文章,因?yàn)槲以谶M(jìn)入嵌入式這個(gè)領(lǐng)域之前,也是遇到過非常
    發(fā)表于 06-18 16:52 ?20次下載

    嵌入式linux編譯 ko,嵌入式linux:編譯linux驅(qū)動(dòng)模塊

    嵌入式系統(tǒng)應(yīng)用中,嵌入式linux是非常重要的一個(gè)方面,而linux驅(qū)動(dòng)編譯又是嵌入式
    發(fā)表于 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>驅(qū)動(dòng)<b class='flag-5'>模塊</b>

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

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

    示波器校準(zhǔn)的步驟,熟知10步,少走彎路!

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

    硬件電路設(shè)計(jì)有這么多坑,如何少走彎路?看大牛怎么說

    硬件電路設(shè)計(jì)有這么多坑,如何少走彎路?看大牛怎么說
    的頭像 發(fā)表于 11-27 17:34 ?597次閱讀