嵌入式Linux內(nèi)核模塊的配置與編譯_第1頁(yè)
嵌入式Linux內(nèi)核模塊的配置與編譯_第2頁(yè)
嵌入式Linux內(nèi)核模塊的配置與編譯_第3頁(yè)
嵌入式Linux內(nèi)核模塊的配置與編譯_第4頁(yè)
嵌入式Linux內(nèi)核模塊的配置與編譯_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式Linux內(nèi)核模塊的配置與編譯一、簡(jiǎn)介隨著Linux操作系統(tǒng)在嵌入式領(lǐng)域的快速發(fā)展,越來(lái)越多的人開始投身到這方面的開發(fā)中來(lái)。但是,面對(duì)龐大的Linux內(nèi)核源代碼,開發(fā)者如何開始自己的開發(fā)工作,在完成自己的代碼后,該如何編譯測(cè)試,以及如何將自己的代碼編譯進(jìn)內(nèi)核中,所有的這些問(wèn)題都直接和Linux的驅(qū)動(dòng)的編譯以及Linux的內(nèi)核配置系統(tǒng)相關(guān)。內(nèi)核模塊是一些在操作系統(tǒng)內(nèi)核需要時(shí)載入和執(zhí)行的代碼,它們擴(kuò)展了操作系統(tǒng)內(nèi)核的功能卻不需要重新啟動(dòng)系統(tǒng),在不需要時(shí)可以被操作系統(tǒng)卸載,又節(jié)約了系統(tǒng)的資源占用。設(shè)備驅(qū)動(dòng)程序模塊就是一種內(nèi)核模塊,它們可以用來(lái)讓操作系統(tǒng)正確識(shí)別和使用使用安裝在系統(tǒng)上的硬件設(shè)備。

2、Linux內(nèi)核是由分布在全球的Linux愛(ài)好者共同開發(fā)的,為了方便開發(fā)者修改內(nèi)核,Linux的內(nèi)核采用了模塊化的內(nèi)核配置系統(tǒng),從而保證內(nèi)核擴(kuò)展的簡(jiǎn)單與方便。本文通過(guò)一個(gè)簡(jiǎn)單的示例,首先介紹了如何在Linux下編譯出一個(gè)內(nèi)核模塊,然后介紹了Linux內(nèi)核中的配置系統(tǒng),講述了如何將一個(gè)自定義的模塊作為系統(tǒng)源碼的一部分編譯出新的操作系統(tǒng),注意,在這里我們介紹的內(nèi)容均在內(nèi)核(也是筆者的開發(fā)平臺(tái)的版本)上編譯運(yùn)行通過(guò),在2.6.*的版本上基本上是可以通用的。二、單獨(dú)編譯內(nèi)核模塊首先,我們先來(lái)寫一個(gè)最簡(jiǎn)單的內(nèi)核模塊:#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);這個(gè)內(nèi)核模塊除了在載入和卸載的時(shí)候打印2條信息之外,沒(méi)有任何其他功能,不過(guò),對(duì)于我們這個(gè)編譯的例子來(lái)講,已經(jīng)足夠了。將上述源代碼保存到一個(gè)test.c文件中,然后開始我們的內(nèi)核模塊的編譯工作。內(nèi)核模塊的編譯與普通應(yīng)用程序的編譯一樣,也使用的GCC但是內(nèi)核模塊在用GCC

5、S譯的時(shí)候時(shí)需要使用特定的參數(shù)并定義一些宏。這是因?yàn)樵诰幾g普通應(yīng)用程序的可執(zhí)行文件和內(nèi)核模塊時(shí),內(nèi)核頭文件起的作用是不同的。在以往的內(nèi)核版本需要我們?nèi)ピ贛akefile中手動(dòng)設(shè)置這些設(shè)定,雖然這些Makefile都是按目錄分層次存放的,但使用維護(hù)起來(lái)還是比較伏在。幸運(yùn)的是,一種稱為kbuild的新方法被引入,現(xiàn)在外部的可加載內(nèi)核模塊的編譯的方法已經(jīng)同內(nèi)核編譯統(tǒng)一起來(lái),編譯新的內(nèi)核模塊或者將自己的內(nèi)核模塊集成到內(nèi)核源碼中都已經(jīng)變得非常簡(jiǎn)單了?,F(xiàn)在讓我們看一下如何編譯一個(gè)名字叫做test.c的模塊。首先,我們需要寫一個(gè)簡(jiǎn)單的Makefile文件:obj-m+=test.o將test.c和Make巾

6、le文件放在同一個(gè)目錄下,然后就可以開始編譯了,使用編譯命令:make-C/usr/src/linux-/SUBDIRS=$PWDmodules回車后,也許你會(huì)發(fā)現(xiàn)有一堆的報(bào)錯(cuò),請(qǐng)檢查如下配置是否正確:1 、在/usr/src/下有無(wú)放置你需要使用的內(nèi)核源碼樹?如果沒(méi)有,請(qǐng)上網(wǎng)down一個(gè)你需要的內(nèi)核源碼版本,解壓后放在這里。2 、如果你已經(jīng)將內(nèi)核源碼解壓在/usr/src/下了,那么請(qǐng)先使用在內(nèi)核源碼的主目錄下,在筆者的系統(tǒng)中就是/usr/src/linux-/,使用:makeconfig或者makemenuconfig或者makegconfig等命令來(lái)酉己置

7、內(nèi)核,然后使用makeall將整個(gè)內(nèi)核完整編譯一次。3 、上述命令中的linux-是筆者使用的內(nèi)核源碼的目錄名,你需要將它改成你自己使用對(duì)應(yīng)版本的的內(nèi)核源碼的目錄名。經(jīng)過(guò)上述三步,一般來(lái)將,該內(nèi)核模塊都可以編譯通過(guò)了,生成的test.ko就是我們需要的內(nèi)核模塊的最終版本,你可以使用:insmod./test.ko將該模塊載入系統(tǒng)。請(qǐng)注意:如果想將模塊載入系統(tǒng),請(qǐng)保證編譯模塊使用的內(nèi)核源碼的版本與要載入的系統(tǒng)的版本一致!否則無(wú)法載入!嵌入式開發(fā)實(shí)作(Linux內(nèi)核編譯及安裝)部分內(nèi)容譯自«EmbeddedLinuxkernelanddriverdevelopment&#

8、187;byMichaelOpdenacker劉建文(KEY:Linux內(nèi)核編譯內(nèi)核配置嵌入式內(nèi)核配置(Kernelconfiguration)Makefile版本修改為了區(qū)別基于同一源碼構(gòu)建(bulid)的不內(nèi)核鏡像,可使用變量EXTRAVERSION定義位于makefile的頂部):VERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmelVERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmelVERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acmel運(yùn)行&quo

9、t;uname-r”會(huì)返回:2.6.7-acme12.內(nèi)核配置先定義內(nèi)核需要什么特性,并進(jìn)行配置。內(nèi)核構(gòu)建系統(tǒng)(Thekernelbuildsystem)遠(yuǎn)不是簡(jiǎn)單用來(lái)構(gòu)建整個(gè)內(nèi)核和模塊,想了解更多的高級(jí)內(nèi)核構(gòu)建選項(xiàng),你可以查看Documentation/kbuild目錄內(nèi)的內(nèi)核文檔??捎玫呐渲妹詈头绞剑簃akexconfigmakemenuconfigmakeoldconfig或者手動(dòng)編寫內(nèi)核編譯的配置文件.config與內(nèi)核配置的makefile?內(nèi)核配置文件(Makefile語(yǔ)法的)保存為內(nèi)核源代碼的頂層目錄的.config文件。發(fā)行版的內(nèi)核配置文件通常在/boot/內(nèi)。命令:make

10、xconfigqconf:全新的基于QT的配置接口,2.6版本內(nèi)核更易使用(切記閱讀help->introduction:usefuloptions!)具有文件瀏覽功能,更易的加載配置文件命令:makemenuconfig老式字符界面,依然很管用。你夠自信,完全可以手寫配置文件!命令:makeoldconfig用于升級(jí)早期發(fā)布內(nèi)核的配置文件對(duì)一些絕又揀?號(hào)(obsoletesymbols)發(fā)出警告詢問(wèn)新符號(hào)的配置值何為makefile?makefile包含用以構(gòu)建應(yīng)用程序的一組規(guī)則集(setofrules)。并且第一條規(guī)則是特殊的規(guī)則,叫默認(rèn)規(guī)則(defaultrule)。一條規(guī)則由三部

11、分組成:目標(biāo)(target)、前提條件(prerequisites)和命令動(dòng)作(command):target:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commands目標(biāo)是被構(gòu)建(made)的文件或其它東西。前提條件或者叫依賴(dependents)構(gòu)建目標(biāo)的“材料”。而命令動(dòng)作是利用前提條件構(gòu)建目標(biāo)的shell命令。以下是編譯C源碼的規(guī)則例子: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注意格式,冒號(hào)前是目標(biāo),后是前提條件;命令在第二行,并且開始于一個(gè)tab字符。編譯內(nèi)核編譯和安裝內(nèi)核編譯步驟:$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)提升編譯速度多花一些時(shí)間在內(nèi)核配置上,并且只編譯那些你硬件需要的模塊。這樣可以把編譯時(shí)間縮短為原來(lái)的1/30,并且節(jié)省數(shù)百M(fèi)B的空間。另外,你還可以并行編譯多個(gè)文件:$make-j<number>make可以并行執(zhí)行多個(gè)目標(biāo)(target)(KEMIN:前提是目標(biāo)規(guī)則間沒(méi)有交叉依賴項(xiàng),這個(gè)怎么做到的?)$mak

14、e-j4即便是在單處理器的工作站上也會(huì)很快,讀寫文件的時(shí)間被節(jié)省下來(lái)了。多線程讓CPU保持忙碌。number大于4不見(jiàn)得有效了,因?yàn)樯舷挛那袚Q過(guò)多反而降低的工作的速度。make-j<4*number_of_processors>內(nèi)核編譯tips查看完整的(gcc,ld)命令彳f:$makeV=1清理所有的生成文件(tocreatepatches.):$makemrproper部分編譯:$makeM=drivers/usb/serial單獨(dú)模塊編譯:$makedrivers/usb/serial/visor.ko別處編譯(假設(shè)源碼在CDROM):$cd/mnt/cdrom/linux

15、-1$makeO=/linux/linux-1最終生成的文件vmlinux原始內(nèi)核鏡像,非壓縮的arch/<arch>/boot/zImagezlib壓縮的內(nèi)核鏡像(Defaultimageonarm)arch/<arch>/boot/bzImagebzip2壓縮的內(nèi)核鏡像。通常很小,足夠放入一張軟盤(Defaultimageoni386)安裝的文件/boot/vmlinuz-<version>內(nèi)核鏡像;/boot/System.map-<version>保存有內(nèi)核的符號(hào)地址(symboladdresses);/b

16、oot/initrd-<version>.imgInitialRAMdisk:保存有你需要在引導(dǎo)時(shí)掛接最終根文件系統(tǒng)的模塊。安裝命令"makeinstall”為替你運(yùn)行"mkinitrd”生成initrd;/etc/grub.confor/etc/lilo.confbootloader的配置文件:"makeinstall”會(huì)為你的新內(nèi)核更新相應(yīng)的bootloader的配置文件。如果你使用的是LILQ它會(huì)在生成配置文件后,執(zhí)行/sbin/lilo,讓LILO的配置生效。/lib/modules/<version>/Kernelmodules+

17、extrasbuild/為本<version>的內(nèi)核添加模塊所需的所有東西:.configfile(build/.config),modulesymbolinformation(build/module.symVers),kernelheaders(build/include/)kernel/內(nèi)核模塊文件.ko(KernelObject),目錄結(jié)構(gòu)與源代碼目標(biāo)一一對(duì)應(yīng)。modules.alias模塊別名記錄(用于insmod和modprobe),例如:aliassound-service-?-。snd_mixer_ossmodules.dep模塊依賴t己錄(用于insmod和mod

18、probe)modules.symbols標(biāo)識(shí)某符號(hào)是屬于哪個(gè)模塊的。這個(gè)目錄的所有文件都是文本文件,可以直接查看。小結(jié)編譯及安裝步驟:編輯Make巾le版本信息定義內(nèi)核特性,生成配置文件.config,用于編譯:makexconfig編譯內(nèi)核:make安裝內(nèi)核:makeinstall安裝模塊:makemodules_install交叉編譯內(nèi)核Makefile修改通常通過(guò)修改已有的makefile獲得你必須修改目標(biāo)平臺(tái),假設(shè)目標(biāo)平臺(tái)是ARM,修改以下:ARCH?=armCROSS_COMPILE?=arm-linux-ARCH?=armCROSS_COMPILE?=arm-linux-ARCH

19、?=armCROSS_COMPILE?=arm-linux-或運(yùn)行帶參數(shù)的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-內(nèi)核配置文件配置過(guò)程和本地配置一樣;可以把生成的配置文件(.config)分享給其他人,比如像:$cp.configarch/<arch>/config/acme_de

20、fconfig$cp.configarch/<arch>/config/acme_defconfig$cp.configarch/<arch>/config/acme_defconfig這樣其他同樣開發(fā)ACME系統(tǒng)的開發(fā)人員可以通過(guò)以下命令編譯出同樣的內(nèi)核:$makeacme_defconfig$makeacme_defconfig$makeacme_defconfig$建立交叉編譯環(huán)境(Cross-compilingsetup)假設(shè)彳有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注意查看內(nèi)核文檔(在Documentation/Changes)有關(guān)最低工具版本要求。編譯并安裝內(nèi)核1 .$make/如果你修改了Make巾le或者1'.$makeARCH=armCROSS_COMPILE=arm-linux-2 .拷貝arch/<platform>/boot/zImage到目標(biāo)系統(tǒng)$makemo

22、dules_install3 .拷貝/lib/modules/<version>到目標(biāo)系統(tǒng)你可以通過(guò)arch/<arch>/boot/install.sh自定義安裝,讓"makeinstall”自動(dòng)代勞。何為交叉編譯工具鏈(cross-compilingtoolchain)?有如任何其它開發(fā)活動(dòng)一般,嵌入式開發(fā)的第一步是建立(settingup)用于構(gòu)建嵌入式Linux內(nèi)核(當(dāng)然包括驅(qū)動(dòng)程序)及應(yīng)用程序的工具鏈(toolchains)。不過(guò),嵌入式開發(fā)需要是跨平臺(tái)工具鏈??缙脚_(tái)是什么意思呢?一般開發(fā)活動(dòng)是在本地編譯,使用是本地的工具鏈;而由于嵌入式的軟硬資源(

23、內(nèi)存不足、沒(méi)有本地編譯器或操作系統(tǒng)都沒(méi)有)限制等沒(méi)法進(jìn)行本地開發(fā)。需要在Linux-x86主機(jī)(HOST開發(fā),使用主機(jī)的編譯器生成目標(biāo)(TARGET平臺(tái)代碼,這個(gè)過(guò)程叫交叉編譯。我們常常說(shuō)的編譯器有廣義和狹義之分。狹義的編譯器只完軟件編譯(或者叫軟件構(gòu)建)的第一步;廣義的編譯器包括了軟件編譯(或者叫軟件構(gòu)建)所需要代碼庫(kù)(比如libc)和其它構(gòu)建工具(比如匯編器和連接器)。無(wú)論是什么編譯器都需要支持的代碼庫(kù)和各種構(gòu)建工具,交叉編譯也不例外。一整套廣義的編譯器稱為交叉編譯工具鏈。何為工具鏈?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本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:把設(shè)備驅(qū)動(dòng)程序編譯進(jìn)嵌入式linux內(nèi)核文章來(lái)源網(wǎng)絡(luò)屬于linux分類電腦編程網(wǎng)整理2007107簡(jiǎn)介:這是把設(shè)備驅(qū)動(dòng)程序編譯進(jìn)嵌入式linux內(nèi)核的詳細(xì)頁(yè)面,介紹了和linux,有關(guān)的知識(shí),加入收藏請(qǐng)按鍵盤ctrl+D,謝謝大家的觀看!要查看更多有關(guān)信息,請(qǐng)點(diǎn)擊此處驅(qū)動(dòng)程序的使用可以按照兩種方式編譯,一種是靜態(tài)編譯進(jìn)內(nèi)核,另一種是編譯成模塊以供動(dòng)態(tài)加載。由于uclinux不

28、支持模塊動(dòng)態(tài)加載,而且嵌入式linux不能夠象桌面linux那樣靈活的使用insmod/rmmod加載卸載設(shè)備驅(qū)動(dòng)程序,因而這里只介紹將設(shè)備驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)uclinux內(nèi)核的方法。下面以u(píng)clinux為例,介紹在一個(gè)以模塊方式出現(xiàn)的驅(qū)動(dòng)程序test.c基礎(chǔ)之上,將其編譯進(jìn)內(nèi)核的一系列步驟:11)改動(dòng)test.c源帶代碼第一步,將原來(lái)的:#include#includecharkernel_version=uts_release;和"把設(shè)備驅(qū)動(dòng)程序編譯進(jìn)嵌入式linux內(nèi)核"有關(guān)的編程小帖士:strong>session_encodeSession資料編碼。語(yǔ)法:booleansession_encode(void);返回值:布爾值內(nèi)容說(shuō)明本函數(shù)可將Session資料編碼,編碼以ZEND引擎做哈稀編碼。本函數(shù)沒(méi)有參數(shù)。成功則返回true值改動(dòng)為:#ifdefmodule#include#

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論