三 编译内核
我们选定 linux-2.6.14.tar.bz2 这个版本, 交叉编译器用 arm-linux-gcc 3.4.1 (对
2.6 内核用 3.4 以下的版本编译经常会出现问题)。操作步骤如下:
1.假定内核源码包在 /root 下, 首先解压源码:
#cd /root
#tar xjf linux-2.6.14.tar.bz2
2.进入内核目录:
#cd linux-2.6.14
修改此目录下的 Makefile, 将
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
3.生成默认的内核配置文件(for s3c2410):
#make smdk2410_defconfig
4.为内核添加 cs8900(见附件) 网卡驱动,以支持 NFS 挂接:
(1)复制 cs8900 驱动到 drivers/net/arm 目录
#cp cs8900.c drivers/net/arm
#cp cs8900.h drivers/net/arm
(2)修改 drivers/net/arm 目录下的 Kconfig 文件, 在最后添加:
config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help
Support for CS8900A chipset based Ethernet cards. If you have a network
(Ethernet) card of this type, say Y and read the Ethernet-HOWTO, available
from as well as .To compile this driver as a module, choose M here and read.
The module will be called cs8900.o.
注:在运行 make menuconfig 命令时就会出现: [ ] CS8900 support 这一选项
(3)修改 drivers/net/arm 目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_ARM_CS8900) += cs8900.o
注:2.6 版本内核的 Makefile 也与 2.4 的有所不同, 添加以上语句, 就会使内核在
编译的时候根据配置将cs8900A的驱动程序以模块或静态的方式编译到内核当中。
(4)修改 arch/arm/mach-s3c2410/mach-smdk2410.c
在此文件中找到 smdk2410_iodesc[] 结构数组,添加如下如下内容:
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}
修改之后变成:
static struct map_desc smdk2410_iodesc[] __initdata = {
/* nothing here yet */
/* Map the ethernet controller CS8900A */
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}
};
并且添加一个头文件引用:
#include <asm-arm/arch-s3c2410/smdk2410.h>
(5)在 include/asm-arm/arch-s3c2410 目录下创建文件 smdk2410.h
#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_
#include <linux/config.h>
#define pSMDK2410_ETH_IO 0x19000000
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ IRQ_EINT9
#endif
5.参照 http://skyeye.wiki.sourceforge.net/Linux 修改内核文件
修改 include/asm-arm/arch-s3c2410/map.h
#define S3C2410_CS6 (0x30000000UL)
to
#define S3C2410_CS6 (0xC0000000UL)
修改 include/asm-arm/arch-s3c2410/memory.h
#define PHYS_OFFSET (0x30000000UL)
to
#define PHYS_OFFSET (0xC0000000UL)
6.裁剪/定制内核
(1)#make menuconfig
(2)设置内核启动参数
Boot options ---> Default kernel command string:
mem=32M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=8192 rw
(3)设置 CS8900 的支持
Device Drivers --->
Network device support --->
Ethernet (10 or 100Mbit) ---> [] CS8900 support
选中
CS8900 support
(4)设置 initrd 的支持
Device Drivers ---> Block devices ---> [ ] RAM disk support
下面三项必须设置:
1.确保 RAM disk support 被选中
2.相应的将默认的 (4096) Default RAM disk size (kbytes) 改成 8192;
3.Initial RAM disk (initrd) support 一定要选中, 切记!
(5)设置 NFS 的支持
File systems ---> Network File Systems --->
至少确保下面两项被选中:
NFS file system support
Provide NFSv3 client support
(6)设置 ROM file system 的支持
File systems --->
ROM file system support
确保
ROM file system support 被选中
(7)设置 ext2 的支持
File systems --->
Second extended fs support
确保
Second extended fs support 被选中
7.编译
#make
编译完成后会有个 vmlinux 在当前目录下, 这就是我们要的 arm-linux 内核了