版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式Linux內(nèi)核模塊的配置與編譯一、簡介隨著Linux操作系統(tǒng)在嵌入式領(lǐng)域的快速發(fā)展,越來越多的人開始投身到這方面的開發(fā)中來。但是,面對龐大的Linux內(nèi)核源代碼,開發(fā)者如何開始自己的開發(fā)工作,在完成自己的代碼后,該如何編譯測試,以及如何將自己的代碼編譯進(jìn)內(nèi)核中,所有的這些問題都直接和Linux的驅(qū)動的編譯以及Linux的內(nèi)核配置系統(tǒng)相關(guān)。內(nèi)核模塊是一些在操作系統(tǒng)內(nèi)核需要時(shí)載入和執(zhí)行的代碼,它們擴(kuò)展了操作系統(tǒng)內(nèi)核的功能卻不需要重新啟動系統(tǒng),在不需要時(shí)可以被操作系統(tǒng)卸載,又節(jié)約了系統(tǒng)的資源占用。設(shè)備驅(qū)動程序模塊就是一種內(nèi)核模塊,它們可以用來讓操作系統(tǒng)正確識別和使用使用安裝在系統(tǒng)上的硬件設(shè)備。
2、Linux內(nèi)核是由分布在全球的Linux愛好者共同開發(fā)的,為了方便開發(fā)者修改內(nèi)核,Linux的內(nèi)核采用了模塊化的內(nèi)核配置系統(tǒng),從而保證內(nèi)核擴(kuò)展的簡單與方便。本文通過一個(gè)簡單的示例,首先介紹了如何在Linux下編譯出一個(gè)內(nèi)核模塊,然后介紹了Linux內(nèi)核中的配置系統(tǒng),講述了如何將一個(gè)自定義的模塊作為系統(tǒng)源碼的一部分編譯出新的操作系統(tǒng),注意,在這里我們介紹的內(nèi)容均在內(nèi)核(也是筆者的開發(fā)平臺的版本)上編譯運(yùn)行通過,在2.6.*的版本上基本上是可以通用的。二、單獨(dú)編譯內(nèi)核模塊首先,我們先來寫一個(gè)最簡單的內(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條信息之外,沒有任何其他功能,不過,對于我們這個(gè)編譯的例子來講,已經(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中手動設(shè)置這些設(shè)定,雖然這些Makefile都是按目錄分層次存放的,但使用維護(hù)起來還是比較伏在。幸運(yùn)的是,一種稱為kbuild的新方法被引入,現(xiàn)在外部的可加載內(nèi)核模塊的編譯的方法已經(jīng)同內(nèi)核編譯統(tǒng)一起來,編譯新的內(nèi)核模塊或者將自己的內(nèi)核模塊集成到內(nèi)核源碼中都已經(jīng)變得非常簡單了。現(xiàn)在讓我們看一下如何編譯一個(gè)名字叫做test.c的模塊。首先,我們需要寫一個(gè)簡單的Makefile文件:obj-m+=test.o將test.c和Make巾
6、le文件放在同一個(gè)目錄下,然后就可以開始編譯了,使用編譯命令:make-C/usr/src/linux-/SUBDIRS=$PWDmodules回車后,也許你會發(fā)現(xiàn)有一堆的報(bào)錯(cuò),請檢查如下配置是否正確:1 、在/usr/src/下有無放置你需要使用的內(nèi)核源碼樹?如果沒有,請上網(wǎng)down一個(gè)你需要的內(nèi)核源碼版本,解壓后放在這里。2 、如果你已經(jīng)將內(nèi)核源碼解壓在/usr/src/下了,那么請先使用在內(nèi)核源碼的主目錄下,在筆者的系統(tǒng)中就是/usr/src/linux-/,使用:makeconfig或者makemenuconfig或者makegconfig等命令來酉己置
7、內(nèi)核,然后使用makeall將整個(gè)內(nèi)核完整編譯一次。3 、上述命令中的linux-是筆者使用的內(nèi)核源碼的目錄名,你需要將它改成你自己使用對應(yīng)版本的的內(nèi)核源碼的目錄名。經(jīng)過上述三步,一般來將,該內(nèi)核模塊都可以編譯通過了,生成的test.ko就是我們需要的內(nèi)核模塊的最終版本,你可以使用:insmod./test.ko將該模塊載入系統(tǒng)。請注意:如果想將模塊載入系統(tǒng),請保證編譯模塊使用的內(nèi)核源碼的版本與要載入的系統(tǒng)的版本一致!否則無法載入!嵌入式開發(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”會返回:2.6.7-acme12.內(nèi)核配置先定義內(nèi)核需要什么特性,并進(jìn)行配置。內(nèi)核構(gòu)建系統(tǒng)(Thekernelbuildsystem)遠(yuǎn)不是簡單用來構(gòu)建整個(gè)內(nèi)核和模塊,想了解更多的高級內(nèi)核構(gòu)建選項(xiàng),你可以查看Documentation/kbuild目錄內(nèi)的內(nèi)核文檔??捎玫呐渲妹詈头绞剑簃akexconfigmakemenuconfigmakeoldconfig或者手動編寫內(nèi)核編譯的配置文件.config與內(nèi)核配置的makefile?內(nèi)核配置文件(Makefile語法的)保存為內(nèi)核源代碼的頂層目錄的.config文件。發(fā)行版的內(nèi)核配置文件通常在/boot/內(nèi)。命令:make
10、xconfigqconf:全新的基于QT的配置接口,2.6版本內(nèi)核更易使用(切記閱讀help->introduction:usefuloptions!)具有文件瀏覽功能,更易的加載配置文件命令:makemenuconfig老式字符界面,依然很管用。你夠自信,完全可以手寫配置文件!命令:makeoldconfig用于升級早期發(fā)布內(nèi)核的配置文件對一些絕又揀?號(obsoletesymbols)發(fā)出警告詢問新符號的配置值何為makefile?makefile包含用以構(gòu)建應(yīng)用程序的一組規(guī)則集(setofrules)。并且第一條規(guī)則是特殊的規(guī)則,叫默認(rèn)規(guī)則(defaultrule)。一條規(guī)則由三部
11、分組成:目標(biāo)(target)、前提條件(prerequisites)和命令動作(command):target:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commandstarget:prereq1prereq2<tab>commands目標(biāo)是被構(gòu)建(made)的文件或其它東西。前提條件或者叫依賴(dependents)構(gòu)建目標(biāo)的“材料”。而命令動作是利用前提條件構(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注意格式,冒號前是目標(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í)間縮短為原來的1/30,并且節(jié)省數(shù)百M(fèi)B的空間。另外,你還可以并行編譯多個(gè)文件:$make-j<number>make可以并行執(zhí)行多個(gè)目標(biāo)(target)(KEMIN:前提是目標(biāo)規(guī)則間沒有交叉依賴項(xiàng),這個(gè)怎么做到的?)$mak
14、e-j4即便是在單處理器的工作站上也會很快,讀寫文件的時(shí)間被節(jié)省下來了。多線程讓CPU保持忙碌。number大于4不見得有效了,因?yàn)樯舷挛那袚Q過多反而降低的工作的速度。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)核的符號地址(symboladdresses);/b
16、oot/initrd-<version>.imgInitialRAMdisk:保存有你需要在引導(dǎo)時(shí)掛接最終根文件系統(tǒng)的模塊。安裝命令"makeinstall”為替你運(yùn)行"mkinitrd”生成initrd;/etc/grub.confor/etc/lilo.confbootloader的配置文件:"makeinstall”會為你的新內(nèi)核更新相應(yīng)的bootloader的配置文件。如果你使用的是LILQ它會在生成配置文件后,執(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)一一對應(yīng)。modules.alias模塊別名記錄(用于insmod和modprobe),例如:aliassound-service-?-。snd_mixer_ossmodules.dep模塊依賴t己錄(用于insmod和mod
18、probe)modules.symbols標(biāo)識某符號是屬于哪個(gè)模塊的。這個(gè)目錄的所有文件都是文本文件,可以直接查看。小結(jié)編譯及安裝步驟:編輯Make巾le版本信息定義內(nèi)核特性,生成配置文件.config,用于編譯:makexconfig編譯內(nèi)核:make安裝內(nèi)核:makeinstall安裝模塊:makemodules_install交叉編譯內(nèi)核Makefile修改通常通過修改已有的makefile獲得你必須修改目標(biāo)平臺,假設(shè)目標(biāo)平臺是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)核配置文件配置過程和本地配置一樣;可以把生成的配置文件(.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ā)人員可以通過以下命令編譯出同樣的內(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)你可以通過arch/<arch>/boot/install.sh自定義安裝,讓"makeinstall”自動代勞。何為交叉編譯工具鏈(cross-compilingtoolchain)?有如任何其它開發(fā)活動一般,嵌入式開發(fā)的第一步是建立(settingup)用于構(gòu)建嵌入式Linux內(nèi)核(當(dāng)然包括驅(qū)動程序)及應(yīng)用程序的工具鏈(toolchains)。不過,嵌入式開發(fā)需要是跨平臺工具鏈??缙脚_是什么意思呢?一般開發(fā)活動是在本地編譯,使用是本地的工具鏈;而由于嵌入式的軟硬資源(
23、內(nèi)存不足、沒有本地編譯器或操作系統(tǒng)都沒有)限制等沒法進(jìn)行本地開發(fā)。需要在Linux-x86主機(jī)(HOST開發(fā),使用主機(jī)的編譯器生成目標(biāo)(TARGET平臺代碼,這個(gè)過程叫交叉編譯。我們常常說的編譯器有廣義和狹義之分。狹義的編譯器只完軟件編譯(或者叫軟件構(gòu)建)的第一步;廣義的編譯器包括了軟件編譯(或者叫軟件構(gòu)建)所需要代碼庫(比如libc)和其它構(gòu)建工具(比如匯編器和連接器)。無論是什么編譯器都需要支持的代碼庫和各種構(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本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:把設(shè)備驅(qū)動程序編譯進(jìn)嵌入式linux內(nèi)核文章來源網(wǎng)絡(luò)屬于linux分類電腦編程網(wǎng)整理2007107簡介:這是把設(shè)備驅(qū)動程序編譯進(jìn)嵌入式linux內(nèi)核的詳細(xì)頁面,介紹了和linux,有關(guān)的知識,加入收藏請按鍵盤ctrl+D,謝謝大家的觀看!要查看更多有關(guān)信息,請點(diǎn)擊此處驅(qū)動程序的使用可以按照兩種方式編譯,一種是靜態(tài)編譯進(jìn)內(nèi)核,另一種是編譯成模塊以供動態(tài)加載。由于uclinux不
28、支持模塊動態(tài)加載,而且嵌入式linux不能夠象桌面linux那樣靈活的使用insmod/rmmod加載卸載設(shè)備驅(qū)動程序,因而這里只介紹將設(shè)備驅(qū)動程序靜態(tài)編譯進(jìn)uclinux內(nèi)核的方法。下面以uclinux為例,介紹在一個(gè)以模塊方式出現(xiàn)的驅(qū)動程序test.c基礎(chǔ)之上,將其編譯進(jìn)內(nèi)核的一系列步驟:11)改動test.c源帶代碼第一步,將原來的:#include#includecharkernel_version=uts_release;和"把設(shè)備驅(qū)動程序編譯進(jìn)嵌入式linux內(nèi)核"有關(guān)的編程小帖士:strong>session_encodeSession資料編碼。語法:booleansession_encode(void);返回值:布爾值內(nèi)容說明本函數(shù)可將Session資料編碼,編碼以ZEND引擎做哈稀編碼。本函數(shù)沒有參數(shù)。成功則返回true值改動為:#ifdefmodule#include#
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44918-2024城鎮(zhèn)供水單位節(jié)水管理規(guī)范
- 有關(guān)法律服務(wù)所律師工作計(jì)劃例文
- 高二英語下整整學(xué)期教學(xué)計(jì)劃
- 工作計(jì)劃農(nóng)業(yè)干部學(xué)習(xí)計(jì)劃
- 春季幼兒總園學(xué)期工作計(jì)劃范文
- 小學(xué)語文四年級教學(xué)工作計(jì)劃表
- 任職目標(biāo)2025年干部綜合科個(gè)人寫作目標(biāo)計(jì)劃
- 公司會計(jì)、財(cái)務(wù)工作計(jì)劃文稿
- 《多基因病》課件
- 《蛋白質(zhì)化學(xué)最終版》課件
- 部編版歷史九年級上冊第六單元 第17課君主立憲制的英國【課件】y
- 2024年《建筑設(shè)備安裝》復(fù)習(xí)考試題庫及答案(含各題型)
- 2024政府采購評審專家考試題庫附含答案
- 2022年內(nèi)蒙古導(dǎo)游資格考試(含各科)題庫(含答案和必背題)
- 道路清掃環(huán)衛(wèi)報(bào)價(jià)方案
- 第24課《穿井得一人》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì) 統(tǒng)編版語文七年級上冊
- 廣告創(chuàng)意與品牌宣傳考核試卷
- 提高吸入劑使用正確率品管圈成果匯報(bào)
- 《2025年日歷》電子版模板年歷月歷工作學(xué)習(xí)計(jì)劃橫版 日歷計(jì)劃
- 保安保潔保障人員院感培訓(xùn)
- 會議接待擺臺培訓(xùn)
評論
0/150
提交評論