嵌入式 armlinux内核编译注意事项

来源:互联网 发布:wince5.0软件 编辑:程序博客网 时间:2024/05/22 13:01

http://blog.sina.com.cn/s/blog_8795b0970101e0ry.html

1、      获得Linux内核源码

   获得内核源码,将其拷贝到工作目录,并解压。

嵌入式 <wbr>armlinux内核编译注意事项

2、      修改Makefile文件

为了交叉编译内核,需要修改内核的底层Makefile

嵌入式 <wbr>armlinux内核编译注意事项

 

找到下面的两行(192行左右):

嵌入式 <wbr>armlinux内核编译注意事项

修改为:

嵌入式 <wbr>armlinux内核编译注意事项

上面这样修改的意思是说我们的目标平台是arm,使用的交叉编译器的前缀是

arm-linux-.

1、      得到.config文件

编译内核时会依赖于源代码目录下的.config 文件。如果没有这个文件,在make

menuconfig的时候,会默认按照i386的配置生成.config文件,而这不是我们需要的。因

此我们要有自己的.config文件。

由于我们的配置和SMDK2410开发板的类似,因此可以使用它的.config文件,只需要

把它的.config文件拷贝到源代码根目录下的.config文件即可:

嵌入式 <wbr>armlinux内核编译注意事项

找到struct mtd_partition smdk_default_nand_part[]这个结构体,并修改它。

改前的代码:

 

 

static struct mtd_partition smdk_default_nand_part[] = {

        [0] = {

                .name   = "Boot Agent",

                .size   = SZ_16K,

                .offset = 0,

        },

        [1] = {

                .name   = "S3C2410 flash partition 1",

                .offset = 0,

                .size   = SZ_2M,

        },

        [2] = {

                .name   = "S3C2410 flash partition 2",

                .offset = SZ_4M,

                .size   = SZ_4M,

        },

        [3] = {

                .name   = "S3C2410 flash partition 3",

                .offset = SZ_8M,

                .size   = SZ_2M,

        },

        [4] = {

                .name   = "S3C2410 flash partition 4",

                .offset = SZ_1M * 10,

                .size   = SZ_4M,

        },

        [5] = {

                .name   = "S3C2410 flash partition 5",

                .offset = SZ_1M * 14,

                .size   = SZ_1M * 10,

        },

        [6] = {

                .name   = "S3C2410 flash partition 6",

                .offset = SZ_1M * 24,

                .size   = SZ_1M * 24,

        },

        [7] = {

                .name   = "S3C2410 flash partition 7",

                .offset = SZ_1M * 48,

                .size   = SZ_16M,

        }

};

修改后的结构体如下面的代码所示:

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,

                },

};

 

这样就把我们的64MNAND Flash分为四个区:

第一个区从0x000000000x00080000,大小为0.5M

第二个区从0x000800000x00280000,大小为2M

第三个区从0x002800000x00680000,大小为4M

第四个区从0x006800000x04000000,大小为57.5M

5、添加网卡驱动支持

开发板上配置了DM9000A网卡,内核已经有网卡驱动的实现代码,需要我们做一定的

配置。在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,

};

然后,把网卡数据加入smdk2410_devices数组:

static struct platform_device *smdk2410_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c,

&s3c_device_iis,

&s3c_device_dm9ks,

};

 

6、添加YAFFS文件系统支持

将我们提供的YAFFS的源代码yaffs2.tar.gz拷贝到linux-2.6.24.4的同级目

录下,解压该源码包,获得YAFFS源码:

嵌入式 <wbr>armlinux内核编译注意事项

然后进入yaffs2目录,运行./patch-ker.sh给内核打上补丁:

嵌入式 <wbr>armlinux内核编译注意事项

这样打好补丁以后,再做正确的配置,内核就可以支持YAFFS文件系统了。

 

 

7、    配置和编译内核

到现在,一个简单的内核就准备好了,我们还需要做一些配置,然后编译,内核才能

正常使用。

在内核源代码的根目录下运行 make menuconfig 命令,进入配置界面:

嵌入式 <wbr>armlinux内核编译注意事项

01、选择硬件系统

做如下选择

System Type --->

S3C2410 Machines --->

[*] SMDK2410/A9M2410

[ ] IPAQ H1940

[ ] Acer N30

[ ] Simtec Electronics BAST (EB2410ITX)

[ ] NexVision OTOM Board

[ ] AML M5900 Series

[ ] Thorcom VR1000

[ ] QT2410

其他的:

S3C2400 Machines --->

S3C2412 Machines --->

S3C2440 Machines --->

S3C2442 Machines --->

S3C2443 Machines --->

上面的四个选项下的所有选项都不要选,以减小内核体积。

 

02、配置NAND Flash驱动

做如下选择:

Device Drivers --->

<*> Memory Technology Device (MTD) support --->

<*> NAND Device Support --->

<*> NAND Flash support forS3C2410/S3C2440 SoC

03、配置文件系统

做如下配置,以支持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)

 

 

[*] Network 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

这样,内核的配置基本上就做好了。如果有兴趣,可以自己查看内核的其他配

置,并决定是否选择某项功能,以适合自己的开发板。

在内核源文件的根目录下运行make命令编译内核,编译完成后,会在内核linux-2.6.24.4/arch/arm/boot目录下生成zImage文件。这个文件就是内核的镜像文件。经过处理,可以启动。

 

8、    U-Boot启动内核

编译U-Boot时在源代码的tools目录下会生成一个mkimage可执行文件,用这个工具

可以对前面编译内核时生成的zImage进行处理,以供U-Boot启动。

cd linux-2.6.24.4/arch/arm/boot

cp /up-Star2410/kernel/linux-2.6.24.4/mkimage . 获取mkimage工具

./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d

zImage -n 'Linux-2.6.24' uImage

l  -A arm     指定CPU的体系结构,目标平台是ARM构架的    

l  -T kernel 要处理的是内核

l  -C none   不采用任何压缩方式     -O linux要处理的Linux内核

l  -a 0x30008000   加载地址,包括mkimage工具给内核添加的头信息

l  -e 0x30008040   真正的内核入口地址,除掉mkimage添加的0x40长度的头信息

l  -d zImage           使用的源文件是编译Linux内核得到的zImage

l  -n linux-2.6.24  生成的内核镜像的名字

l  uImage               生成的供U-Boot启动的二进制内核镜像

 

 

 

这样会在这个目录下生成uImage,把uImage放入主机的TFTP目录下,启动开发板,

U-Boottftp命令下载uImageSDRAM,并启动。


0 0
原创粉丝点击