移植新的(3.4.2)内核至开发板中
date: 2018年1月25日
1.下载并初步编译
- 解压并修改Makefile
vim Makefile + 195
- ARCH ?= $(SUBARCH)
- CROSS_COMPILE = $(CONFIG_CROSS_COMPILE: "%" = %)
+ ARCH ?= arm
+ CROSS_COMPILE = arm-linux-
- 使用默认配置进行初次编译
make s3c2410_defconfig (可以在 arch/arm/configs 中查看相关配置文件)
make uImage
# 期间报错Can't use 'defined(@array)' (Maybe you should just omit the
# defined()?) at kernel/timeconst.pl line 373
# 解决方案:进入 kernel/timeconst.pl line 373
- if (!defined(@val)) {
+ if (!(@val)) {
- 修改代码支持 JZ2440
/* arch/arm/mach-s3c24xx/mach-s3c2440.c line 165 */
- s3c24xx_init_clocks(16934400);
+ s3c24xx_init_clocks(12000000);
- 修改分区表
/* arch/arm/mach-s3c24xx/common-smdk.c line 111:(static struct mtd_partition smdk_default_nand_part[] ) */
// 更改为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_1M * 3,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
};
- nfs 下载文件时出现如下错误:
T T *** ERROR: Cannot umount
解决方法: 在主机的 /etc/hosts 中加入如下内容:
# 开发板IP nfs文件目录
192.168.1.17 /path/to/nfs_root/
- 文件系统启动之后出现如下报错:
Attempted to kill init! exitcode=0x00000004
原因及解决方法:
报错码 0x00000004 即为 SIGILL --- 非法指令;而产生非法指令的原因是,我们在编译时用的是
arm-none-linux-guneabi。 其中eabi的意思是指可执行层应用程序二进制接口,所以内核也需要
支持这种接口
make menuconfig # search EABI
Kernel Features
[*]USE the ARM EABI to compile the kernel # y to select
make uImage
编译支持yaffs2
- 下载yaffs2 源码
- 依据yaffs2 提供的README 来将yaffs2 拷到内核之中:
./patch_ker.sh c m /path/to/kernel
- 配置添加yaffs2支持
make menuconfig
# 如果提示类似fs/yaffs2/Kconfig:131: unknown option "If"的错误,可以把
# fs/yaffs2/Kconfig文件中的help选项后的说明文字的空行删除。
# 配置选项的路径如下:
# File systems/Miscellaneous file systems/ yaffs2
make uImage
- 挂载无法运行的错误(我没有遇到)
/* u-boot: drivers/mtd/nand/nand_util.c line 518 */
- if (!need_skip && !(flags & WITH_DROP_FFS))
+ if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB))
裁剪
make menuconfig
System Type
Samsung S3C24xx Supports
# 去掉无关的soc
PS: 自己改变分区大小,无法启动,报错信息如下
NAND read: device 0 offset 0xa0000, size 0x200000
2097152 bytes read: error
## Booting kernel from Legacy Image at 72000000 ...
Image Name: Linux-2.6.30
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1939156 Bytes = 1.8 MB
Load Address: 70008000
Entry Point: 70008000
Verifying Checksum ... Bad CRC or data
Error: Can't get kernel image!
解决方案
- 问题出现的原因是因为,烧写内核和文件系统的地方出现了坏块,导致无法正确识别到 kernel
文件 - 解决方法:就是利用 “ nand scrub” 命令将坏块清除掉然后重新编译