PowerPC平臺(tái)Linux的移植(二)
處理并編譯內(nèi)核源代碼Linux內(nèi)核的配置系統(tǒng)由三個(gè)部分組成,分別是:1. Makefile:分布在 Linux 內(nèi)核源代碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則;2. 配置文件(config.in):給用戶提供配置選擇的功能;3. 配置工具:包括配置命令解釋器(對(duì)配置腳本中使用的配置命令進(jìn)行解釋)和配置用戶界面(提供基于字符界面、基于 Ncurses 圖形界面以及基于 Xwindows 圖形界面的用戶配置界面,各自對(duì)應(yīng)于 Make config、Make menuconfig 和 make xconfig)。這些配置工具都是使用腳本語(yǔ)言,如 Tcl/TK、Perl 編寫(xiě)的(也包含一些用 C 編寫(xiě)的代碼)。本文并不是對(duì)配置系統(tǒng)本身進(jìn)行分析,而是介紹如何使用配置系統(tǒng)。所以,除非是配置系統(tǒng)的維護(hù)者,一般的內(nèi)核開(kāi)發(fā)者無(wú)須了解它們的原理,只需要知道如何編寫(xiě) Makefile 和配置文件就可以。應(yīng)用補(bǔ)丁如果使用上述腳本,它會(huì)自動(dòng)幫你下載內(nèi)核源碼,如果你覺(jué)得版本較低,可以自行下載。我這里下載的是2.6.22的內(nèi)核代碼,直接去http: //www.kernel.org下載的,同時(shí)下載的還有patch-2.6.22,雖然一開(kāi)始用不上。順便說(shuō)一句,其實(shí)默認(rèn)下載的2.6.15.4版本已經(jīng)足夠了,沒(méi)有特殊情況沒(méi)有必要單獨(dú)再下載別的,新版本內(nèi)核很多特性都是用不上的。如果你下載的內(nèi)核版本有對(duì)應(yīng)的補(bǔ)丁,就要通過(guò)補(bǔ)丁進(jìn)行對(duì)內(nèi)核源代碼的修補(bǔ)操作。一個(gè)補(bǔ)丁就是一個(gè)文本文檔,這個(gè)文檔包含了在兩個(gè)不同版本的源代碼樹(shù)之間的變化。補(bǔ)丁是通過(guò)diff應(yīng)用程序來(lái)創(chuàng)建的。我們使用patch程序來(lái)應(yīng)用下載的patch。patch程序讀取一個(gè)diff(或者patch)文件,然后把文件中描述的變化內(nèi)容應(yīng)用到代碼樹(shù)上。Linux內(nèi)核中的補(bǔ)丁是相對(duì)于保存內(nèi)核源代碼目錄的父目錄而生成的。這就意味著:patch文件中的文件路徑包含了它所基于的內(nèi)核源文件目錄的名字(或者像是”a/”和”b/”之類的其它名字)。由于這很可能和你本地機(jī)器上的內(nèi)核源代碼目錄的名字不匹配 (但是對(duì)于查看一個(gè)沒(méi)有標(biāo)簽的補(bǔ)丁所基于的內(nèi)核版本是非常有用的)。你應(yīng)該切換到你的內(nèi)核源代碼目錄,并且在打補(bǔ)丁的時(shí)候去掉patch中文件名字路徑的第一個(gè)分量(patch命令的-p1參數(shù)可以完成這個(gè)任務(wù))。具體過(guò)程是這樣的,比如把下載下來(lái)的patch壓縮包解壓到/patch目錄下,解壓后的文件名為:xxxx.patch,然后進(jìn)入你內(nèi)核源文件的文件夾,將補(bǔ)丁拷貝到這里,首先運(yùn)行命令patch -p1 –dry-run /xxxx/patch-xxxx這一步是測(cè)試應(yīng)用patch,此命令不會(huì)對(duì)你的內(nèi)核源碼做任何更動(dòng),如果這一步?jīng)]有出現(xiàn)任何錯(cuò)誤輸出的話,就執(zhí)行:patch -p1 /xxxx/patch-xxxx如果沒(méi)有錯(cuò)誤提示,就表示補(bǔ)丁已經(jīng)打上了。修改文件好,此時(shí)的內(nèi)核源代碼,如果是用于臺(tái)式機(jī)的編譯,改動(dòng)就已經(jīng)足夠了。但是我們是要編譯出能在ppc上運(yùn)行的內(nèi)核,因此,還要繼續(xù)進(jìn)行修改。修改串口代碼首先,在XUP板子上有一個(gè)串口終端,并且只有一個(gè),這意味著很多流程,包括boot loader,boot process以及接下來(lái)的一些步驟都要和這個(gè)串口交互,如果采用默認(rèn)的波特率9600,就有點(diǎn)慢了,因此,我們可以將其波特率修改得大一些。以 38400為例,硬件平臺(tái)的修改請(qǐng)?jiān)趀dk下進(jìn)行,系統(tǒng)源代碼的修改,請(qǐng)找到arch/ppc/boot/common/ns16550.c,找到這一行:#define SERIAL_BAUD 9600將其修改成#define SERIAL_BAUD 38400即可。修改xparameters.h在生成bsp的時(shí)候會(huì)生成xparameters_.h文件,你需要修改源代碼目錄下arch/ppc/platforms/4xx/xparameters.h文件,讓它包括xparameters_.h這個(gè)文件。修改makefile接下來(lái)我們來(lái)關(guān)注一下Makefile,由于 Linux 內(nèi)核源代碼是按照樹(shù)形結(jié)構(gòu)組織的,所以 Makefile 也被分布在目錄樹(shù)中。Linux 內(nèi)核中的 Makefile 以及與 Makefile 直接相關(guān)的文件有:1. Makefile:頂層 Makefile,是整個(gè)內(nèi)核配置、編譯的總體控制文件。bother finally2. .config:內(nèi)核配置文件,包含由用戶選擇的配置選項(xiàng),用來(lái)存放內(nèi)核配置后的結(jié)果(如 make config)。3. arch/*/Makefile:位于各種 CPU 體系目錄下的 Makefile,如 arch/arm/Makefile,是針對(duì)特定平臺(tái)的 Makefile。4. 各個(gè)子目錄下的 Makefile:比如 drivers/Makefile,負(fù)責(zé)所在子目錄下源代碼的管理。5. Rules.make:規(guī)則文件,被所有的 Makefile 使用。用戶通過(guò) make config 配置后,產(chǎn)生了 .config。頂層 Makefile 讀入 .config 中的配置選擇。頂層 Makefile 有兩個(gè)主要的任務(wù):產(chǎn)生 vmlinux(未壓縮的內(nèi)核) 文件和內(nèi)核模塊(module)。為了達(dá)到此目的,頂層 Makefile 遞歸的進(jìn)入到內(nèi)核的各個(gè)子目錄中,分別調(diào)用位于這些子目錄中的 Makefile。至于到底進(jìn)入哪些子目錄,取決于內(nèi)核的配置。在頂層 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 體系結(jié)構(gòu)下的 Makefile,這個(gè) Makefile 中包含了平臺(tái)相關(guān)的信息。有關(guān)Makefile的更多說(shuō)明,請(qǐng)參見(jiàn)IBM文檔庫(kù)文章Linux內(nèi)核配置系統(tǒng)淺析。小知識(shí):各種內(nèi)核格式的區(qū)別vmlinux是未壓縮的原始內(nèi)核,為ELF格式,常用于內(nèi)核調(diào)試;vmlinuz,或zImage or bzImage,是vmlinux經(jīng)過(guò)壓縮并包裝有g(shù)zip自解壓代碼的內(nèi)核,為BIN格式,常作為系統(tǒng)或目標(biāo)板的引導(dǎo)內(nèi)核。位于各個(gè)子目錄下的 Makefile 同樣也根據(jù) .config 給出的配置信息,構(gòu)造出當(dāng)前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。下面談?wù)劸唧w如何對(duì)Makefile進(jìn)行修改。打開(kāi)內(nèi)核源代碼目錄下的Makefile文件,找到以下兩行:ARCH ?= $(SUBARCH)CROSS_COMPILE ?=這是表示ARCH的值為SUBARCH的值,而CROSS_COMPILE的值為空。我們應(yīng)該將其改為:ARCH := ppcCROSS_COMPILE = powerpc-405-linux-gnu-這樣表示硬件平臺(tái)是ppc,而交叉編譯工具是powerpc-405-linux-gnu-系列工具。小知識(shí):ppc還是powerpc?細(xì)心的朋友可能發(fā)現(xiàn),arch/platforms目錄下既有ppc目錄又有powerpc目錄,這是怎么回事呢?由于IBM 成立 power.org 組織,便以 Power Architecture 來(lái)稱呼 PowerPC 處理器,因此,以往所慣用的PPC 現(xiàn)在都改名叫 PowerPC。也就是說(shuō), PowerPC 現(xiàn)在屬于是官方名稱了。而Linux kernel 由 2.6.15 開(kāi)始,已經(jīng)把 arch/ppc/ 重新組織到 arch/powerpc/,不過(guò)在整個(gè)遷徙的工作完成之前,arch/ppc/ 仍會(huì)繼續(xù)存在,只不過(guò) arch/ppc/ 將會(huì)停止發(fā)展,接下來(lái)的 Linux kernel for PowerPC 將會(huì)轉(zhuǎn)移到 arch/powerpc/ 的新目錄下繼續(xù)發(fā)展。仔細(xì)觀察兩個(gè)文件夾,會(huì)發(fā)現(xiàn)有些許不同,以往 PPC platform的分類 是被寫(xiě)在 arch/ppc/platforms/*.c 裡,組織結(jié)構(gòu)不大良好,現(xiàn)在被重新組織在 arch/powerpc/platforms/ 目錄下,一個(gè) platform 一個(gè)目錄,干凈多了:# ls arch/powerpc/platforms/4xx/ 85xx/ apus/ embedded6xx/ maple/ prep/82xx/ 86xx/ cell/ iseries/ pasemi/ pseries/83xx/ 8xx/ chrp/ Makefile powermac/當(dāng)然,就目前來(lái)說(shuō),Makefile里面的arch值設(shè)置為ppc或者powerpc都無(wú)所謂,因?yàn)榧词鼓氵x用了ppc,構(gòu)建系統(tǒng)的時(shí)候也會(huì)自動(dòng)包含asm-powerpc中所必須的共享包含文件,因此沒(méi)有必要擔(dān)心這一點(diǎn)。內(nèi)核配置接下來(lái)進(jìn)行內(nèi)核配置。筆者推薦使用”make menuconfig”命令,而不是一些文章中推薦的”make xconfig”,因?yàn)楹笳呖赡墚a(chǎn)生一些未知原因的編譯錯(cuò)誤。menuconfig是一個(gè)文本模式、選單驅(qū)動(dòng)的配置界面,而xconfig是基于 Tcl/Tk的X圖形配置界面。另外一個(gè)常用的是make oldconfig,如果只想在原來(lái)內(nèi)核配置的基礎(chǔ)上修改一些小地方,這個(gè)命令會(huì)省去不少麻煩,但我們這里是要大改,所以也不用這個(gè)。關(guān)于配置內(nèi)核的原理與過(guò)程,不熟悉的朋友可以參見(jiàn)這篇文章,這里就不詳細(xì)介紹了。順便提及的是,運(yùn)行這個(gè)命令可能出現(xiàn)以下錯(cuò)誤1 /usr/bin/ld: crt1.o: No such file: No such file or directory這個(gè)錯(cuò)誤可以通過(guò)安裝libc6-dev解決2 /usr/bin/ld: cannot find -lncurses這個(gè)錯(cuò)誤可以通過(guò)安裝libncurses5-dev解決3 checklist.o: file not recognized: File format not recognized解決方法是用”make mrproper”命令清除所有舊的Xwindow configuraTIon文件,至于為什么會(huì)有這個(gè)錯(cuò)誤,我沒(méi)有深入研究,知道的朋友請(qǐng)指點(diǎn)一下在一開(kāi)始配置時(shí),建議先生成一個(gè)最小的,保證可運(yùn)行的.config文件,以后再根據(jù)自己的需要添加一些特性,而且添加特性的時(shí)候一定小心,稍不注意就會(huì)讓你無(wú)法正常編譯,或者無(wú)法正常運(yùn)行。另外需要注意的是,所有標(biāo)有“new”標(biāo)簽的選項(xiàng)都要遵從默認(rèn)設(shè)置,不要修改它。下面這些選項(xiàng)是我所用的最小系統(tǒng)配置,如果你使用的內(nèi)核版本和我的差別很大,可能需要改動(dòng)一些config選項(xiàng),或者如果你使用這個(gè)配置出現(xiàn)問(wèn)題,請(qǐng)?jiān)谶@里留言,我會(huì)盡力幫你分析。先將清單與大概解釋列出如下:General Setup* Prompt for development and/or incomplete drivers(XUP)Local version - append to kernel release* IniTIal RAM disk (initrd) support* System V IPC* Configure standard kernel features —>* Sysctl syscall support ?Processor* 40x Processor Type* Xilinx-ML300 Machine Type* Math emulaTIon* TTYS0 device and default consolePlatform opTIons* High memory support* Default bootloader kernel arguments~“console=ttyS0,38400 root=/dev/xsysace/disc0/part3 rw”Networking* Unix domain sockets* TCP/IP networking* IP: multicasting* IP: kernel level autoconfiguration* IP: DHCP support* IP: TCP syncookie support (disabled per default)Device drivers—Memory Technology Devices (MTD)* Memory Technology Device (MTD) Support* MTD partitioning support* RedBoot partition table parsing* Direct char device access to MTD devices* Caching block device access to MTD devices* RAM/ROM flash chip device drivers* Detect flash chips by Common Flash Interface (CFI) probe* Suport for AMD/Fujitsu flash chips(這個(gè)根據(jù)你現(xiàn)有芯片來(lái)選)Device drivers—Block Devices* Loopback device support* Network block device support* RAM disk support(4096) Default RAM disk size* Xilinx on-chip System ACEDevice drivers—Network Device Support* Network device support* Ethernet(10 or 100Mbit)* PowerPC 4xx on-chip ethernet?Device drivers—Character devices— Serial drivers* 8250/16550 and compatible serial support* Xilinx uartlite serial port support* Support for console on Xilinx uartlite serial portFile systems* Second extended fs support* Kernel automounter version 4 support (also supports v3)* Pseudo filesystems —>* /proc/kcore support* Virtual memory file system support (former shm fs)* Miscellaneous filesystems —>* Journaling Flash File System v2 (JFFS2) support(0) JFFS2 debugging verbosity (0=quiet, 2=noisy)* Network file systems —>* NFS file system support* Provide NFSv3 client support* Root file system on NFS* NFS server support* Provide NFSv3 server support* SMB file system support (to mount Windows shares etc.)* Native Language Support —>* Default NLS Option: “cp437″Kernel hacking* Kernel debugging* Compile the kernel with debug info* Include BDI-2000 user context switcher其實(shí)上面的選項(xiàng)不是最小的,如果你在編譯的時(shí)候遇到某些問(wèn)題,可以看看出問(wèn)題的源代碼屬于哪個(gè)部分,只要能去掉就去掉。原則就是先搞定一個(gè)能跑的內(nèi)核,然后再想擴(kuò)展的事情。選擇完成之后,將之前編譯的BSP拷貝到源代碼樹(shù)目錄中,覆蓋原有文件。轉(zhuǎn)載自:fcni_cn的百度空間
本文引用地址:http://www.ex-cimer.com/article/201710/365685.htm
評(píng)論