您的位置:首页 > 运维架构 > Linux

【移植Linux 3.4.2内核第一步】之简单修改

2018-01-18 01:00 399 查看
前一阵子已经将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语言,数据结构等技术问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐