ARM—Linux内核编译

Linux内核编译

编译过程

1.    修改Makefile

2.    配置 make XXX_defconifg

3.    make uImage

4.设置uboot启动参数

查看默认配置

find –name “*defconfig”

arm架构的默认配置在arch/arm/configs里面

比如会有mini2440_defconfig,s3c2410_defconfig

 

使用默认配置进行配置:

make s3c2410_defconfig

执行之后会生成 .config文件

Vi .config查看一下

搜索一下MINI2440:

可以看到有 MINI2440,也有SMDK2440

先编译一下

Make uImage

下载启动后发现乱码,即初始化函数参数不对:初始化过程:

根据bootloader传入的机器ID,查找内核支持的所有机器ID,匹配哪个调用哪个的初始化函数。

Uboot代码中会写一个默认的MACH ID,也可使用uboot环境变量设置machid。

比如MACH_TYPE_SMDK2410为193,这个193在哪里呢?

查看刚才被编译了的mach开头的源文件,cd arch/arm

Find –name “mach*.o”,列出的即刚才编译的内核能够支持的开发板。可以看到有很多。

测试一下:

在uboot中设置一个不存在的mach id,

Set machid 33333

Save

启动内核:会看到如下信息

这里列出了支持的单板,其中有一行16a  SMDK2410

如果想使用smdk2410,这设置 machid为16a

他们对应的文件是哪一个呢? Smdk2440对应的如下:smdk2440.c

根据mach id数值,找到这个结构体,调用其中的初始化函数

MACHINE_START 与 MACHINE_END 之间定义了初始化函数。

 

设置为smdk2440的mach id后重启内核,仍然乱码,设为mini2440的machid试一下:

Set machid 7CF

Save

正确设置uboot启动参数(包括串口波特率)后启动内核课看到串口的输出,为什么mini2440的机器ID会产生输出呢?

对比 mach_smdk2440.c 与mach_mini2440.c在初始化函数的差别,课看到map_io函数的差别:s3c24xx_init_clocks初始化时钟与我们使用的单板不对应。

 

修改晶振后可正常使用串口,启动内核会发现找不到根文件系统的提示,查看在哪里打印的提示,可以通过grep代码的方式:

grep “\”Boot\ Agent\’” * -nR

可以查到很多含有该字符串的文件,可以判定应该在common_smdk.c中

找到位置后可修改分区。

 

 

 

 

你可能感兴趣的:(linux,嵌入式)