linux内核跑飞,linux内核移植中的编译异常

一,在编译linux内核时出现make:***[.tmp_vmlinux1] Error 1这类错误

解决方法:修改arch/arm/kernel/vmlinux.lds

[arm@localhost linux2.6.14]$

vi arch/arm/kernel/vmlinux.lds

将文件尾2条的ASSERT注释掉(1439行)

/* ASSERT((__proc_info_end __

proc_info_begin), "missing CPU support") */

/* ASSERT((__arch_info_end __

arch_info_begin), "no machine record defined") */

然后重新make zImage即可

二,使用mini2440带的Linux2.6.32 使用u-boot 1.3.4引导时候无法启动内核,一直停留在

Uncompressing Linux..................................................................................................................................................... done, booting the kernel.

出现这个现象的原因有三个:

1.u-boot中的频率与kernel中CPU频率的设置不一样,kernel中设置的过高,使程序跑飞。

2.mach_type值不一致。u-boot中的mach_type值与kernel中的不一致,导致这个问题。

3.启动的时候,串口参数设置有问题。

我的问题是第2个大原因。

去arch/arm/mach-s3c2440/mach-mini2440.c 查看下面这个结构体:

MACHINE_START(MINI2440, "MINI2440")

/* Maintainer: Michel Pollet */

.phys_io        = S3C2410_PA_UART,

.io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params    = S3C2410_SDRAM_PA + 0x100,

.map_io         = mini2440_map_io,

.init_machine   = mini2440_init,

.init_irq       = s3c24xx_init_irq,

.timer          = &s3c24xx_timer,

MACHINE_END

问题就是出在第一行的MINI2440,因为这个宏定义扩展之后的machine type 就成了 MACHINE_TYPE_MINI2440, 而我在u-boot定义的是MACHINE_TYPE_S3C2440,因此不匹配导致内核不识别死在这里了。

将MINI2440改成S3C2440后内核成功起来

三,在编译内核的时候,提示如下错误:dingq@wd-u1110:~/hwsvn/2sw/1prj_linux/pdu/kernel/linux-2.6.30$ make menuconfig

*** Unable to find the ncurses libraries or the

*** required header files.

*** 'make menuconfig' requires the ncurses libraries.

***

*** Install ncurses (ncurses-devel) and try again.

***

make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1

make: *** [menuconfig] Error 2

看到说只要安装libncurses5-dev就够了。

sudo apt-get install libncurses5-dev四,在设置nand分区时,产生的错误

此时执行 make zImage 会报错如下:

CHK include/linux/version.h

make[1]: `include/asm-arm/mach-types.h' is up to date.

CHK include/linux/utsrelease.h

SYMLINK include/asm -> include/asm-arm

CALL scripts/checksyscalls.sh

CHK include/linux/compile.h

CC arch/arm/mach-s3c2440/mach-mini2440.o

arch/arm/mach-s3c2440/mach-mini2440.c:49: error: array type has incomplete element type

arch/arm/mach-s3c2440/mach-mini2440.c:50: error: array index in non-array initializer

arch/arm/mach-s3c2440/mach-mini2440.c:50: error: (near initialization for 'mini2440_default_nand_part')

arch/arm/mach-s3c2440/mach-mini2440.c:51: error: field name not in record or union initializer

arch/arm/mach-s3c2440/mach-mini2440.c:51: error: (near initialization for 'mini2440_default_nand_part')

arch/arm/mach-s3c2440/mach-mini2440.c:52: error: field name not in record or union initializer

这是因为缺少以下头文件:

#include

#include

#include

#include

#include

加入重新编译,生成arch/arm/boot/zImage,下载至板子,重新启动,结果产生kernel panic如下:

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c24xx-nand s3c2440-nand: Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns

Unable to handle kernel NULL pointer dereference at virtual address 00000018

pgd = c0004000

[00000018] *pgd=00000000

Internal error: Oops: 5 [#1]

last sysfs file:

Modules linked in:

CPU: 0 Not tainted (2.6.32 #2)

PC is at s3c24xx_nand_probe+0x2d8/0x514

LR is at s3c24xx_nand_probe+0x1a4/0x514

pc : [] lr : [] psr: 60000013

sp : c3823f08 ip : 00000000 fp : 00000001

r10: 00000000 r9 : 00000000 r8 : 00000000

r7 : c03cf388 r6 : 00000000 r5 : c39b68c0 r4 : c3895800

r3 : 00000001 r2 : c3895988 r1 : c4c00000 r0 : 00000002

Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel

Control: c000717f Table: 30004000 DAC: 00000017

Process swapper (pid: 1, stack limit = 0xc3822270)

Stack: (0xc3823f08 to 0xc3824000)

红色的内容说明我们更改的nand驱动参数根本就没有生效,分析Linux内核中的nand flash驱动drivers/mtd/nand/s3c2410.c文件中的相应函数,

其中的static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)函数发现:

struct s3c2410_platform_nand *plat = info->platform;

int tacls_max = (info->cpu_type == TYPE_S3C2412) ? 8 : 4;

…………

info->clk_rate = clkrate;

clkrate /= 1000; /* turn clock into kHz for ease of use */

if (plat != NULL) {

tacls = s3c_nand_calc_rate(plat->tacls, clkrate, tacls_max);

twrph0 = s3c_nand_calc_rate(plat->twrph0, clkrate, 8);

twrph1 = s3c_nand_calc_rate(plat->twrph1, clkrate, 8);

} else {

/* default timings */

tacls = tacls_max;

twrph0 = 8;

twrph1 = 8;

}

if (tacls 

dev_err(info->device, "cannot get suitable timings\n");

return -EINVAL;

}

dev_info(info->device, "Tacls=%d, %dns Twrph0=%d %dns, Twrph1=%d %dns\n",

tacls, to_ns(tacls, clkrate), twrph0, to_ns(twrph0, clkrate), twrph1, to_ns(twrph1, clkrate));

由以上内容可以看出,你的内核并没有使用你的mini2440_nand_info结构体中的配置,而是使用了它的默认配给,即

} else{

/* default timings */

tacls = tacls_max;

twrph0 = 8;

twrph1 = 8;

}

中的配置信息。这点和你的内核输出s3c24xx-nand s3c2440-nand:Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns完全符合

解决方法:只需在mach-mini2440.c的初始化函数mini2440_machine_init(void)里加入

s3c_device_nand.dev.platform_data=&mini2440_nand_info;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值