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

来源:互联网 发布:阿里云服务器ftp 编辑:程序博客网 时间:2024/06/06 02:36
为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目录中
现在可以烧写内核了

0 0
原创粉丝点击