您的位置:首页 > 其它

为s3c2410开发板 配置和编译内核过程

2015-12-30 11:30 471 查看
为s3c2410开发板 配置和编译内核

编译环境:ubuntu8.10

linux内核:linux2.6.22

1. 首先下载内核源码 linux2.6.22.tar.bz2

解压缩到 /opt目录下

tar -jxvf linux2.6.22.tar.bz2

cd linux2.6.22

一般内核的是要经过配置和编译过程的,因此首先查找可用的配置文件

ls arch/arm/configs/

发现 s3c2410_defconfig 跟我们使用的s3c2440比较接近

因此在顶层目录下执行

make s3c2410_defconfig

结果出错:Can't find default configuration "arch/i386/configs/s3c2410_defconfig"!,

分析: linux内核的默认架构是i386,因此我们修改顶层Makefile,使得ARCH 为arm

2.修改顶层 Makefile,

修改 ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

3. 配置内核

make s3c2410_defconfig

提示:configuration written to .config

说明配置成功了,该配置文件在顶层目录下

4.通过菜单修改配置

上面生成的配置文件只是简单的配置,我们如果需要进行详细的配置,还需要进入菜单项进行选择

make menuconfig

修改完以后退出

5.编译生成内核

编译内核有几个不同的命令

(1)make 在顶层目录下生成内核映像文件vmliunx, 还生成arch/arm/boot/zImage

(2)make zImage 经试验,跟make的效果是一致的,生成./vmliunx ./arch/arm/boot/zImage

(3)make uImage 除生成内核映像文件vmliunx,还在arch/arm/boot/下生成u-boot格式的内核映像文件uImage

我们使用 make uImage

make uImage

报错,"mkimage" command not found - U-Boot images will not be built

这是因为找不到 mkimage 这个软件,mkimage 是编译u-boot以后生成的文件,在u-boot 的 tools/目录下

可以拷贝这个软件到/usr/bin/下

cp mkimage /usr/bin/

然后再make uImage

Image Name: Linux-2.6.22

Created: Sun Dec 27 17:58:59 2015

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1477724 Bytes = 1443.09 kB = 1.41 MB

Load Address: 30008000

Entry Point: 30008000

Image arch/arm/boot/uImage is ready

加载地址和入口地址一致,明显是错误的,正确形式应该为:入口地址=加载地址+64字节

首先查看Makefile

cat arch/arm/boot/Makefile

第一句话就是 MKIMAGE := $(srctree)/scripts/mkuboot.sh

里面有mkuboot,应该就是我们需要的吧,

查看一下该文件

cat scripts/mkuboot.sh

内容如下:

MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage")

if [ -z "${MKIMAGE}" ]; then

MKIMAGE=$(type -path mkimage)

if [ -z "${MKIMAGE}" ]; then

# Doesn't exist

echo '"mkimage" command not found - U-Boot images will not be built' >&2

exit 0;

fi

fi

查看该文件,大体意思就是确认mkimage的路径,如果存在则 MKIMAGE=mkimage的路径

还是没有找到内核的加载地址和入口地址

那我们查找一下哪里定义的30008000

grep "30008000" * -nR

arch/arm/boot/compressed/.vmlinux.cmd:1:cmd_arch/arm/boot/compressed/vmlinux := arm-linux-ld -EL --defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 -p --no-undefined -X /opt/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a
-T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux

arch/arm/boot/.uImage.cmd:1:cmd_arch/arm/boot/uImage := /bin/bash /opt/linux-2.6.22/scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

arch/arm/mach-s3c2410/Makefile.boot:1: zreladdr-y
:= 0x30008000

对内容

arch/arm/boot/.uImage.cmd:1:cmd_arch/arm/boot/uImage := /bin/bash /opt/linux-2.6.22/scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

进行解析:

arch/arm/boot/.uImage.cmd 文件 .uImage.cmd

:1 文件中的第一行

:cmd_arch/arm/boot/uImage := /bin/bash 这句话没看懂

/opt/linux-2.6.22/scripts/mkuboot.sh 使用/opt/linux-2.6.22/scripts/目录下的脚本mkuboot.sh 生成uImage

-A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.22' 这是mkimage所需要的参数

-d arch/arm/boot/zImage arch/arm/boot/uImage 将arch/arm/boot/目录下的zImage 生成uImage,存放在arch/arm/boot/目录下

大体的意思就是这样,因此我们只需要修改 arch/arm/boot/.uImage.cmd文件中的 -e 0x30008000 为 -e 0x30008040 即可

修改以后, make uImage

发现入口地址还是 0x30008000

查看文件 arch/arm/boot/.uImage.cmd ,发现地址又变回原来的值了。看来这个地方不是源头

make distclean 以后,发现 arch/arm/boot/.uImage.cmd 文件不见了,说明这个文件是make以后生成的文件。

再次

grep "30008000" * -nR

arch/arm/mach-s3c2410/Makefile.boot:1: zreladdr-y
:= 0x30008000

说明最开始定义0x30008000 是在 arch/arm/mach-s3c2410/Makefile.boot 中

搜索

grep "zreladdr-y" * -nR

arch/arm/boot/Makefile:24:ZRELADDR := $(zreladdr-y)

arch/arm/mach-s3c2410/Makefile.boot:1: zreladdr-y
:= 0x30008000

发现在文件中使用了这个变量 arch/arm/boot/Makefile ZRELADDR

打开arch/arm/boot/Makefile

quiet_cmd_uimage = UIMAGE $@

cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \

-C none -a $(ZRELADDR) -e $(ZRELADDR) \

-n 'Linux-$(KERNELRELEASE)' -d $< $@

应该就是在这个地方使用的了

可以修改-e 后的 $(ZRELADDR) 为 0x30008040

或者在开始的地方增加

ENTRY_ADDR := $(shell echo $(ZRELADDR) | sed -e "s/..$$/40/")

将 -e $(ZRELADDR) 更改为 -e $(ENTRY_ADDR)

这时就可以 make uImage 了

这样做还是比较麻烦

我们可以参照 arch/arm/boot/.uImage.cmd 自己写一个脚本

/bin/bash /opt/linux-2.6.22/scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

mkuimage.sh (保存到内核根目录下)

mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

或者在根目录下执行该命令

make uImage的总结

1. 前提是必须有mkimage工具

cp mkimage /usr/bin/

mkimage 在经过编译的u-boot的tools目录下

2. 现在可以使用make uImage 来生成u-boot可以引导的内核映像文件了

make uImage

生成的uImage文件在 arch/arm/boot/目录下

根据提示,发现加载地址和入口地址不正确,

3. 参照 arch/arm/boot/.uImage.cmd 自己写命令

mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

cp arch/arm/boot/uImage /tftpboot/ 拷贝到其他目录中

最后总结内核映像的配置和编译过程

1. 下载内核源码

linux2.6.22.tar.bz2

2. 解压缩到linux的/opt/目录下

tar -jxvf linux2.6.22.tar.bz2

如果是使用别人给的补丁,则可以解压缩以后打补丁

(1)拷贝补丁文件到/opt目录下

(2)cd linux2.6.22

(3)patch -p1 < ../补丁文件名

(4)打补丁以后3-5应该不用做了

3. 修改顶层Makefile文件

vim Makefile

修改 ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

4. 生成默认配置文件

make s3c2410_defconfig

5. 修改详细配置文件

make menuconfig

6. 拷贝mkimage到/usr/bin/下

cp mkimage /usr/bin/

7. 编译生成uImage内核

make uImage

生成的uImage文件在 arch/arm/boot/目录下

根据提示,发现加载地址和入口地址不正确,

8. 参照 arch/arm/boot/.uImage.cmd 自己写命令

mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.22' -d arch/arm/boot/zImage arch/arm/boot/uImage

cp arch/arm/boot/uImage /tftpboot/ 拷贝到tftpboot目录中

现在可以烧写内核了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: