打印

PowerPC平台Linux的移植(二)

[复制链接]
1658|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星之火红|  楼主 | 2012-10-15 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
处理并编译内核源代码
Linux内核的配置系统由三个部分组成,分别是:
1. Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;
2. 配置文件(config.in):给用户提供配置选择的功能;
3. 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。

这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。

相关帖子

沙发
星星之火红|  楼主 | 2012-10-15 13:42 | 只看该作者
应用补丁

如果使用上述脚本,它会自动帮你下载内核源码,如果你觉得版本较低,可以自行下载。我这里下载的是2.6.22的内核代码,直接去http: //www.kernel.org下载的,同时下载的还有patch-2.6.22,虽然一开始用不上。顺便说一句,其实默认下载的2.6.15.4版本已经足够了,没有特殊情况没有必要单独再下载别的,新版本内核很多特性都是用不上的。

如果你下载的内核版本有对应的补丁,就要通过补丁进行对内核源代码的修补操作。一个补丁就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。补丁是通过diff应用程序来创建的。我们使用patch程序来应用下载的patch。patch程序读取一个diff(或者patch)文件,然后把文件中描述的变化内容应用到代码树上。Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。这就意味着:patch文件中的文件路径包含了它所基于的内核源文件目录的名字(或者像是”a/”和”b/”之类的其它名字)。由于这很可能和你本地机器上的内核源代码目录的名字不匹配 (但是对于查看一个没有标签的补丁所基于的内核版本是非常有用的)。你应该切换到你的内核源代码目录,并且在打补丁的时候去掉patch中文件名字路径的第一个分量(patch命令的-p1参数可以完成这个任务)。

具体过程是这样的,比如把下载下来的patch压缩包解压到/patch目录下,解压后的文件名为:xxxx.patch,然后进入你内核源文件的文件夹,将补丁拷贝到这里,首先运行命令
patch -p1 –dry-run < /xxxx/patch-xxxx
这一步是测试应用patch,此命令不会对你的内核源码做任何更动,如果这一步没有出现任何错误输出的话,就执行:
patch -p1 < /xxxx/patch-xxxx
如果没有错误提示,就表示补丁已经打上了。

使用特权

评论回复
板凳
星星之火红|  楼主 | 2012-10-15 13:42 | 只看该作者
修改文件

好,此时的内核源代码,如果是用于台式机的编译,改动就已经足够了。但是我们是要编译出能在ppc上运行的内核,因此,还要继续进行修改。

修改串口代码

首先,在XUP板子上有一个串口终端,并且只有一个,这意味着很多流程,包括boot loader,boot process以及接下来的一些步骤都要和这个串**互,如果采用默认的波特率9600,就有点慢了,因此,我们可以将其波特率修改得大一些。以 38400为例,硬件平台的修改请在edk下进行,系统源代码的修改,请找到arch/ppc/boot/common/ns16550.c,找到这一行:
#define SERIAL_BAUD 9600
将其修改成
#define SERIAL_BAUD 38400
即可。

使用特权

评论回复
地板
星星之火红|  楼主 | 2012-10-15 13:42 | 只看该作者
修改xparameters.h

在生成bsp的时候会生成xparameters_.h文件,你需要修改源代码目录下arch/ppc/platforms/4xx/xparameters.h
文件,让它包括xparameters_.h这个文件。

修改makefile

接下来我们来关注一下Makefile,由于 Linux 内核源代码是按照树形结构组织的,所以 Makefile 也被分布在目录树中。Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有:
1. Makefile:顶层 Makefile,是整个内核配置、编译的总体控制文件。bother finally
2. .config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。
3. arch/*/Makefile:位于各种 CPU 体系目录下的 Makefile,如 arch/arm/Makefile,是针对特定平台的 Makefile。
4. 各个子目录下的 Makefile:比如 drivers/Makefile,负责所在子目录下源代码的管理。
5. Rules.make:规则文件,被所有的 Makefile 使用。

用户通过 make config 配置后,产生了 .config。顶层 Makefile 读入 .config 中的配置选择。顶层 Makefile 有两个主要的任务:产生 vmlinux(未压缩的内核) 文件和内核模块(module)。为了达到此目的,顶层 Makefile 递归的进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录,取决于内核的配置。在顶层 Makefile 中,有一句:include arch/$(ARCH)/Makefile,包含了特定 CPU 体系结构下的 Makefile,这个 Makefile 中包含了平台相关的信息。有关Makefile的更多说明,请参见IBM文档库** Linux内核配置系统浅析。

使用特权

评论回复
5
星星之火红|  楼主 | 2012-10-15 13:43 | 只看该作者
小知识:各种内核格式的区别
vmlinux是未压缩的原始内核,为ELF格式,常用于内核调试;
vmlinuz,或zImage or bzImage,是vmlinux经过压缩并包装有gzip自解压代码的内核,为BIN格式,常作为系统或目标板的引导内核。
位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有 include $(TOPDIR)/Rules.make。
下面谈谈具体如何对Makefile进行修改。打开内核源代码目录下的Makefile文件,找到以下两行:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
这是表示ARCH的值为SUBARCH的值,而CROSS_COMPILE的值为空。我们应该将其改为:
ARCH := ppc
CROSS_COMPILE = powerpc-405-linux-gnu-
这样表示硬件平台是ppc,而交叉编译工具是powerpc-405-linux-gnu-系列工具。

使用特权

评论回复
6
星星之火红|  楼主 | 2012-10-15 13:43 | 只看该作者
小知识:ppc还是powerpc?
细心的朋友可能发现,arch/platforms目录下既有ppc目录又有powerpc目录,这是怎么回事呢?由于IBM 成立 power.org 组织,便以 Power Architecture 来称呼 PowerPC 处理器,因此,以往所惯用的PPC 现在都改名叫 PowerPC。也就是说, PowerPC 现在属于是官方名称了。而Linux kernel 由 2.6.15 开始,已经把 arch/ppc/ 重新组织到 arch/powerpc/,不过在整个迁徙的工作完成之前,arch/ppc/ 仍会继续存在,只不过 arch/ppc/ 将会停止发展,接下来的 Linux kernel for PowerPC 将会转移到 arch/powerpc/ 的新目录下继续发展。

仔细观察两个文件夹,会发现有些许不同,以往 PPC platform的分类 是被写在 arch/ppc/platforms/*.c 裡,组织结构不大良好,现在被重新组织在 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值设置为ppc或者powerpc都无所谓,因为即使你选用了ppc,构建系统的时候也会自动包含asm-powerpc中所必须的共享包含文件,因此没有必要担心这一点。

使用特权

评论回复
7
星星之火红|  楼主 | 2012-10-15 13:43 | 只看该作者
内核配置

接下来进行内核配置。笔者推荐使用”make menuconfig”命令,而不是一些**中推荐的”make xconfig”,因为后者可能产生一些未知原因的编译错误。menuconfig是一个文本模式、选单驱动的配置界面,而xconfig是基于 Tcl/Tk的X图形配置界面。另外一个常用的是make oldconfig,如果只想在原来内核配置的基础上修改一些小地方,这个命令会省去不少麻烦,但我们这里是要大改,所以也不用这个。关于配置内核的原理与过程,不熟悉的朋友可以参见这篇** ,这里就不详细介绍了。顺便提及的是,运行这个命令可能出现以下错误
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文件,以后再根据自己的需要添加一些特性,而且添加特性的时候一定小心,稍不注意就会让你无**常编译,或者无**常运行。另外需要注意的是,所有标有“new”标签的选项都要遵从默认设置,不要修改它。下面这些选项是我所用的最小系统配置,如果你使用的内核版本和我的差别很大,可能需要改动一些config选项,或者如果你使用这个配置出现问题,请在这里留言,我会尽力帮你分析。先将清单与大概解释列出如下:

使用特权

评论回复
8
星星之火红|  楼主 | 2012-10-15 13:43 | 只看该作者
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 console
Platform 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(这个根据你现有芯片来选)
Device drivers—Block Devices
* Loopback device support
* Network block device support
* RAM disk support
(4096) Default RAM disk size
* Xilinx on-chip System ACE
Device 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 port
File 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

其实上面的选项不是最小的,如果你在编译的时候遇到某些问题,可以看看出问题的源代码属于哪个部分,只要能去掉就去掉。原则就是先搞定一个能跑的内核,然后再想扩展的事情。选择完成之后,将之前编译的BSP拷贝到源代码树目录中,覆盖原有文件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

1782

帖子

22

粉丝