<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=72 </link><title>powerpc&amp;nbsp;交叉编译linux内核</title><author>page</author><pubDate>2009-11-26 21:13:11</pubDate><description><![CDATA[<p><font size="3">Linux内核的配置系统由三个部分组成，分别是：</font></p>
<p><font size="3">1. Makefile：分布在 Linux 内核源代码中的 Makefile，定义 Linux 内核的编译规则；<br />
2. 配置文件（config.in）：给用户提供配置选择的功能；<br />
3. 配置工具：包括配置命令解释器（对配置脚本中使用的配置命令进行解释）和配置用户界面（提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面，各自对应于 Make config、Make menuconfig 和 make xconfig）。</font></p>
<p><font size="3">这些配置工具都是使用脚本语言，如 Tcl/TK、Perl 编写的（也包含一些用 C 编写的代码）。本文并不是对配置系统本身进行分析，而是介绍如何使用配置系统。所以，除非是配置系统的维护者，一般的内核开发者无须了解它们的原理，只需 要知道如何编写 Makefile 和配置文件就可以。</font></p>
<h2><font size="3">应用补丁</font></h2>
<p><font size="3">如果使用上述脚本，它会自动帮你下载内核源码，如果你觉得版本较低，可以自行下载。我这里下载的是2.6.22的内核代码，直接去http: //www.kernel.org下载的，同时下载的还有patch-2.6.22,虽然一开始用不上。顺便说一句，其实默认下载的2.6.15.4版本 已经足够了，没有特殊情况没有必要单独再下载别的，新版本内核很多特性都是用不上的。</font></p>
<p><font size="3">如果你下载的内核版本有对应的补丁，就要通过补丁进行对内核源代码的修补操作。一个补丁就是一个文本文档，这个文档包含了在两个不同版本的源代码树 之间的变化。补丁是通过diff应用程序来创建的。我们使用patch程序来应用下载的patch。patch程序读取一个diff(或者patch)文 件，然后把文件中描述的变化内容应用到代码树上。Linux内核中的补丁是相对于保存内核源代码目录的父目录而生成的。这就意味着：patch文件中的文 件路径包含了它所基于的内核源文件目录的名字(或者像是&rdquo;a/&rdquo;和&rdquo;b/&rdquo;之类的其它名字)。由于这很可能和你本地机器上的内核源代码目录的名字不匹配 (但是对于查看一个没有标签的补丁所基于的内核版本是非常有用的)。你应该切换到你的内核源代码目录，并且在打补丁的时候去掉patch中文件名字路径的 第一个分量(patch命令的-p1参数可以完成这个任务)。</font></p>
<p><font size="3">具体过程是这样的，比如把下载下来的patch压缩包解压到/patch目录下，解压后的文件名为：xxxx.patch，然后进入你内核源文件的文件夹，将补丁拷贝到这里，首先运行命令</font></p>
<blockquote>
<p><font size="3">patch -p1 &ndash;dry-run &lt; /xxxx/patch-xxxx</font></p>
</blockquote>
<p><font size="3">这一步是测试应用patch，此命令不会对你的内核源码做任何更动，如果这一步没有出现任何错误输出的话，就执行：</font></p>
<blockquote>
<p><font size="3">patch -p1 &lt; /xxxx/patch-xxxx</font></p>
</blockquote>
<p><font size="3">如果没有错误提示，就表示补丁已经打上了。</font></p>
<h2><font size="3">修改文件</font></h2>
<p><font size="3">好，此时的内核源代码，如果是用于台式机的编译，改动就已经足够了。但是我们是要编译出能在ppc上运行的内核，因此，还要继续进行修改。</font></p>
<h3><font size="3">修改串口代码</font></h3>
<p><font size="3">首先，在XUP板子上有一个串口终端，并且只有一个，这意味着很多流程，包括boot loader，boot process以及接下来的一些步骤都要和这个串口交互，如果采用默认的波特率9600,就有点慢了，因此，我们可以将其波特率修改得大一些。以 38400为例，硬件平台的修改请在edk下进行，系统源代码的修改，请找到arch/ppc/boot/common/ns16550.c，找到这一 行：</font></p>
<blockquote>
<p><font size="3">#define SERIAL_BAUD 9600</font></p>
</blockquote>
<p><font size="3">将其修改成</font></p>
<blockquote>
<p><font size="3">#define SERIAL_BAUD 38400</font></p>
</blockquote>
<p><font size="3">即可。</font></p>
<h2><font size="3">修改xparameters.h</font></h2>
<p><font size="3">在生成bsp的时候会生成xparameters_<board></board>.h文件，你需要修改源代码目录下arch/ppc/platforms/4xx/xparameters.h<br />
文件，让它包括xparameters_<board></board>.h这个文件。</font></p>
<h2><font size="3">修改makefile</font></h2>
<p><font size="3">接下来我们来关注一下Makefile，由于 Linux 内核源代码是按照树形结构组织的，所以 Makefile 也被分布在目录树中。Linux 内核中的 Makefile 以及与 Makefile 直接相关的文件有：</font></p>
<p><font size="3">1. Makefile：顶层 Makefile，是整个内核配置、编译的总体控制文件。bother finally<br />
2. .config：内核配置文件，包含由用户选择的配置选项，用来存放内核配置后的结果（如 make config）。<br />
3. arch/*/Makefile：位于各种 CPU 体系目录下的 Makefile，如 arch/arm/Makefile，是针对特定平台的 Makefile。<br />
4. 各个子目录下的 Makefile：比如 drivers/Makefile，负责所在子目录下源代码的管理。<br />
5. Rules.make：规则文件，被所有的 Makefile 使用。</font></p>
<p><font size="3">用户通过 make config 配置后，产生了 .config。顶层 Makefile 读入 .config 中的配置选择。顶层 Makefile 有两个主要的任务：产生 vmlinux（未压缩的内核） 文件和内核模块（module）。为了达到此目的，顶层 Makefile 递归的进入到内核的各个子目录中，分别调用位于这些子目录中的 Makefile。至于到底进入哪些子目录，取决于内核的配置。在顶层 Makefile 中，有一句：include arch/$(ARCH)/Makefile，包含了特定 CPU 体系结构下的 Makefile，这个 Makefile 中包含了平台相关的信息。有关Makefile的更多说明，请参见IBM文档库文章<a href="http://www.ibm.com/developerworks/cn/linux/kernel/l-kerconf/index.html"><strong><font color="#959eaa"> Linux内核配置系统浅析</font></strong></a>。</font></p>
<blockquote>
<p><font size="3">小知识：各种内核格式的区别</font></p>
<p><font size="3">vmlinux是未压缩的原始内核，为ELF格式，常用于内核调试；<br />
vmlinuz，或zImage or bzImage，是vmlinux经过压缩并包装有gzip自解压代码的内核，为BIN格式，常作为系统或目标板的引导内核。</font></p>
</blockquote>
<p><font size="3">位于各个子目录下的 Makefile 同样也根据 .config 给出的配置信息，构造出当前配置下需要的源文件列表，并在文件的最后有 include $(TOPDIR)/Rules.make。</font></p>
<p><font size="3">下面谈谈具体如何对Makefile进行修改。打开内核源代码目录下的Makefile文件，找到以下两行：</font></p>
<blockquote>
<p><font size="3">ARCH ?= $(SUBARCH)<br />
CROSS_COMPILE ?=</font></p>
</blockquote>
<p><font size="3">这是表示ARCH的值为SUBARCH的值，而CROSS_COMPILE的值为空。我们应该将其改为：</font></p>
<blockquote>
<p><font size="3">ARCH := ppc<br />
CROSS_COMPILE = powerpc-405-linux-gnu-</font></p>
</blockquote>
<p><font size="3">这样表示硬件平台是ppc，而交叉编译工具是powerpc-405-linux-gnu-系列工具。</font></p>
<blockquote>
<p><font size="3">小知识：ppc还是powerpc？</font></p>
<p><font size="3">细心的朋友可能发现，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/ 的新目录下继续发展。</font></p>
<p><font size="3">仔细观察两个文件夹，会发现有些许不同，以往 PPC platform的分类 是被写在 arch/ppc/platforms/*.c 裡，组织结构不大良好，现在被重新组织在 arch/powerpc/platforms/ 目录下，一个 platform 一个目录，干净多了：</font></p>
<p><font size="3"># ls arch/powerpc/platforms/<br />
4xx/ 85xx/ apus/ embedded6xx/ maple/ prep/<br />
82xx/ 86xx/ cell/ iseries/ pasemi/ pseries/<br />
83xx/ 8xx/ chrp/ Makefile powermac/</font></p>
<p><font size="3">当然，就目前来说，Makefile里面的arch值设置为ppc或者powerpc都无所谓，因为即使你选用了ppc，构建系统的时候也会自动包含asm-powerpc中所必须的共享包含文件，因此没有必要担心这一点。</font></p>
</blockquote>
<h2><font size="3">内核配置</font></h2>
<p><font size="3">接下来进行内核配置。笔者推荐使用&rdquo;make menuconfig&rdquo;命令，而不是一些文章中推荐的&rdquo;make xconfig&rdquo;，因为后者可能产生一些未知原因的编译错误。menuconfig是一个文本模式、选单驱动的配置界面，而xconfig是基于 Tcl/Tk的X图形配置界面。另外一个常用的是make oldconfig，如果只想在原来内核配置的基础上修改一些小地方，这个命令会省去不少麻烦，但我们这里是要大改，所以也不用这个。关于配置内核的原理 与过程，不熟悉的朋友可以参见<a href="http://www.forwind.cn/2007/04/27/how-to-compile-kernel/"><strong><font color="#959eaa">这篇文章 </font></strong></a>，这里就不详细介绍了。顺便提及的是，运行这个命令可能出现以下错误</font></p>
<p><font size="3">1 /usr/bin/ld: crt1.o: No such file: No such file or directory</font></p>
<p><font size="3">这个错误可以通过安装libc6-dev解决</font></p>
<p><font size="3">2 /usr/bin/ld: cannot find -lncurses</font></p>
<p><font size="3">这个错误可以通过安装libncurses5-dev解决</font></p>
<p><font size="3">3 checklist.o: file not recognized: File format not recognized</font></p>
<p><font size="3">解决方法是用&rdquo;make mrproper&rdquo;命令清除所有旧的Xwindow configuration文件，至于为什么会有这个错误，我没有深入研究，知道的朋友请指点一下 </font></p>
<p><font size="3">在一开始配置时，建议先生成一个最小的，保证可运行的.config文件，以后再根据自己的需要添加一些特性，而且添加特性的时候一定小心，稍不注 意就会让你无法正常编译，或者无法正常运行。另外需要注意的是，所有标有&ldquo;new&rdquo;标签的选项都要遵从默认设置，不要修改它。下面这些选项是我所用的最小 系统配置，如果你使用的内核版本和我的差别很大，可能需要改动一些config选项，或者如果你使用这个配置出现问题，请在这里留言，我会尽力帮你分析。 先将清单与大概解释列出如下：</font></p>
<blockquote>
<p><font size="3">General Setup<br />
* Prompt for development and/or incomplete drivers<br />
（XUP)Local version - append to kernel release<br />
* Initial RAM disk (initrd) support<br />
* System V IPC<br />
* Configure standard kernel features &mdash;&gt;<br />
* Sysctl syscall support ？</font></p>
<p><font size="3">Processor<br />
* 40x Processor Type<br />
* Xilinx-ML300 Machine Type<br />
* Math emulation<br />
* <uart0></uart0>TTYS0 device and default console</font></p>
<p><font size="3">Platform options<br />
* High memory support<br />
* Default bootloader kernel arguments~<br />
&ldquo;console=ttyS0,38400 root=/dev/xsysace/disc0/part3 rw&rdquo;</font></p>
<p><font size="3">Networking<br />
* Unix domain sockets<br />
* TCP/IP networking<br />
* IP: multicasting<br />
* IP: kernel level autoconfiguration<br />
* IP: DHCP support<br />
* IP: TCP syncookie support (disabled per default)</font></p>
<p><font size="3">Device drivers&mdash;Memory Technology Devices (MTD)<br />
* Memory Technology Device (MTD) Support<br />
* MTD partitioning support<br />
* RedBoot partition table parsing<br />
* Direct char device access to MTD devices<br />
* Caching block device access to MTD devices<br />
* RAM/ROM flash chip device drivers<br />
* Detect flash chips by Common Flash Interface (CFI) probe<br />
* Suport for AMD/Fujitsu flash chips（这个根据你现有芯片来选）</font></p>
<p><font size="3">Device drivers&mdash;Block Devices<br />
* Loopback device support<br />
* Network block device support<br />
* RAM disk support<br />
(4096) Default RAM disk size<br />
* Xilinx on-chip System ACE</font></p>
<p><font size="3">Device drivers&mdash;Network Device Support<br />
* Network device support<br />
* Ethernet(10 or 100Mbit)<br />
* PowerPC 4xx on-chip ethernet？</font></p>
<p><font size="3">Device drivers&mdash;Character devices&mdash; Serial drivers<br />
* 8250/16550 and compatible serial support<br />
* Xilinx uartlite serial port support<br />
* Support for console on Xilinx uartlite serial port</font></p>
<p><font size="3">File systems<br />
* Second extended fs support<br />
* Kernel automounter version 4 support (also supports v3)<br />
* Pseudo filesystems &mdash;&gt;<br />
* /proc/kcore support<br />
* Virtual memory file system support (former shm fs)<br />
* Miscellaneous filesystems &mdash;&gt;<br />
* Journaling Flash File System v2 (JFFS2) support<br />
(0) JFFS2 debugging verbosity (0=quiet, 2=noisy)<br />
* Network file systems &mdash;&gt;<br />
* NFS file system support<br />
* Provide NFSv3 client support<br />
* Root file system on NFS<br />
* NFS server support<br />
* Provide NFSv3 server support<br />
* SMB file system support (to mount Windows shares etc.)<br />
* Native Language Support &mdash;&gt;<br />
* Default NLS Option: &ldquo;cp437&Prime;</font></p>
<p><font size="3">Kernel hacking<br />
* Kernel debugging<br />
* Compile the kernel with debug info<br />
* Include BDI-2000 user context switcher</font></p>
</blockquote>
<p><font size="3">其实上面的选项不是最小的，如果你在编译的时候遇到某些问题，可以看看出问题的源代码属于哪个部分，只要能去掉就去掉。原则就是先搞定一个能跑的内核，然后再想扩展的事情。选择完成之后，将之前编译的BSP拷贝到源代码树目录中，覆盖原有文件。</font></p>]]></description></item></channel></rss>