为s3c2410开发板 配置和编译内核过程
来源:互联网 发布:阿里云服务器ftp 编辑:程序博客网 时间:2024/06/06 02:36
为s3c2410开发板 配置和编译内核
编译环境:ubuntu8.10
linux内核:linux2.6.22
1. 首先下载内核源码 linux2.6.22.tar.bz2
一般内核的是要经过配置和编译过程的,因此首先查找可用的配置文件
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目录中
现在可以烧写内核了
编译环境: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
- 为s3c2410开发板 配置和编译内核过程
- Linux内核配置和编译过程详解
- Linux内核配置和编译过程详解
- Linux内核配置和编译过程详解
- s3c6410开发板内核配置和编译&将已写好的驱动程序编译进内核
- 最新的我的友善之臂s3c2410开发板的uboot及内核制作过程
- 基于三星S3C2410的开发板的u-boot编译过程理解
- 内核配置和编译
- 编译内核和烧写到开发板
- S3C2410平台上运行为例,讲解内核的解压过程
- 移植Linux内核2.6.28到s3c2410开发板
- 移植linux内核到S3C2410开发板的问题...
- Linux内核配置及编译过程
- Linux内核配置及编译过程
- Linux内核配置及编译过程
- Linux内核配置和编译
- Linux内核配置和编译
- Linux内核配置和编译
- webservice和wcf的区别
- Java基础学习总结(25)——Log4j快速入门教程
- nginx 优化(突破十万并发)
- php return的使用
- BigDecimal和float相乘不能得到精确值
- 为s3c2410开发板 配置和编译内核过程
- Android Application的使用及其生命周期
- android不依赖具体activity弹出Dialog对话框,即全局性对话框
- MVC架构
- Oracle--同义词相关
- LinuxBoot
- Mysql中文乱码问题完美解决方案
- Base64编码解析以及加密、解密实现
- JAVA设计模式之:代理模式--静态代理