linux-3.0内核移植

**********************************************************************************************************

#操作系统       :CentOS6.7

#内核下载地址:https://www.kernel.org/pub/linux/kernel/

#参考板子       :smdk2440  mini2440

#cpu               :s3c2440,(arm920t)

#编译环境       :gcc version 4.4.7 (buildroot-2012.08)

#u-boot          :u-boot-2010.09(MACHID = 1999)

#Linux内核    :linux-3.0

*********************************************************************************************************

在移植内核之前我们有必要了解一下内核的基础知识!

1.什么是内核?

“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载

Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

2.

Makefile:一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件。

Kconfig:一个文本形式的文件,其中主要作用是在内核配置时候,作为配置选项。(make menuconfig里面的配置就在Kconfig里面)

.config:文件是在进行内核配置的时候,经过配置后生成的内核编译参考文件。(make menuconfig后就会生成这些.config文件<这些是隐藏文件,如果想查找可以用 find  ".config" 命令>)

make menuconfig: 图形化的内核配置

一.配置顶层的Makefile


这里修改的原因是:指明体系结构为arm,采用的交叉编译器为arm-linux-,这一步一定要改完再执行make menuconfig,否则,用的是x86的make,打开的配置单不是arm的。

1.下面是自己要添加的代码:

**********************************************************************************************************************************************************************************

 559 all: vmlinux(目标)
 560         cp arch/arm/boot/zImage . -f(拷贝zImage文件到当前目录)
 561         /home/zoulei/fl2440/kernel/linux-3.0/mkimage -A arm -O linux -T ker     nel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d zImage linuxrom-s3     c2440.bin(将zImage制作成启动映像文件,即:linuxrom-s3c2440.bin)
 562         rm -f zImage

**********************************************************************************************************************************************************************************

说明:

zImage 
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩 形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空 间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。 
编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。

mkimage

uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。 
mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么(这里我mkimage我就直接放到内核的根目录下面所以路径就是如上图所示,如果你mkimage没放到内核的根目录下,那么就要在使用的时候加上路径)

2.在distclean下加入一条命令:



1207     @rm -f linuxrom-s3c2440.bin (加上@后屏幕不会打印出来这条语句)



二.修改晶振频率

[zoulei@CentOS linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c


时钟晶振 s3c24xx_init_clocks( )改成12MHz=12000000,这里设置成12M是参考s3c2440的datasheet

三.对串口进行修改

[zoulei@CentOS linux-3.0]$ vim drivers/tty/serial/samsung.c



说明:
改这个名字是因为三星板子的串口命名叫ttySAC而我们习惯上命名为ttyS0,ttyS1....所以为了以后夸平台我们方便认出来,最好改一下这个名字.
特别注意S要大写,之前就是因为这个地方没有注意,导致后面制作文件系统时,总是出错。。。
ttyS是linux系统里面的串口名字,ttyS1,ttyS2就相当与windows里面的com1,com2.

四.修改机器ID

[zoulei@CentOS linux-3.0]$ vim arch/arm/tools/mach-types




说明:在内核文件arch/arm/mach-s3c2440/mach-smdk2440.c中的 MACHINE_START(S3C2440,”SMDK2440”)中要使用该机器码,同时它还应该与uboot中的机器码一致,uboot中我们使用的是mini2440的机器码,所以这里我们要将mini2440和s3c2440的机器码换一下,我们需要启动的是smdk2440    
 
五.添加nand flash分区

[zoulei@CentOS linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c


这个分区的设置视自己的情况而定......

六.make menuconfig操作
[zoulei@CentOS linux-3.0]$ make menuconfig




说明:选择SMDK2440时,下面的两个选项也会默认选上......

七.Make编译

[zoulei@CentOS linux-3.0]$ make



最后成功生成了linuxrom-s3c2440.bin的可执行文件,这时候就可以烧到开发板上运行了,

移植过程中遇到的问题及解决方法:
1.问题
Makefile:560: *** 遗漏分隔符 。 停止
all: vmlinux
        cp arch/arm/boot/zImage . -f
        /home/zoulei/fl2440/kernel/linux-3.0/mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d zImage linuxrom-s3c2440.bin
        rm -f zImage


解决:
gcc、rm、cp前面是tab分割符,不能用空格,否则会出现:

“makefile:2: *** 遗漏分隔符 。 停止。”
“makefile:4: *** 遗漏分隔符 。 停止。”
“makefile:6: *** 遗漏分隔符 。 停止。”
“makefile:8: *** 遗漏分隔符 。 停止。”
“makefile:10: *** 遗漏分隔符 。 停止。”
这样的错误提示。

2.问题
make: mkimage:命令未找到
解决:
mkimage所在的路径没给导致。

3.测试遇到的问题
[fl2440@zoulei]# boot

NAND read: device 0 offset 0x100000, size 0x800000
Skipping bad block 0x00540000
 8388608 bytes read: OK
## Booting kernel from Legacy Image at 30008000 ...
   Image Name:   Linux Kernel
   Created:      2016-09-25  14:56:25 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2742328 Bytes = 2.6 MiB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
驱动在这里停止不动了,也就是出现了死机。

解决:
在启动uboot的时候,我不知道要通过bootargs和bootcmd给内核传递参数,于
是查找资料才知道需要对那两个变量进行修改,修改如下:
[fl2440@zoulei]# set bootargs 'console=ttyS0,115200 mem=64M rw loglevel=7'
[fl2440@zoulei]# set bootcmd'nand read 30008000 100000 800000;bootm 30008000'
修改完之后就可以顺利启动我移植的内核了,,,

出现如下提示错误:驱动显示没有文件系统,不过这是因为我还没有挂载文件系统!
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace:
[<c003b2cc>] (dump_backtrace+0x0/0x110) from [<c040cbdc>] (dump_stack+0x18/0x1c)
 r6:00008000 r5:c38a9000 r4:c0568f60 r3:c05426d4
[<c040cbc4>] (dump_stack+0x0/0x1c) from [<c040cc3c>] (panic+0x5c/0x17c)
[<c040cbe0>] (panic+0x0/0x17c) from [<c0008de0>] (mount_block_root+0x1c8/0x208)
 r3:00000000 r2:20000013 r1:c3819f58 r0:c04c057d
 r7:c04c05e1
[<c0008c18>] (mount_block_root+0x0/0x208) from [<c0008fc8>] (mount_root+0xac/0xd0)
[<c0008f1c>] (mount_root+0x0/0xd0) from [<c000914c>] (prepare_namespace+0x160/0x1b4)
 r4:c05688a0
[<c0008fec>] (prepare_namespace+0x0/0x1b4) from [<c00089d4>] (kernel_init+0xe4/0x118)
 r5:c0025bcc r4:c0568840
[<c00088f0>] (kernel_init+0x0/0x118) from [<c004d8ac>] (do_exit+0x0/0x624)
 r5:c00088f0 r4:00000000



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值