PowerPC平臺Linux的移植(二)
處理并編譯內(nèi)核源代碼Linux內(nèi)核的配置系統(tǒng)由三個部分組成,分別是:1. Makefile:分布在 Linux 內(nèi)核源代碼中的 Makefile,定義 Linux 內(nèi)核的編譯規(guī)則;2. 配置文件(config.in):給用戶提供配置選擇的功能;3. 配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基于字符界面、基于 Ncurses 圖形界面以及基于 Xwindows 圖形界面的用戶配置界面,各自對應于 Make config、Make menuconfig 和 make xconfig)。這些配置工具都是使用腳本語言,如 Tcl/TK、Perl 編寫的(也包含一些用 C 編寫的代碼)。本文并不是對配置系統(tǒng)本身進行分析,而是介紹如何使用配置系統(tǒng)。所以,除非是配置系統(tǒng)的維護者,一般的內(nèi)核開發(fā)者無須了解它們的原理,只需要知道如何編寫 Makefile 和配置文件就可以。應用補丁如果使用上述腳本,它會自動幫你下載內(nèi)核源碼,如果你覺得版本較低,可以自行下載。我這里下載的是2.6.22的內(nèi)核代碼,直接去http: //www.kernel.org下載的,同時下載的還有patch-2.6.22,雖然一開始用不上。順便說一句,其實默認下載的2.6.15.4版本已經(jīng)足夠了,沒有特殊情況沒有必要單獨再下載別的,新版本內(nèi)核很多特性都是用不上的。如果你下載的內(nèi)核版本有對應的補丁,就要通過補丁進行對內(nèi)核源代碼的修補操作。一個補丁就是一個文本文檔,這個文檔包含了在兩個不同版本的源代碼樹之間的變化。補丁是通過diff應用程序來創(chuàng)建的。我們使用patch程序來應用下載的patch。patch程序讀取一個diff(或者patch)文件,然后把文件中描述的變化內(nèi)容應用到代碼樹上。Linux內(nèi)核中的補丁是相對于保存內(nèi)核源代碼目錄的父目錄而生成的。這就意味著:patch文件中的文件路徑包含了它所基于的內(nèi)核源文件目錄的名字(或者像是”a/”和”b/”之類的其它名字)。由于這很可能和你本地機器上的內(nèi)核源代碼目錄的名字不匹配 (但是對于查看一個沒有標簽的補丁所基于的內(nèi)核版本是非常有用的)。你應該切換到你的內(nèi)核源代碼目錄,并且在打補丁的時候去掉patch中文件名字路徑的第一個分量(patch命令的-p1參數(shù)可以完成這個任務(wù))。具體過程是這樣的,比如把下載下來的patch壓縮包解壓到/patch目錄下,解壓后的文件名為:xxxx.patch,然后進入你內(nèi)核源文件的文件夾,將補丁拷貝到這里,首先運行命令patch -p1 –dry-run /xxxx/patch-xxxx這一步是測試應用patch,此命令不會對你的內(nèi)核源碼做任何更動,如果這一步?jīng)]有出現(xiàn)任何錯誤輸出的話,就執(zhí)行:patch -p1 /xxxx/patch-xxxx如果沒有錯誤提示,就表示補丁已經(jīng)打上了。修改文件好,此時的內(nèi)核源代碼,如果是用于臺式機的編譯,改動就已經(jīng)足夠了。但是我們是要編譯出能在ppc上運行的內(nèi)核,因此,還要繼續(xù)進行修改。修改串口代碼首先,在XUP板子上有一個串口終端,并且只有一個,這意味著很多流程,包括boot loader,boot process以及接下來的一些步驟都要和這個串口交互,如果采用默認的波特率9600,就有點慢了,因此,我們可以將其波特率修改得大一些。以 38400為例,硬件平臺的修改請在edk下進行,系統(tǒng)源代碼的修改,請找到arch/ppc/boot/common/ns16550.c,找到這一行:#define SERIAL_BAUD 9600將其修改成#define SERIAL_BAUD 38400即可。修改xparameters.h在生成bsp的時候會生成xparameters_.h文件,你需要修改源代碼目錄下arch/ppc/platforms/4xx/xparameters.h文件,讓它包括xparameters_.h這個文件。修改makefile接下來我們來關(guān)注一下Makefile,由于 Linux 內(nèi)核源代碼是按照樹形結(jié)構(gòu)組織的,所以 Makefile 也被分布在目錄樹中。Linux 內(nèi)核中的 Makefile 以及與 Makefile 直接相關(guān)的文件有:1. Makefile:頂層 Makefile,是整個內(nèi)核配置、編譯的總體控制文件。bother finally2. .config:內(nèi)核配置文件,包含由用戶選擇的配置選項,用來存放內(nèi)核配置后的結(jié)果(如 make config)。3. arch/*/Makefile:位于各種 CPU 體系目錄下的 Makefile,如 arch/arm/Makefile,是針對特定平臺的 Makefile。4. 各個子目錄下的 Makefile:比如 drivers/Makefile,負責所在子目錄下源代碼的管理。5. Rules.make:規(guī)則文件,被所有的 Makefile 使用。用戶通過 make config 配置后,產(chǎn)生了 .config。頂層 Makefile 讀入 .config 中的配置選擇。頂層 Makefile 有兩個主要的任務(wù):產(chǎn)生 vmlinux(未壓縮的內(nèi)核) 文件和內(nèi)核模塊(module)。為了達到此目的,頂層 Makefile 遞歸的進入到內(nèi)核的各個子目錄中,分別調(diào)用位于這些子目錄中的 Makefile。至于到底進入哪些子目錄,取決于內(nèi)核的配置。在頂層 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 體系結(jié)構(gòu)下的 Makefile,這個 Makefile 中包含了平臺相關(guān)的信息。有關(guān)Makefile的更多說明,請參見IBM文檔庫文章Linux內(nèi)核配置系統(tǒng)淺析。小知識:各種內(nèi)核格式的區(qū)別vmlinux是未壓縮的原始內(nèi)核,為ELF格式,常用于內(nèi)核調(diào)試;vmlinuz,或zImage or bzImage,是vmlinux經(jīng)過壓縮并包裝有g(shù)zip自解壓代碼的內(nèi)核,為BIN格式,常作為系統(tǒng)或目標板的引導內(nèi)核。位于各個子目錄下的 Makefile 同樣也根據(jù) .config 給出的配置信息,構(gòu)造出當前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。下面談?wù)劸唧w如何對Makefile進行修改。打開內(nèi)核源代碼目錄下的Makefile文件,找到以下兩行:ARCH ?= $(SUBARCH)CROSS_COMPILE ?=這是表示ARCH的值為SUBARCH的值,而CROSS_COMPILE的值為空。我們應該將其改為:ARCH := ppcCROSS_COMPILE = powerpc-405-linux-gnu-這樣表示硬件平臺是ppc,而交叉編譯工具是powerpc-405-linux-gnu-系列工具。小知識:ppc還是powerpc?細心的朋友可能發(fā)現(xiàn),arch/platforms目錄下既有ppc目錄又有powerpc目錄,這是怎么回事呢?由于IBM 成立 power.org 組織,便以 Power Architecture 來稱呼 PowerPC 處理器,因此,以往所慣用的PPC 現(xiàn)在都改名叫 PowerPC。也就是說, PowerPC 現(xiàn)在屬于是官方名稱了。而Linux kernel 由 2.6.15 開始,已經(jīng)把 arch/ppc/ 重新組織到 arch/powerpc/,不過在整個遷徙的工作完成之前,arch/ppc/ 仍會繼續(xù)存在,只不過 arch/ppc/ 將會停止發(fā)展,接下來的 Linux kernel for PowerPC 將會轉(zhuǎn)移到 arch/powerpc/ 的新目錄下繼續(xù)發(fā)展。仔細觀察兩個文件夾,會發(fā)現(xiàn)有些許不同,以往 PPC platform的分類 是被寫在 arch/ppc/platforms/*.c 裡,組織結(jié)構(gòu)不大良好,現(xiàn)在被重新組織在 arch/powerpc/platforms/ 目錄下,一個 platform 一個目錄,干凈多了:# ls arch/powerpc/platforms/4xx/ 85xx/ apus/ embedded6xx/ maple/ prep/82xx/ 86xx/ cell/ iseries/ pasemi/ pseries/83xx/ 8xx/ chrp/ Makefile powermac/當然,就目前來說,Makefile里面的arch值設(shè)置為ppc或者powerpc都無所謂,因為即使你選用了ppc,構(gòu)建系統(tǒng)的時候也會自動包含asm-powerpc中所必須的共享包含文件,因此沒有必要擔心這一點。內(nèi)核配置接下來進行內(nèi)核配置。筆者推薦使用”make menuconfig”命令,而不是一些文章中推薦的”make xconfig”,因為后者可能產(chǎn)生一些未知原因的編譯錯誤。menuconfig是一個文本模式、選單驅(qū)動的配置界面,而xconfig是基于 Tcl/Tk的X圖形配置界面。另外一個常用的是make oldconfig,如果只想在原來內(nèi)核配置的基礎(chǔ)上修改一些小地方,這個命令會省去不少麻煩,但我們這里是要大改,所以也不用這個。關(guān)于配置內(nèi)核的原理與過程,不熟悉的朋友可以參見這篇文章,這里就不詳細介紹了。順便提及的是,運行這個命令可能出現(xiàn)以下錯誤1 /usr/bin/ld: crt1.o: No such file: No such file or directory這個錯誤可以通過安裝libc6-dev解決2 /usr/bin/ld: cannot find -lncurses這個錯誤可以通過安裝libncurses5-dev解決3 checklist.o: file not recognized: File format not recognized解決方法是用”make mrproper”命令清除所有舊的Xwindow configuraTIon文件,至于為什么會有這個錯誤,我沒有深入研究,知道的朋友請指點一下在一開始配置時,建議先生成一個最小的,保證可運行的.config文件,以后再根據(jù)自己的需要添加一些特性,而且添加特性的時候一定小心,稍不注意就會讓你無法正常編譯,或者無法正常運行。另外需要注意的是,所有標有“new”標簽的選項都要遵從默認設(shè)置,不要修改它。下面這些選項是我所用的最小系統(tǒng)配置,如果你使用的內(nèi)核版本和我的差別很大,可能需要改動一些config選項,或者如果你使用這個配置出現(xiàn)問題,請在這里留言,我會盡力幫你分析。先將清單與大概解釋列出如下: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(這個根據(jù)你現(xiàn)有芯片來選)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其實上面的選項不是最小的,如果你在編譯的時候遇到某些問題,可以看看出問題的源代碼屬于哪個部分,只要能去掉就去掉。原則就是先搞定一個能跑的內(nèi)核,然后再想擴展的事情。選擇完成之后,將之前編譯的BSP拷貝到源代碼樹目錄中,覆蓋原有文件。轉(zhuǎn)載自:fcni_cn的百度空間
本文引用地址:http://m.butianyuan.cn/article/201710/365685.htm
評論