




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌入式Linux內核模塊的配置與編譯一、簡介隨著Linux操作系統在嵌入式領域的快速發展,越來越多的人開始投身到這方面的開發中來。但是,面對龐大的Linux內核源代碼,開發者如何開始自己的開發工作,在完成自己的代碼后,該如何編譯測試,以及如何將自己的代碼編譯進內核中,所有的這些問題都直接和Linux的驅動的編譯以及Linux的內核配置系統相關。內核模塊是一些在操作系統內核需要時載入和執行的代碼,它們擴展了操作系統內核的功能卻不需要重新啟動系統,在不需要時可以被操作系統卸載,又節約了系統的資源占用。設備驅動程序模塊就是一種內核模塊,它們可以用來讓操作系統正確識別和使用使用安裝在系統上的硬件設備。
2、Linux內核是由分布在全球的Linux愛好者共同開發的,為了方便開發者修改內核,Linux的內核采用了模塊化的內核配置系統,從而保證內核擴展的簡單與方便。本文通過一個簡單的示例,首先介紹了如何在Linux下編譯出一個內核模塊,然后介紹了Linux內核中的配置系統,講述了如何將一個自定義的模塊作為系統源碼的一部分編譯出新的操作系統,注意,在這里我們介紹的內容均在內核(也是筆者的開發平臺的版本)上編譯運行通過,在2.6.*的版本上基本上是可以通用的。二、單獨編譯內核模塊首先,我們先來寫一個最簡單的內核模塊:#include<linux/module.h>#includ
3、e<linux/kernel.h>#include<linux/errno.h>#defineDRIVER_VERSION"v1.0"#defineDRIVER_AUTHOR"RF"#defineDRIVER_DESC"justfortest"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");staticintrfmodule_init(void)(printk("h
4、ello,world:modele_init");return0;staticvoidrfmodule_exit(void)(printk("hello,world:modele_exit");module_init(rfmodule_init);module_exit(rfmodule_exit);這個內核模塊除了在載入和卸載的時候打印2條信息之外,沒有任何其他功能,不過,對于我們這個編譯的例子來講,已經足夠了。將上述源代碼保存到一個test.c文件中,然后開始我們的內核模塊的編譯工作。內核模塊的編譯與普通應用程序的編譯一樣,也使用的GCC但是內核模塊在用GCC
5、S譯的時候時需要使用特定的參數并定義一些宏。這是因為在編譯普通應用程序的可執行文件和內核模塊時,內核頭文件起的作用是不同的。在以往的內核版本需要我們去在Makefile中手動設置這些設定,雖然這些Makefile都是按目錄分層次存放的,但使用維護起來還是比較伏在。幸運的是,一種稱為kbuild的新方法被引入,現在外部的可加載內核模塊的編譯的方法已經同內核編譯統一起來,編譯新的內核模塊或者將自己的內核模塊集成到內核源碼中都已經變得非常簡單了。現在讓我們看一下如何編譯一個名字叫做test.c的模塊。首先,我們需要寫一個簡單的Makefile文件:obj-m+=test.o將test.c和Make巾
6、le文件放在同一個目錄下,然后就可以開始編譯了,使用編譯命令:make-C/usr/src/linux-/SUBDIRS=$PWDmodules回車后,也許你會發現有一堆的報錯,請檢查如下配置是否正確:1 、在/usr/src/下有無放置你需要使用的內核源碼樹?如果沒有,請上網down一個你需要的內核源碼版本,解壓后放在這里。2 、如果你已經將內核源碼解壓在/usr/src/下了,那么請先使用在內核源碼的主目錄下,在筆者的系統中就是/usr/src/linux-/,使用:makeconfig或者makemenuconfig或者makegconfig等命令來酉己置
7、內核,然后使用makeall將整個內核完整編譯一次。3 、上述命令中的linux-是筆者使用的內核源碼的目錄名,你需要將它改成你自己使用對應版本的的內核源碼的目錄名。經過上述三步,一般來將,該內核模塊都可以編譯通過了,生成的test.ko就是我們需要的內核模塊的最終版本,你可以使用:insmod./test.ko將該模塊載入系統。請注意:如果想將模塊載入系統,請保證編譯模塊使用的內核源碼的版本與要載入的系統的版本一致!否則無法載入!嵌入式開發實作(Linux內核編譯及安裝)部分內容譯自«EmbeddedLinuxkernelanddriverdevelopment
8、187;byMichaelOpdenacker劉建文(KEY:Linux內核編譯內核配置嵌入式內核配置(Kernelconfiguration)Makefile版本修改為了區別基于同一源碼構建(bulid)的不內核鏡像,可使用變量EXTRAVERSION定義位于makefile的頂部):VERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmelVERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmelVERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmel運行&quo
9、t;uname-r”會返回:2.6.7-acme12.內核配置先定義內核需要什么特性,并進行配置。內核構建系統(Thekernelbuildsystem)遠不是簡單用來構建整個內核和模塊,想了解更多的高級內核構建選項,你可以查看Documentation/kbuild目錄內的內核文檔。可用的配置命令和方式:makexconfigmakemenuconfigmakeoldconfig或者手動編寫內核編譯的配置文件.config與內核配置的makefile?內核配置文件(Makefile語法的)保存為內核源代碼的頂層目錄的.config文件。發行版的內核配置文件通常在/boot/內。命令:make
10、xconfigqconf:全新的基于QT的配置接口,2.6版本內核更易使用(切記閱讀help->introduction:usefuloptions!)具有文件瀏覽功能,更易的加載配置文件命令:makemenuconfig老式字符界面,依然很管用。你夠自信,完全可以手寫配置文件!命令:makeoldconfig用于升級早期發布內核的配置文件對一些絕又揀?號(obsoletesymbols)發出警告詢問新符號的配置值何為makefile?makefile包含用以構建應用程序的一組規則集(setofrules)。并且第一條規則是特殊的規則,叫默認規則(defaultrule)。一條規則由三部
11、分組成:目標(target)、前提條件(prerequisites)和命令動作(command):target:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commands目標是被構建(made)的文件或其它東西。前提條件或者叫依賴(dependents)構建目標的“材料”。而命令動作是利用前提條件構建目標的shell命令。以下是編譯C源碼的規則例子:foo.o:foo.cfoo.hlt;tab>gcc-cfoo.cfoo.
12、o:foo.cfoo.hlt;tab>gcc-cfoo.cfoo.o:foo.cfoo.h<tab>gcc-cfoo.c注意格式,冒號前是目標,后是前提條件;命令在第二行,并且開始于一個tab字符。編譯內核編譯和安裝內核編譯步驟:$cd/usr/src/linux2.6$make$cd/usr/src/linux2.6$make$cd/usr/src/linux2.6$make安裝步驟(loggedasroot!)$makeinstall$makemodules_install$makeinstall$makemodules_install$makeinstall$makem
13、odules_install以下的步驟在2.6版本不再使用:$makedepends$makemodules(donebymake)$makedepends$makemodules(donebymake)$makedepends$makemodules(donebymake)提升編譯速度多花一些時間在內核配置上,并且只編譯那些你硬件需要的模塊。這樣可以把編譯時間縮短為原來的1/30,并且節省數百MB的空間。另外,你還可以并行編譯多個文件:$make-j<number>make可以并行執行多個目標(target)(KEMIN:前提是目標規則間沒有交叉依賴項,這個怎么做到的?)$mak
14、e-j4即便是在單處理器的工作站上也會很快,讀寫文件的時間被節省下來了。多線程讓CPU保持忙碌。number大于4不見得有效了,因為上下文切換過多反而降低的工作的速度。make-j<4*number_of_processors>內核編譯tips查看完整的(gcc,ld)命令彳f:$makeV=1清理所有的生成文件(tocreatepatches.):$makemrproper部分編譯:$makeM=drivers/usb/serial單獨模塊編譯:$makedrivers/usb/serial/visor.ko別處編譯(假設源碼在CDROM):$cd/mnt/cdrom/linux
15、-1$makeO=/linux/linux-1最終生成的文件vmlinux原始內核鏡像,非壓縮的arch/<arch>/boot/zImagezlib壓縮的內核鏡像(Defaultimageonarm)arch/<arch>/boot/bzImagebzip2壓縮的內核鏡像。通常很小,足夠放入一張軟盤(Defaultimageoni386)安裝的文件/boot/vmlinuz-<version>內核鏡像;/boot/System.map-<version>保存有內核的符號地址(symboladdresses);/b
16、oot/initrd-<version>.imgInitialRAMdisk:保存有你需要在引導時掛接最終根文件系統的模塊。安裝命令"makeinstall”為替你運行"mkinitrd”生成initrd;/etc/grub.confor/etc/lilo.confbootloader的配置文件:"makeinstall”會為你的新內核更新相應的bootloader的配置文件。如果你使用的是LILQ它會在生成配置文件后,執行/sbin/lilo,讓LILO的配置生效。/lib/modules/<version>/Kernelmodules+
17、extrasbuild/為本<version>的內核添加模塊所需的所有東西:.configfile(build/.config),modulesymbolinformation(build/module.symVers),kernelheaders(build/include/)kernel/內核模塊文件.ko(KernelObject),目錄結構與源代碼目標一一對應。modules.alias模塊別名記錄(用于insmod和modprobe),例如:aliassound-service-?-。snd_mixer_ossmodules.dep模塊依賴t己錄(用于insmod和mod
18、probe)modules.symbols標識某符號是屬于哪個模塊的。這個目錄的所有文件都是文本文件,可以直接查看。小結編譯及安裝步驟:編輯Make巾le版本信息定義內核特性,生成配置文件.config,用于編譯:makexconfig編譯內核:make安裝內核:makeinstall安裝模塊:makemodules_install交叉編譯內核Makefile修改通常通過修改已有的makefile獲得你必須修改目標平臺,假設目標平臺是ARM,修改以下:ARCH?=armCROSS_COMPILE?=arm-linux-ARCH?=armCROSS_COMPILE?=arm-linux-ARCH
19、?=armCROSS_COMPILE?=arm-linux-或運行帶參數的make:$cd/usr/scr/linuxXX$makeARCH=armCROSS_COMPILE=arm-linux-$cd/usr/scr/linuxXX$makeARCH=armCROSS_COMPILE=arm-linux-$cd/usr/scr/linuxXX$makeARCH=armCROSS_COMPILE=arm-linux-內核配置文件配置過程和本地配置一樣;可以把生成的配置文件(.config)分享給其他人,比如像:$cp.configarch/<arch>/config/acme_de
20、fconfig$cp.configarch/<arch>/config/acme_defconfig$cp.configarch/<arch>/config/acme_defconfig這樣其他同樣開發ACME系統的開發人員可以通過以下命令編譯出同樣的內核:$makeacme_defconfig$makeacme_defconfig$makeacme_defconfig$建立交叉編譯環境(Cross-compilingsetup)假設彳有ARM的交叉編譯工具(cross-compilingtoolchain)在in/usr/local/arm/3.3.2/,你得把它輸出
21、到PATH:$exportPATH=/usr/local/arm/3.3.2/bin:$PATH$exportPATH=/usr/local/arm/3.3.2/bin:$PATH$exportPATH=/usr/local/arm/3.3.2/bin:$PATH注意查看內核文檔(在Documentation/Changes)有關最低工具版本要求。編譯并安裝內核1 .$make/如果你修改了Make巾le或者1'.$makeARCH=armCROSS_COMPILE=arm-linux-2 .拷貝arch/<platform>/boot/zImage到目標系統$makemo
22、dules_install3 .拷貝/lib/modules/<version>到目標系統你可以通過arch/<arch>/boot/install.sh自定義安裝,讓"makeinstall”自動代勞。何為交叉編譯工具鏈(cross-compilingtoolchain)?有如任何其它開發活動一般,嵌入式開發的第一步是建立(settingup)用于構建嵌入式Linux內核(當然包括驅動程序)及應用程序的工具鏈(toolchains)。不過,嵌入式開發需要是跨平臺工具鏈。跨平臺是什么意思呢?一般開發活動是在本地編譯,使用是本地的工具鏈;而由于嵌入式的軟硬資源(
23、內存不足、沒有本地編譯器或操作系統都沒有)限制等沒法進行本地開發。需要在Linux-x86主機(HOST開發,使用主機的編譯器生成目標(TARGET平臺代碼,這個過程叫交叉編譯。我們常常說的編譯器有廣義和狹義之分。狹義的編譯器只完軟件編譯(或者叫軟件構建)的第一步;廣義的編譯器包括了軟件編譯(或者叫軟件構建)所需要代碼庫(比如libc)和其它構建工具(比如匯編器和連接器)。無論是什么編譯器都需要支持的代碼庫和各種構建工具,交叉編譯也不例外。一整套廣義的編譯器稱為交叉編譯工具鏈。何為工具鏈?Insoftware,atoolchainisthesetofcomputerprograms(tools
24、)thatareusedtocreateaproduct(typicallyanothercomputerprogramorsystemofprograms).Thetoolsmaybeusedinachain,sothattheoutputofeachtoolbecomestheinputforthenext,butthetermisusedwidelytorefertoanysetoflinkeddevelopmenttools.Asimplesoftwaredevelopmenttoolchainconsistsofatexteditorforeditingsourcecode,acom
25、pilerandlinkertotransformthesourcecodeintoanexecutableprogram,librariestoprovideinterfacestotheoperatingsystem,andadebugger.TheGNUtoolchainisablankettermforacollectionofprogrammingtoolsproducedbytheGNUProject.Thesetoolsformatoolchain(suiteoftoolsusedinaserialmanner)usedfordevelopingapplicationsandop
26、eratingsystems.ProjectsincludedintheGNUtoolchainare:* GNUmake:Automationtoolforcompilationandbuild;* GNUCompilerCollection(GCC):Suiteofcompilersforseveralprogramminglanguages;* GNUBinutils:Suiteoftoolsincludinglinker,assemblerandothertools;* GNUBison:Parsergenerator* GNUm4:m4macroprocessor* GNUDebug
27、ger(GDB):Codedebuggingtool;* GNUbuildsystem(autotools):oAutoconfoAutoheaderoAutomakeoLibtool本文來自CSDN博客,轉載請標明出處:把設備驅動程序編譯進嵌入式linux內核文章來源網絡屬于linux分類電腦編程網整理2007107簡介:這是把設備驅動程序編譯進嵌入式linux內核的詳細頁面,介紹了和linux,有關的知識,加入收藏請按鍵盤ctrl+D,謝謝大家的觀看!要查看更多有關信息,請點擊此處驅動程序的使用可以按照兩種方式編譯,一種是靜態編譯進內核,另一種是編譯成模塊以供動態加載。由于uclinux不
28、支持模塊動態加載,而且嵌入式linux不能夠象桌面linux那樣靈活的使用insmod/rmmod加載卸載設備驅動程序,因而這里只介紹將設備驅動程序靜態編譯進uclinux內核的方法。下面以uclinux為例,介紹在一個以模塊方式出現的驅動程序test.c基礎之上,將其編譯進內核的一系列步驟:11)改動test.c源帶代碼第一步,將原來的:#include#includecharkernel_version=uts_release;和"把設備驅動程序編譯進嵌入式linux內核"有關的編程小帖士:strong>session_encodeSession資料編碼。語法:booleansession_encode(void);返回值:布爾值內容說明本函數可將Session資料編碼,編碼以ZEND引擎做哈稀編碼。本函數沒有參數。成功則返回true值改動為:#ifdefmodule#include#
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第01講 冪的運算 (解析版)
- 大學生職業規劃大賽《給排水科學與工程專業》生涯發展展示
- 2025混凝土澆筑勞務合同
- 《2025年度勞動合同簽訂申請書》
- 2025箱包招商加盟合同
- 2025年外貿出口合同模板
- 2025標準臨時工作合同范本2
- 2025跨國企業合作合同范本
- 吉林省白山市撫松縣撫松縣五校2023年化學中考模擬預測試題(含答案)
- 2025年中學生安全教育
- 2024年內蒙古師范大學招聘事業編制人員考試真題
- (二模)2025年河南省五市高三第二次聯考歷史試卷(含答案)
- 飛行員勞動合同模板及條款
- 《勞動項目五:煮雞蛋》(教案)-2024-2025學年人教版勞動三年級上冊
- 第中西藝術時空對話 課件 2024-2025學年嶺南美版(2024) 初中美術七年級下冊
- 2025-2030檢測設備行業行業風險投資發展分析及投資融資策略研究報告
- (三模)廣西2025屆高中畢業班4月份適應性測試 英語試卷(含答案解析)
- (四調)武漢市2025屆高中畢業生四月調研考試 物理試卷(含答案)
- 中級財務會計課件第四章 金融資產學習資料
- 2025年濟南市中區九年級中考數學一模考試試題(含答案)
- 中國印楝素市場調查報告
評論
0/150
提交評論