前一阵子已经将U-boot移植好了,从今天开始,我们开始移植linux内核。移植的内核为3.4.2,移植的开发板为:jz2440开发板。
想看之前移植U-boot的记录,可以查看我的博客专栏,点击链接:点击查看U-boot移植教程
首先我们从官网下载3.4.2内核,先解压内核拿到Lniux服务器:
tar xjf linux-3.4.2.tar.bz2
cd linux-3.4.2/
然后修改Makefile,选择默认配置:
vi Makefile
找到下面这句话:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
这里需要注意一点,交叉编译工具,我这里用的是4.3.2(有的交叉编译工具编译不通过)。
然后选择默认配置:
make s3c2410_defconfig
然后:
make uImage
显示编译成功:
然后将生成的映像文件拷贝到服务器的文件系统目录(这一步不是必须的,可以根据自己的实际情况,将映像文件烧写到开发板):
cp arch/arm/boot/uImage /work/nfs_root/uImage_new
然后将其烧写到开发板,这里就是在uboot启动界面输入命令了(烧写方法不唯一,我这里是用的nfs协议直接从服务器上下载内核映像文件):
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
显示如下:
(注: 我在一开始用nfs挂载内核的的时候,出现如下错误:T T * ERROR: Cannot umount。
解决办法:要在主机的/etc/hosts文件中加入:
开发板ip nfs目录(我的是:/work/nfs_root)
例如:192.168.1.103 /work/nfs_root/
)
bootm 32000000
串口显示乱码。很显然,虽然我们的内核已经启动,但是串口的设置,肯定没有设置好。
通过分析uboot源码知,获取及其ID的方法为从环境变量中获取,或者使用默认的ID
uboot的默认MACH ID:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193
如果s = getenv(“machid”);成功,则使用它
否则使用默认的
我们先自己在环境变量中设置:
在UBOOT里:
set machid 16a // smdk2440 mach-smdk2440.c
或
set machid 7CF // mini2440 mach-mini2440.c
(这个设置我测试了一下,不设置也可以启动内核)
还需要更改一下环境变量:
set bootargs console=ttySAC0,115200 root=dev/mtdblock3
还有一个地方需要修改,如果我们使用的是 smdk2440的话,需要将arch\arm\mach-s3c24xx\mach-smdk2440.c中的
s3c24xx_init_clocks(16934400);
改为:
s3c24xx_init_clocks(12000000);
然后重新编译内核,挂载内核:
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000
终于,我们的打印的是正常的字符了,但是内核还没有真正启动,还是有一些错误,今天就不写了,放到下一篇文章中继续解决。
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。