• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            linux設備驅動程序——將驅動程序編譯進內核

            更新時間:2023-05-23 20:00:35 閱讀: 評論:0

            我的一家-主持人陳晨

            linux設備驅動程序——將驅動程序編譯進內核
            2023年5月23日發(作者:泗礁)

            linux設備驅動程序——將驅動程序編譯進內核

            linux驅動程序——將驅動程序編譯進內核

            模塊的加載

            通常來說,在驅動模塊的開發階段,?般是將模塊編譯成.ko?件,再使?

            sudo insmod

            或者

            depmod -a

            modprobe module

            將模塊加載到內核,相對??,modprobe要?insmod更加智能,它會檢查并?動處理模塊的依賴,?insmod出現依賴問題時僅僅是告訴你

            安裝失敗,??想辦法吧。

            將模塊編譯進內核

            這?章節我們并不關注模塊的運?時加載,我們要討論的是將模塊編譯進內核。

            在學習內核的Makefile規則的時候就可以知道,將驅動程序編譯成模塊時,只需要使?:

            obj-m += module.o

            指定相應的源代碼(源代碼為module.c)即可,所以很多朋友就簡單地得出結論:如果要將模塊編譯進內核,只要執?下?的的指令就可以

            了:

            obj-y += module.o

            事實上,這樣是?不通的,要明?怎么將驅動程序編譯進內核,我們還是得先了解linux源碼的編譯規則。

            關于linux源碼的編譯規則和部分細節可以查看我的另?篇博客

            本篇博客的所有實驗基于平臺,開發板,內核版本為

            armbeagle bone4.14.79

            編譯平臺

            注:在以下的討論中,?標主機和本機指加載運?驅動程序的機器,是開發的對象。?開發機指只負責編譯的機器,?般指機。

            PC

            本機編譯

            在對驅動程序進?編譯時,?般會有兩種不同的做法:

            直接在?標主機上編譯

            在其他平臺上構建交叉編譯環境,?般是在PC機上編譯出可在?標板上運?的驅動程序

            直接在?標主機上編譯是?較?便的做法,本機編譯本機運?。

            通常,本機系統中?般不會?帶linux內核源碼的頭?件,我們需要做的就是在系統中安裝頭?件:

            sudo apt-get install linux-headers-$(uname -r)

            $(uname -r)獲取當前主機運?的linux版本號。

            有了頭?件,那么源代碼從哪?來呢?答案是并不需要源代碼,或者說是并不需要C?件形式的源代碼,?是直接引?當前運?的鏡像,在

            編譯時,將/boot/vmlinuz-$(version)鏡像當成庫?件進?鏈接即可。

            值得注意的是,/boot/vmlinuz-$(version)linux啟動時讀取的鏡像,但是在本機中進?驅動程序編譯的時候并不會影響到這個鏡像,換句話

            說,即使是指定了obj-y,驅動程序也不會編譯到/boot/vmlinuz-$(version)鏡像中,?然達不到將驅動編譯進內核的效果。

            交叉編譯

            本機(?標機)編譯是?較?便的,但是?法改變?成的鏡像,當然也可以將源碼下載到本機(?標機)中進?編譯,就可以?成相應的linux

            像。

            但是?般情況下,在嵌?式開發中,不論是?絡、內存還是執?速率,?標主機的性能?般不會太?,如果需要編譯完整的源碼時,?戶會

            更傾向于在PC端構建編譯環境以獲取更好的編譯性能。

            選擇在開發機上編譯?不是本機編譯時,需要注意的?點就是:通常嵌?式開發都是基于armmips等嵌?式架構,?PC常?X86架構,在

            編譯時就不能使?開發機上的gcc編譯器,因為開發機上編譯器是針對開發平臺(X86),??運?平臺(armmips),所以需要使?交叉編譯

            ?具鏈,同時在編譯時指定運?的主機平臺。

            指令是這樣的:

            make arch=arm CROSS_COMPILE=$COMPILE_PATH/$COMPILE_TOOL

            也可以在makefile中給相應的archCROSS_COMPILE變量賦值,直接執?make指令即可。

            顯然,這種交叉編譯?式是對linux內核源碼的完整編譯,主要?成這?些?標?件:

            ?成linux的可啟動鏡像,通常是zImage或者vmlinuz,這是?個可boot執?的壓縮?件

            伴隨著的還有鏡像對應的map?件,這個?件對應鏡像中的編譯符號以及符號的地址信息

            未編譯進內核的模塊,也就是在配置時被選為M的選項

            linux內核頭?件等等

            在上?中有提到,?標主機中,linux的啟動鏡像放置在/boot?錄下,所以如果我們需要替換linux的鏡像,需要替換/boot?錄下的以下兩個

            ?件:

            linux的可啟動鏡像,也就是?成的zImage或者vmlinuz

            .map?件

            在主機中,模塊?般被放置在/lib/modules?錄中,如果交叉編譯出的版本與本機中模塊版本不?致,將?法識別,所以編譯出的模塊也需

            要替換。

            驅動程序編譯進內核

            根據上?,可以得出的結論是:在試圖將驅動程序編譯進內核時,我們需要編譯完整的linux內核源碼以?成相應的鏡像?件,然后將其替換

            到?標主機的/boot?錄下即可。

            那么,怎樣將驅動的源碼C?件編譯進內核呢?

            這個問題得從makefile的執?流程說起:

            make的執?

            ?先,如果你有基本的linux內核編譯經驗,就知道在編譯linux源碼前,需要進?config(配置),以決定哪些部分編譯進內核、哪些部分編譯

            成模塊,

            通常使?make menuconfig,不同的config?式通常只是選擇界?的不同,其中稍微特殊的make oldconfig則是沿?之前的配置。

            在配置完成之后將?成?個.config?件,makefile根據.config?件選擇性地進???錄中執?編譯?作。

            流程基本如上所說,但是我們需要知道更多的細節:

            make menuconfig執?的原理是什么?

            頂層makefile是怎樣執???錄中的編譯?作的?

            答案是這樣的:

            make menuconfig肯定是讀取某個配置?件來陳列出所有的配置選項,遞歸地進?到??錄中,發現?乎每個??錄中都有?個名為

            Kconfig的?件,這個?件負責配置驅動在配置菜單中的顯?以及配置?為,且Kconfig遵循某種語法,make menuconfig就是讀取這些

            ?件來顯?配置項。

            遞歸地進?到每個??錄中,發現其中都有?個makefile中,可以想到,makefile遞歸地進???錄,然后通過調???錄中的

            makefile來執?各級??錄的編譯,最后統?鏈接。

            整個linux內核的編譯都是采??種分布式的思想,需要添加?個驅動到模塊中,我們需要做的事情就是:

            1. 將驅動源?件放在內核對應?錄中,?般的驅動?件放在drivers?錄下,字符設備放在drivers/char中,塊設備就放在drivers/blok中,

            ?件的位置遵循這個規律,如果是單個的字符設備源?件,就直接放在drivers/char?錄下,如果內容較多?以構成?個模塊,則新建

            ?個?件夾。

            2. 如果是新建?件夾,因為是分布式編譯,需要在?件夾下添加?個Makefile?件和Kconfig?件并修改成指定格式,如果是單個?件直

            接添加,則直接修改當前?錄下的MakefileKconfig?件將其添加進去即可。

            3. 如果是新建?件夾,需要修改上級?錄的MakefileKconfig,以將?件夾添加到整個源碼編譯樹中。

            4. 執?make menuconfig,執?make

            5. 將?成的新鏡像以及相應boot?件拷貝到?標主機中,測試。

            beagle bone的啟動?件包括:vmlinuz,編譯出的模塊?件為modules

            Kconfig的語法簡述

            上?中提到,在添加源碼時,?般會需要?個Kconfig?件,這樣就可以在make menuconfig時對其進?配置選擇,在對?個源?件進?描述

            時,遵循相應的語法。

            在這?介紹?些常?的語法選項:

            source

            source:相當于C語?中的include,表?包含并引?其他Kconfig?件

            config

            新建?個條?,?法:

            source drivers/xxx/Kconfig

            config TEST

            bool "item name"

            depends on NET

            lect NET

            help

            just for test

            config是最常?的關鍵詞了,它負責新建?個條?,對應linux中的編譯模塊,條?前帶有選項。

            config TEST:

            config后?跟的標識會被當成名稱寫?到.config?件中,?如:當此項被選擇為[y],即編譯進內核時,最后會在.config?件中添加這樣?個

            條?:

            CONFIG_TEST=y

            CONFIG_TEST變量被傳遞給makefile進?編譯?作。

            bool "item name"

            其中bool表?選項?持的種類,bool表?兩種,編譯進內核或者是忽略,還有另?種選項就是tristate,它更常?,表??持三種配置選項:

            編譯進內核、編譯成可加載模塊、忽略。?item name就是顯?在menu中的名稱。

            depends on:

            表?當前模塊需要依賴另?個選項,如果另?個選項沒有沒選擇編譯,當前條?選項不會出現在窗?中

            lect

            同樣是依賴相關的選項,表?當前選項需要另外其他選項的?持,如果選擇了當前選項,那么需要?持的那些選項就會被強制選擇編譯。

            help

            允許添加?些提?信息

            menu/menuend

            ?法:

            menu "Test option"

            ...

            endmenu

            這?對關鍵詞創建?個選項?錄,該選項?錄不能被配置,選項?錄中可以包含多個選項

            menuconfig

            相當于menu+config,此選項創建?個選項?錄,?且當前選項?錄可配置。

            編譯?例

            梳理了整個添加的流程,接下來就以?個具體的?例來進?詳細的說明。

            背景如下:

            ?標開發板為開源平臺beagle bone,基于4.14.79內核版本,arm平臺

            需要添加的源代碼為字符設備驅動,名為cdev_test.c,新建?個?錄cdev_test

            字符設備驅動實現的功能:在/dev?錄下?成?個basic_demo?件,?來檢測是否成功將源代碼編譯進內核

            將驅動編譯進內核

            放置?錄

            鑒于是字符設備,所以將源?件?錄放置在$KERNEL_ROOT/drivers/char/下?。

            如果是塊設備,就會被放置在block下?,但是這并不是絕對的,類似USB為字符設備,但是獨?了?個?件出來。

            放置后?標?件位置為:$KERNEL_ROOT/drivers/char/cdev_test

            Kconfig?件

            $KERNEL_ROOT/drivers/char/cdev_test?錄下創建?個Kconfig?件,并修改?件如下:

            menu "cdev test dir"

            config CDEV_TEST

            bool "cdev test support"

            default n

            help

            just for test ,hehe

            endmenu

            根據上?中對Kconfig?件的語法描述,可以看出,這個Kconfig?件的作?就是:

            1. menuconfig的菜單中,在Device Driver(對應drivers?錄) ---> Character devices(對應char?錄)菜單下創建?個名為"cdev test dir"

            菜單選項,

            執?效果是這樣的

            2. "cdev test dir"的菜單選項下創建?個"cdev test support"的條?,這個條?的選項只有兩個,[*]表?編譯進內核和[]表?不進?編譯,

            默認選擇n,不進?編譯。

            執?效果是這樣的

            3. 選擇help可以查看相應的提?信息。

            在上?中還提到,Kconfig分布式地存在于??錄下,同時需要注意的是,在編譯時,配置?具并??差別地進?每個??錄,收集所有的

            Kconfig信息,?是遵循?定的規則遞歸進?。

            那么,既然是新建的?錄,怎么讓編譯器知道要進?到這個??錄下呢?答案是,在上級?錄的Kconfig中包含當前路徑下的Kconfig?件。

            打開char?錄下的Kconfig?件,并且在?件的靠后位置添加:

            source "drivers/char/xillybus/Kconfig"

            就把新的Kconfig?件包含到系統中檢索?錄中了,那么drivers/char/?是怎么被檢索到的呢?

            就是在driversKconfig中添加drivers/char/?錄下的Kconfig索引,以此類推。

            Makefile?件

            $KERNEL_ROOT/drivers/char/cdev_test?錄下創建?個Makefile?件,并且編譯Makefile?件如下:

            obj-$(CONFIG_CDEV_TEST) += cdev_test.o

            表?當前??錄下Makefile的作?就是將cdev_test.c源?件編譯成cdev_test.o?標?件。

            值得注意的是,這?的編譯選項中使?的是:

            obj-$(CONFIG_CDEV_TEST)

            ??

            obj-y

            如果確定要將驅動程序編譯進內核永遠不變,那么可以直接寫死,使?obj-y,如果需要進?靈活的定制,還是需要選擇第?種做法。

            CONFIG_CDEV_TEST是怎么被配置的呢?在上?提到的Kconfig?件編寫時,有這么??:

            config CDEV_TEST

            ...

            Kconfig被添加到配置菜單中,且被選中編譯進內核時,就會在$KERNEL_ROOT/.config?件中添加?個變量:

            CONFIG_CDEV_TEST=y

            ?動添加CONFIG_前綴,?名稱CDEV_TEST則是由Kconfig指定,看到這?,我想你應該明?了這是怎么回事了。

            是不是這樣就已經將當前??錄添加到內核編譯樹中了呢?其實并沒有,就像Kconfig?樣,Makefile也是分布式存在于整個源碼樹中,頂層

            makefile根據配置遞歸地進?到??錄中,調???錄中的Makefile進?編譯。

            同樣地,需要修改drivers/char/?錄下的Makefile?件,添加??:

            obj-$(CONFIG_CDEV_TEST) += cdev_test/

            在編譯時,如果CONFIG_CDEV_TEST變量為ycdev_test/Makefile就會被調?。

            make menuconfig中選中

            ?成配置的部分完成,就需要在menuconfig菜單中進?配置,執?:

            make menuconfig

            進??錄選項Device Driver --> Character devices--->cdev test dir.

            然后按'y'選中模塊cdev test support

            保存退出,然后執?編譯:

            make

            拷貝到?標主機

            vmlinuz(zImage)拷貝到?標主機的/boot?錄下。

            在編譯?成的modules拷貝到?標主機的/lib/modules?錄下。

            需要注意的是:啟動?件也好,模塊也好,在?標板上很可能?件名為諸如vmlinuz-$version,會包含版本信息,需要將?件名修改成?

            致,不然?法啟動。對于模塊??,就是相應模塊?法加載。

            驗證

            最后?步就是驗證??的驅動程序是否被編譯進內核,如果被編譯進內核,驅動程序中的module_init()程序將被系統調?,完成?些開發者

            指定的操作。

            這?部分的驗證操作就是各顯??了。

            好了,關于linux將驅動程序編譯進內核的討論就到此為?啦,如果朋友們對于這個有什么疑問或者發現有?章中有什么錯誤,歡迎留?

            原創博客,轉載請注明出處!

            祝各位早?實現項?叢中過,bug不沾?.

            農業生產工作總結-丞相祠堂何處尋

            linux設備驅動程序——將驅動程序編譯進內核

            本文發布于:2023-05-23 20:00:34,感謝您對本站的認可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1684843235175982.html

            版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。

            本文word下載地址:linux設備驅動程序——將驅動程序編譯進內核.doc

            本文 PDF 下載地址:linux設備驅動程序——將驅動程序編譯進內核.pdf

            標簽:insmod
            相關文章
            留言與評論(共有 0 條評論)
               
            驗證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實用文體寫作網旗下知識大全大全欄目是一個全百科類寶庫! 優秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 人妻av中文字幕无码专区| 日韩精品国产自在欧美| 亚洲综合精品第一页| 国产成AV人片久青草影院| 国产老熟女一区二区三区| 国内自拍小视频在线看| 亚洲一区二区中文av| 成人影片麻豆国产影片免费观看| 亚洲综合久久一本伊一区| 日韩中文字幕av有码| 韩国深夜福利视频在线观看| 亚洲精品一区二区三区在| 国产无遮挡吃胸膜奶免费看| 国产又爽又黄的精品视频| 亚洲一区二区三级av| 97国产成人无码精品久久久| 中文字幕日韩视频欧美一区| 一本大道香蕉中文日本不卡高清二区 | 少妇被粗大的猛烈进出动视频| 国产成人a在线观看视频| 国产嫩草精品网亚洲av| 国产亚洲美女精品久久| 日本成熟少妇激情视频免费看| 精品无码av无码专区| 成人国产精品中文字幕| 福利一区二区三区视频在线| 在线 欧美 中文 亚洲 精品| 曰韩精品无码一区二区三区视频| 国产成人精品一区二区三区| 日本熟妇浓毛| 国产精品视频白浆免费视频| 国产精品乱码人妻一区二区三区| 精品在免费线中文字幕久久| 秋霞人妻无码中文字幕| 四虎永久免费高清视频| 无码精品国产VA在线观看DVD | 高潮潮喷奶水飞溅视频无码| 欧美特黄一免在线观看| 日本黄色三级一区二区三区| 亚洲国产精品综合久久网络| 国产精品老熟女免费视频|