Linux1.0 1994年3月 仅支持386
Linux1.2 1995年3月 多平台支持
Linux2.0 1996年6月 支持SMP
Linux2.2 1999年1月 支持更多的硬件
Linux2.4 2001年1月 支持桌面系统和USB
Linux2.6 2003年12月 支持更多平台,使用新的调度器,内核可被抢占,模块子系统和文件系统做了大量改进,支持更多的硬件驱动。
内核的目录结构:
Ü arch
目录里存放的是与体系结构相关的代码。对应于每个支持的体系结构,有一个相应的子目录如x86、arm等,每个体系结构子目录下包含几个主要子目录:
.boot 启动内核所需的平台特有代码
.kernel 体系结构特有特征(如SMP)的实现
.mm 与体系结构相关的内存管理代码
.lib 与体系结构相关的通用函数的实现
Ü drivers
所有设备驱动程序代码,它占整个内核代码量一半以上,每一个子目录对应一类驱动程序。
Ü fs
文件系统代码,每个支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等
Ü include
包括编译内核所需的大部分头文件,与平台无关的头文件放在include/linux子目录下,平台相关的头文件如include/asm-arm
Ü init 内核初始化代码
Ü kernel 内核管理核心代码
Ü lib 库函数代码
Ü mm 内存管理代码
Ü net 网络支持代码
Ü sound 音频设备驱动代码
Ü scripts 用于配置内核的脚本文件
Ü documentation 内核相关文档
具体移植过程:
1、首先得到源码包及需要用到的文件,包括:“linux-2.6.24.4.tar.bz2”、“yaffs2.tar.gz”、“dm9000.h”、“dm9000.c”四个文件。
2、解压linux内核和yaffs2压缩包,进入yaffs2解压后的目录,为内核打补丁使其支持yaffs2文件系统,具体命令为:
#./patch-ker.sh c ../linux-2.6.24.4/
3、修改Makefile文件,使其支持交叉编译
进入内核源码目录,执行命令:
#gedit Makefile
在打开的文件中找到下面两行并修改:
ARCH ?= arm (目标平台是arm)
CROSS_COMPILE ?= arm-linux- (交叉编译器的前缀是arm-linux-)
4、得到.config文件
.config是内核编译时所依赖的重要文件,与具体的硬件构架和开发板类型相关。这里我们选择内核提供的s3c2410_defconfig进行修改,执行以下命令:
#cp arch/arm/configs/s3c2410_defconfig .config
5、修改Nand Flash分区
执行以下命令:
#gedit arch/arm/plat-s3c24xx/common-smdk.c
然后在打开的文件中修改分区信息结构体:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Bootloader",
.size = 0x80000,
.offset = 0,
},
[1] = {
.name = "Linux Kernel",
.offset = 0x80000,
.size = SZ_2M,
},
[2] = {
.name = "Root File System",
.offset = 0x280000,
.size = SZ_4M,
},
[3] = {
.name = "User Space",
.offset = 0x680000,
.size = 0x3980000,
},
};
6、禁止ECC校验
内核是通过U-BOOT写到Nand Flash的, UBOOT产生的ECC校验码, 这与内核产生的ECC校验码不一样, 所以, 我们在这里选择禁止内核ECC校验。
修改drivers/mtd/nand/s3c2410.c文件,执行以下命令:
#gedit drivers/mtd/nand/s3c2410.c
在打开的文件中找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip->eccmode = NAND_ECC_NONE;
然后保存,退出。
7、添加LCD支持
执行以下命令:
#gedit arch/arm/mach-s3c2410/mach-smdk2410.c
在打开的文件中添加两个头文件:
#include <asm/arch/fb.h>
#include <linux/platform_device.h>
然后再添加两个结构体:
static struct s3c2410fb_display smdk2410_fb[] __initdata =
{
{
.lcdcon5 = (1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0),
.type = (3<<5),
.width = 640,
.height = 480,
.pixclock = 39721,
.xres = 640,
.yres = 480,
.bpp = 16,
.left_margin = 40,
.right_margin = 32,
.hsync_len = 32,
.vsync_len = 2,
.upper_margin = 35,
.lower_margin = 5,
},
};
static struct s3c2410fb_mach_info smdk2410_fb_info __initdata =
{
.displays = smdk2410_fb,
.num_displays = 1,
.default_display = 0,
.gpcup = 0xffffffff,
.gpcup_mask = 0x0,
.gpccon = 0xaaaaaaaa,
.gpccon_mask = 0x0,
.gpdup = 0xffffffff,
.gpdup_mask = 0x0,
.gpdcon = 0xaaaaaaaa,
.gpdcon_mask = 0x0,
.lpcsel = 0,
};
最后在“smdk2410_init”函数的末尾一行添加:
s3c24xx_fb_set_platdata(&smdk2410_fb_info);
8、添加网卡驱动
执行以下命令:
#gedit arch/arm/mach-s3c2410/mach-smdk2410.c
在打开的文件中添加两个结构体,用于定义端口地址和中断号等设备信息:
static struct resource s3c_dm9ks_resource[] = {
[0] = {
.start = 0x10000000,
.end = 0x10000040,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_EINT2,
.end = IRQ_EINT2,
.flags = IORESOURCE_IRQ,
},
};
struct platform_device s3c_device_dm9ks = {
.name = "s3c2410-dm9ks",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_dm9ks_resource),
.resource = s3c_dm9ks_resource,
};
然后在“struct platform_device *smdk2410_devices[] __initdata”末尾加入网卡数据:
&s3c_device_dm9ks,
最后将新的“dm9000.c”和“dm9000.h”拷贝到“linux-2.6.24.2/drivers/net”文件夹内,替换旧的文件,执行以下命令:
#cp /home/kernel/dm9000.* drivers/net/
9、配置内核
运行以下命令:
#make menuconfig
然后进入内核配置界面,进行以下配置:
一、选择硬件系统
System Type à
S3C2410 Machines à
[*] SMDK2410/A9M2410
其他不要选,以免内核太大。
二、配置Nand Flash驱动
Device Driversà
<*> Memory Technology Device (MTD) supportà
<*> NAND Device Supportà
<*> NAND Flash support for S3C2410/S3C2440 SoC
三、配置LCD驱动
Device Drivers à
Graphics support à
<*> Support for frame buffer devices à
<*> S3C2410 LCD framebuffer support
Device Drivers à
Graphics support à
[*] Bootup logoà
[*] Standard black and white Linux logo
[*] Standard 16-color Linux logo
[*] Standard 224-color Linux logo
四、配置网卡驱动
Device Driversà
[*] Network device supportà
[*] Ethernet (10 or 100Mbit)à
-*- Generic Media Independent Interface device support
<*> ASIX AX88796 NE2000 clone support
[ ] ASIX AX88796 external 93CX6 eeprom support
< > SMC 91C9x/91C1xxx support
< > DM9000 support
< > Broadcom 440x/47xx ethernet support
五、配置文件系统
使其支持CRAMFS文件系统、YAFFS文件系统、NFS文件系统
File systemsà
Miscellaneous filesystemsà
<*> YAFFS2 file system support
-*- 512 byte / page devices
[ ] Use older-style on-NAND data format with pageStatus byte
[ ] Lets Yaffs do its own ECC
-*- 2048 byte (or larger) / page devices
[*] Autoselect yaffs2 format
[ ] Disable lazy loading
[ ] Turn off wide tnodes
[ ] Force chunk erase check
[*] Cache short names in RAM
< > Journalling Flash File System v2 (JFFS2) support
<*> Compressed ROM file system support (cramfs)
File systemsà
[*] Network File Systemsà
<*> NFS file system support
[*] Provide NFSv3 client support
[*] Provide client support for the NFSv3 ACL protocol extension
[ ] Provide NFSv4 client support (EXPERIMENTAL)
[*] Allow direct I/O on NFS files
< > NFS server support
[*] Root file system on NFS
10、编译内核
内核源码目录执行以下命令:
#make clean
#make
编译完成后会在“linux-2.6.24.2/arch/arm/boot/”目录下生成内核镜像文件zImage,这个生成的zImage还不能通过U-BOOT启动,需要使用编译u-boot时生产的工具mkimage进行处理才能正常启动,具体过程为:
#cp /home/uboot/u-boot-1.3.2/tools/mkimage arch/arm/boot/
#./mkimage –A arm –T kernel –C none –O linux –a 0x30008000 –e 0x30008040 –d zImage –n ‘Linux-2.6.24’ uImage
上述过程完成后就生成了我们需要的内核映像文件uImage,这个文件就是我们要烧写到板子上的内核映像。