




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌入式 Linux 內核模塊的配置與編譯一、簡介隨著 Linux 操作系統(tǒng)在嵌入式領域的快速發(fā)展,越來越多的人開始投身到 這方面的開發(fā)中來。 但是,面對龐大的 Linux 內核源代碼, 開發(fā)者如何開始自己 的開發(fā)工作,在完成自己的代碼后, 該如何編譯測試, 以及如何將自己的代碼編 譯進內核中,所有的這些問題都直接和 Linux 的驅動的編譯以及 Linux 的內核配 置系統(tǒng)相關。內核模塊是一些在操作系統(tǒng)內核需要時載入和執(zhí)行的代碼, 它們擴展了操作 系統(tǒng)內核的功能卻不需要重新啟動系統(tǒng) , 在不需要時可以被操作系統(tǒng)卸載,又節(jié) 約了系統(tǒng)的資源占用。 設備驅動程序模塊就是一種內核模塊, 它們可以用來讓
2、操 作系統(tǒng)正確識別和使用使用安裝在系統(tǒng)上的硬件設備。Linux 內核是由分布在全球的 Linux 愛好者共同開發(fā)的, 為了方便開發(fā)者修 改內核, Linux 的內核采用了模塊化的內核配置系統(tǒng),從而保證內核擴展的簡單 與方便。本文通過一個簡單的示例, 首先介紹了如何在 Linux 下編譯出一個內核模塊, 然后介紹了 Linux 內核中的配置系統(tǒng), 講述了如何將一個自定義的模塊作為系統(tǒng) 源碼的一部分編譯出新的操作系統(tǒng),注意,在這里我們介紹的內容均在內核 (也是筆者的開發(fā)平臺的版本)上編譯運行通過,在 2.6.* 的版本上基 本上是可以通用的。二、單獨編譯內核模塊首先,我們先來寫一
3、個最簡單的內核模塊:#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "RF"#define DRIVER_DESC "just for test"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(&q
4、uot;GPL");staticintrfmodule_init(void)printk("hello,world:modele_init");return 0;static void rfmodule_exit(void)printk("hello,world:modele_exit");module_init (rfmodule_init);module_exit (rfmodule_exit);這個內核模塊除了在載入和卸載的時候打印 2 條信息之外,沒有任何其他功 能,不過,對于我們這個編譯的例子來講,已經足夠了。將上述源代碼保存到一個
5、test.c 文件中,然后開始我們的內核模塊的編譯 工作。內核模塊的編譯與普通應用程序的編譯一樣,也使用的 GCC但是內核模塊 在用GCCS譯的時候時需要使用特定的參數并定義一些宏。這是因為在編譯普 通應用程序的可執(zhí)行文件和內核模塊時, 內核頭文件起的作用是不同的。 在以往 的內核版本需要我們去在 Makefile 中手動設置這些設定,雖然這些 Makefile 都是按目錄分層次存放的, 但使用維護起來還是比較伏在。 幸運的是, 一種稱為 kbuild 的新方法被引入,現在外部的可加載內核模塊的編譯的方法已經同內核 編譯統(tǒng)一起來,編譯新的內核模塊或者將自己的內核模塊集成到內核源碼中都已 經變得
6、非常簡單了?,F在讓我們看一下如何編譯一個名字叫做 test.c 的模塊。首先,我們需要寫一個簡單的 Makefile 文件:obj-m += test.o將 test.c 和 Makefile 文件放在同一個目錄下, 然后就可以開始編譯了, 使 用編譯命令:make -C /usr/src/linux-/ SUBDIRS=$PWD modules回車后,也許你會發(fā)現有一堆的報錯,請檢查如下配置是否正確:1 、在 /usr/src/ 下有無放置你需要使用的內核源碼樹?如果沒有,請上網 down個你需要的內核源碼版本,解壓后放在這里。2 、如果你已經將內核源碼解壓在 /usr/sr
7、c/ 下了,那么請先使用在內核源碼 的主目錄下,在筆者的系統(tǒng)中就是 /usr/src/linux-/ ,使用 :make config 或者 makemenuconfig 或者 makegconfig 等命令來配置內核, 然后使用 make all 將整個內核完整編譯一次。3 、上述命令中的 linux- 是筆者使用的內核源碼的目錄名, 你需要 將它改成你自己使用對應版本的的內核源碼的目錄名。經過上述三步,一般來將,該內核模塊都可以編譯通過了,生成的 test.ko 就是我們需要的內核模塊的最終版本,你可以使用 :insmod ./test.ko 將該模塊載入系
8、統(tǒng)。請注意:如果想將模塊載入系統(tǒng), 請保證編譯模塊使用的內核源碼的版本與 要載入的系統(tǒng)的版本一致!否則無法載入!嵌入式開發(fā)實作( Linux 內核編譯及安裝)部分內容譯自 Embedded Linux kernel and driver development by Michael Opdenacker劉建文( )KEY:L in ux內核編譯內核配置嵌入式內核配置( Kernel configuration )Makefile 版本修改為了區(qū)別基于同一源碼構建(bulid )的不內核鏡像,可使用變量EXTRAVERSION定義位于makefile 的頂部):VERSION = 2PATCHL
9、EVEL = 6SUBLEVEL = 7EXTRAVERSION = -acme1VERSION = 2PATCHLEVEL = 6SUBLEVEL = 7EXTRAVERSION = -acme1VERSION = 2PATCHLEVEL = 6SUBLEVEL = 7EXTRAVERSION = -acme1運行“ uname -r ”會返回: 2.6.7-acme12.內核配置先定義內核需要什么特性,并進行配置。內核構建系統(tǒng)( The kernel build system )遠不是簡 單用來構建整個內核和模塊, 想了解更多的高級內 核構建選項, 你可以查看 Documentation/
10、kbuild 目錄內的內核文檔。可用的配置命令和方式:makexconfig makemenuconfig makeoldconfig 或者手動編寫 內核編譯的配置文件 .config 與內核配置的 makefile?內核配置文件( Makefile 語法的)保存為內核源代碼的頂層目錄的 .config 文件。發(fā)行版的內 核配置文件通常在 /boot/ 內。命令: makexconfig qconf: 全新的基于 QT 的配置接口, 2.6 版本內核 更易使用(切記閱讀 help -> introduction: useful options! ) 具有文件瀏覽功能,更易的加載配置文件
11、命令: makemenuconfig老式字符界面,依然很管用。你夠自信,完全可以手寫配置文件!命令: makeoldconfig用于升級早期發(fā)布內核的配置文件 對一些絕對符號( obsolete symbols )發(fā)出警告 詢問新符號的配置值何為 makefile?makefile 包含用以構建應用程序的一組規(guī)則集 (set of rules )。并且第一條 規(guī)則 是特殊的 規(guī) 則 ,叫 默認規(guī)則 ( default rule )。一條 規(guī)則 由三部分組成:目標( target )、前提條件 (prerequisites )和命令動作( command ):target: prereq1 pr
12、ereq2 <tab>commands target: prereq1 prereq2 <tab>commands target: prereq1 prereq2 <tab>commands目標是被構建(made)的文件或其它東西。前提條件或者叫依賴(dependents)構建 目標的“材料”。而命令動作是利用前提條件構建目標的shell命令。以下是編譯C源碼的規(guī)則例子:foo.o: foo.cfoo.h lt;tab>gcc -c foo.c foo.o: foo.cfoo.h lt;tab>gcc -c foo.c foo.o: foo.cf
13、oo.h <tab>gcc -c foo.c注意格式,冒號前是 目標,后是前提條件 ; 命令在第二行,并且開始于一個tab 字符。編譯內核編譯和安裝內核編譯步驟:$ cd /usr/src/linux2. 6$ make$ cd /usr/src/linux2.6$ make$ cd /usr/src/linux2.6$ make安裝步驟 (logged as root!)$ make install$ make modules_install$ make install$ make modules_install$ make install$ make modules_insta
14、ll以下的步驟在 2.6 版本不再使用:$ make depends$ make modules (done by make)$ make depends$ make modules (done by make)$ make depends$ make modules (done by make)提升編譯速度多花一些時間在內核配置上, 并且只編譯那些你硬件需要的模塊。 這樣可以把編譯時間縮短 為原來的 1/30 ,并且節(jié)省數百 MB 的空間。另外,你還可以并行編譯多個文件:$ make -j <number>make可以并行執(zhí)行多個目標(target) ( KEMIN:前提是目標規(guī)
15、則間沒有交叉依賴項,這個怎 么做到的?)$ make -j 4即便是在單處理器的工作站上也會很快,讀寫文件的時間被節(jié)省下來了。多線程讓CPU 保持忙碌。number 大于 4 不見得有效了,因為上下文切換過多反而降低的工作的速度。 make -j <4*number_of_processors>內核編譯 tips查看完整的 (gcc. Id)命令行:$ make V=1清理所有的生成文件 (to create patches.): $ make mrproper 部分編譯: $ make M=drivers/usb/seriaI 單獨模塊編譯: $ make drivers/usb
16、/seriaI/visor.ko 別處編譯(假設源碼在CDROM):$ cd /mnt/cdrom/Iinux-1$ make O=/Iinux/Iinux-1 最終生成的文件 vmIinux 原始內核鏡像,非壓縮的 arch/<arch>/boot/zImagezIib 壓縮的內核鏡像( DefauIt image on arm ) arch/<arch>/boot/bzImage bzip2 壓縮的內核鏡像。通常很小,足夠放入一張軟盤( DefauIt image on i386 )安裝的文件/boot/vmIinuz-<ver
17、sion> 內核鏡像;/boot/System.map-<version> 保存有內核的符號地址( symboI addresses); /boot/initrd-<version>.img InitiaI RAM disk :保存有你需要在引導時掛接最終根文件系統(tǒng)的模 塊。安裝命令“ make instaII ”為替你運行“ mkinitrd ”生成 initrd ;/etc/grub.conf or /etc/IiIo.confbootloader的配置文件:“ make in stall”會為你的新內核更新相應的bootloader的配置文件。如果你使用的是
18、 LILO,它會在生成配置文件后,執(zhí)行/sbin/lilo,讓LILO的配置生效。/lib/modules/<version>/ Kernel modules + extras build/為本 <version>的內核添加模塊所需的所有東西:.config file (build/.config), module symbolinformation (build/module.symVers), kernel headers (build/include/) kernel/內核模塊文件 .ko (Kernel Object) ,目錄結構與源代碼目標一一對應。modul
19、es.alias模塊別名記錄(用于 insmod 和 modprobe ),例如:alias sound- service-?-0 snd_mixer_oss modules.dep模塊依賴記錄(用于 insmod 和 modprobe )modules.symbols 標識某符號是屬于哪個模塊的。 這個目錄的所有文件都是文本文件,可以直接查看。小結編譯及安裝步驟:編輯 Makefile 版本信息定義內核特性,生成配置文件.config,用于編譯:makexco nfig編譯內核: make安裝內核: make install安裝模塊: makemodules_install交叉編譯內核Mak
20、efile 修改通常通過修改已有的 makefile 獲得你必須修改目標平臺,假設目標平臺是ARM,修改以下:ARCH ?= arm CROSS_COMPILE ?= arm-linux-ARCH ?= arm CROSS_COMPILE ?= arm-linux-ARCH ?= arm CROSS_COMPILE ?= arm-linux-或運行帶參數的 make:$ cd /usr/scr/linuxXX$ make ARCH=arm CROSS_COMPILE=arm-linux-$ cd /usr/scr/linuxXX$ make ARCH=arm CROSS_COMPILE=arm
21、-linux-$ cd /usr/scr/linuxXX$ make ARCH=arm CROSS_COMPILE=arm-linux-內核配置文件配置過程和本地配置一樣;可以把生成的配置文件(.config)分享給其他人,比如像:$ cp .config arch/<arch>/config/acme_defconfig$ cp .config arch/<arch>/config/acme_defconfig$ cp .config arch/<arch>/config/acme_defconfig這樣其他同樣開發(fā) ACME系統(tǒng)的開發(fā)人員可以通過以下命令
22、編譯出同樣的內核:$ make acme_defconfig$ make acme_defconfig$ make acme_defconfig$建立交叉編譯環(huán)境( Cross-compiling setup ) 假設你有 ARM 的交叉編譯工具( cross-compiling toolchain )在 in /usr/local/arm/3.3.2/ ,你 得把它輸出到 PATH: $ export PATH=/usr/local/arm/ 3.3 . 2 /bin:$PATH$ export PATH=/usr/local/arm/3.3.2/bin:$PATH$ export PATH
23、=/usr/local/arm/3.3.2/bin:$PATH注意查看內核文檔(在 Documentation/Changes )有關最低工具版本要求。 編譯并安裝內核1. $ make / 如果你修改了 Makefile或者1'. $ make ARCH=arm CROSS_COMPILE=arm-linux- 2. 拷貝 arch/<platform>/boot/zImage 到目標系統(tǒng)$ make modules_install3. 拷貝 /lib/modules/<version> 到目標系統(tǒng)你可以通過 arch/<arch>/boot/in
24、stall.sh 自定義安裝,讓” make install “自動代勞。何為交叉編譯工具鏈 (cross-compiling toolchain) ?有如任何其它開發(fā)活動一般, 嵌入式開發(fā)的第一步是建立 ( setting up )用于構建嵌入式 Linux 內核(當然包括驅動程序)及應用程序的工具鏈(toolchains )。不過,嵌入式開發(fā)需要是跨平臺工具鏈。 跨平臺是什么意思呢?一般開發(fā)活動是在本地編譯, 使用是本地的工具鏈; 而 由于嵌入式的軟硬資源 (內存不足、 沒有本地編譯器或操作系統(tǒng)都沒有) 限制等沒法進行本 地開發(fā)。需要在 Linux-x86主機(HOST開發(fā),使用主機的編譯
25、器生成目標( TARGET平臺 代碼,這個過程叫交叉編譯。我們常常說的編譯器有廣義和狹義之分。 狹義的編譯器只完軟件編譯 (或者叫軟件構建) 的 第一步;廣義的編譯器包括了軟件編譯(或者叫軟件構建)所需要代碼庫(比如libc)和其它構建工具(比如匯編器和連接器) 。無論是什么編譯器都需要支持的代碼庫和各種構建工 具,交叉編譯也不例外。一整套廣義的編譯器稱為交叉編譯工具鏈。何為工具鏈?In software, a toolchain is the set of computer programs (tools) that are used to create a product (typical
26、ly another computer program or system of programs). The tools may be used in a chain, so that the output of each tool becomes the input for the next, but the term is used widely torefer to any set of lin ked developme nt tools.A simple software development toolchain consists of a text editor for edi
27、ting source code, a compiler and lin ker to tran sform the source code into an executable program, libraries to provide in terfaces to the operati ng system, and a debugger.The GNU toolcha in is a bla nket term for a collect ion of program ming tools produced by the GNU Project. These tools form a t
28、oolcha in (suite of tools used in a serial manner) used for develop ing applicati ons and operat ing systems.Projects in cluded in the GNU toolcha in are:* GNU make: Automation tool for compilation and build;* GNU Compiler Collection (GCC): Suite of compilers for several programming Ianguages;* GNU
29、Binutils: Suite of tools including linker, assembler and other tools;* GNU Bis on: Parser gen erator* GNU m4: m4 macro processor* GNU Debugger (GDB): Code debugging tool;* GNU build system (autotools):oAutoc onfoAutoheaderoAutomakeoLibtool dex.php/2006/01/05/autotools-tutorial/本文來 自 CSDN 博客, 轉載請標明 出
30、 處http:/blog.csd n.n et/shijizhishe ng/archive/2009/09/16/4558107.aspx把設備驅動程序編譯進嵌入式linux內核文章來源網絡屬于linux分類電腦編程網整理2007107簡介:這是把設備驅動程序編譯進嵌入式linux內核的詳細頁面,介紹了和linux,有關的知識,加入收藏請按鍵盤ctrl+D,謝謝大家的觀看!要查看更多有關信息,請點擊此處驅動程序的使用可以按照兩種方式編譯,一種是靜態(tài)編譯進內核,另一種是編譯成模塊以供動態(tài)加載。由于uclinux不支持模塊動態(tài)加載,而且嵌入式linux不能夠象桌面linux那樣靈活的使用insm
31、od/rmmod加載卸載設備驅動程序,因而這里只介紹將設備驅動程序靜態(tài)編譯進uclinux內核的方法。下面以uclinux為例,介紹在一個以模塊方式出現的驅動程序test.c基礎之上,將其編譯進內核的一系列步驟:(1) 改動test.c源帶代碼第一步,將原來的:#include#includechar kernel_version=uts_release;和"把設備驅動程序編譯進嵌入式linux內核"有關的編程小帖士:strong>session_encodeSession資料編碼。語法:booleansession_encode(void);返回值:布爾值內容說明本函數可將Session 資料編碼,編碼以ZEND引擎做哈稀編碼。本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農業(yè)產值與種植面積對比表
- 年度營銷計劃數據對比表
- 建筑行業(yè)勞務分包與施工管理協(xié)議
- 企業(yè)智能辦公系統(tǒng)開發(fā)合作協(xié)議
- 合作推廣市場營銷合作協(xié)議
- 課程表和活動安排表
- 日常辦公管理規(guī)章制度匯編
- 空調安裝工程總包合同
- 高中學生物理競賽準備故事征文
- 科學啟蒙故事征文
- 《教育強國建設規(guī)劃綱要(2024-2035年)》解讀與培訓
- 2024年03月中國工商銀行湖南分行2024年度春季校園招考筆試歷年參考題庫附帶答案詳解
- 員工離職面談記錄表范本
- 2025年青島市技師學院招考聘用48人高頻重點提升(共500題)附帶答案詳解
- 2024年08月澳門2024年中國銀行澳門分行校園招考筆試歷年參考題庫附帶答案詳解
- 《從外觀看豬病診治》課件
- 2024年度城市規(guī)劃與交通設計院深度合作框架協(xié)議3篇
- 李四光《看看我們的地球》原文閱讀
- GA/T 1740.2-2024旅游景區(qū)安全防范要求第2部分:湖泊型
- 2025屆高考數學專項復習:阿基米德三角形【六大題型】含答案
評論
0/150
提交評論