移植3.4.2内核—框架介绍及简单修改
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:《嵌入式Linux应用开发手册》
- 开发环境:Linux-3.4.2 内核、arm-linux-gcc-4.3.2工具链
目录
一、安装arm-linux-gcc 4.3.2工具链
用root用户登录
1、解压
tar -zxvf arm-linux-gcc-4.3.2 tar.bz2 -C /
这样解压完成后的文件在:/opt/FriendlyARM/toolschain/4.3.2
路径下(实际上在哪个目录下都可以)。
2、移动
将上面解压的4.3.2
目录拷贝到/usr/local
cd /usr/local
mkdir arm
chmod 777 arm
cp -r /opt/FriendlyARM/toolschain/4.3.2 /usr/local/arm
3、修改环境变量
vi /etc/profile
export PATH=$PATH:/usr/local/arm/4.3.2/bin
4、生效
source /etc/profile
5、验证
执行echo $PATH
查看环境变量
执行arm-linux-gcc -v
查看工具链版本号
6、可能出现的问题及解决办法
-
问题:
若系统是32位,则按照以上步骤即可完成。
若是64位系统,可能会出现以下情况:
当输入arm-linux-gcc -v 时,出现/usr/local/arm/4.3.2/bin/arm-linux-gcc: line 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No such file or directory。 -
原因:
这是因为64位的系统缺少32位的库导致的。 -
解决办法:
sudo apt-get update
sudo apt-get install lib32z1
这样就可以进行交叉编译了。
二、配置内核
1、解压
上传内核压缩包并解压
tar xjf linux-3.4.2.tar.bz2
得到如下目录linux-3.4.2
:
2、内核配置
2.1 修改Makefile
在/work/system/linux-3.4.2
目录下vi Makefile
2.2 选择默认配置
在此目录下/work/system/linux-3.4.2/arch/arm/configs
会有这个文件s3c2410_defconfig
在/work/system/linux-3.4.2
目录下,执行make s3c2410_defconfig
,最终会的到一个.config
文件
通过vi .config
可以看到,生成的配置文件中支持如下2440板子的配置
2.3 make uImage编译
在/work/system/linux-3.4.2
目录下,执行make uImage
,出现如下错误:
-
原因:
查了一下更新,发现其中有一项是perl版本升级到了 v5.22.1,然后查了perl官方文档,发现官网因为一个bug,该版本将defined(@array)去掉了。可以直接使用数组判断非空。 -
解决方法:
打开在/work/system/linux-3.4.2/kernel
目录下的timeconst.pl
修改: -
修改前
-
修改后
最终内核编译成功
三、烧写
1、问题
直接通过NFS网络系统烧写uImage,开发版启动后出现如下问题:输出的信息乱码
nfs 0x30007FC0 192.168.1.2:/work/nfs_root/first_fs/uImage
bootm 0x30007FC0
2、解决办法1:修改波特率
乱码的最可能的原因就是波特率不一致,此时重启启动u-boot,执行如下命令,设置波特率
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
save
结果依旧是乱码
3、解决办法2:设置机器ID
- 先执行
set machid 16a
,这个机器ID是smdk2440(三星工板),可以看到机器ID已经成功设置
- 重启开发板观察,可以看到此时串口终于有输出了。
4、其他原因
如果此时程序依旧是hi乱码,可能是对应机器ID的内核源码的时钟频率有关
到此为止,新的内核烧写进去,但是无法正常运行,后面会一步步解决这些问题。