嵌入式Linux学习笔记(二) 交叉编译环境和Linux系统编译、下载
参考资料
1.正点原子《Linux驱动开发指南说明V1.0》 第四章 开发环境搭建
2.正点原子《Linux驱动开发指南说明V1.0》 第三十章 U-Boot使用实验
3.正点原子《Linux驱动开发指南说明V1.0》 第三十七章 Linux内核移植
4.正点原子《Linux驱动开发指南说明V1.0》 第三十八章 根文件系统移植
交叉编译环境构建
选择正点原子A盘>5、开发工具>1、交叉编译器中已经下载好的编译工具,并根据Ubuntu系统位数的不同选择指定的编译器,如我安装的系统是64位,选择gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz文件
1)在linux下使用指令sudo su,输入密码后进入root模式
2) 使用指令创建文件夹
mkdir -p /usr/local/arm
3)将gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.通过SSH Secure Shell Client上传到创建的/usr/local/arm文件夹下,如果上传失败,要用
chmod 777 /usr/local/arm
修改路径的权限, 上传之后如图所示
4)使用指令
tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
解压到当前路径,如下:
5)将路径添加到全局变量上,使用vim /etc/profile指令,在末尾添加
export PATH="$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"
同时使用vim /etc/environment,路径如下:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"
开启新的窗口,此时通过
echo $PATH
即可查看全局路径下gcc的路径是否成功添加。
注意:修改上述路径需要注意不要有语法错误,否则可能导致全局路径丢失,导致系统问题
6)最后通过指令,即可查看是否安装成功
arm-linux-gnueabihf-gcc -v
至此,交叉环境的编译即搭建完成,因为以应用为目的,所以后续都以开发板提供的工具为准,如果想了解编译器和下面的安装包,建议详细去看《Linux驱动开发指南说明V1.0》的指定章节。
uboot编译和验证
从学习的角度来说,这三部分在整个嵌入式Linux的要占很大的比重,这部分很重要,而且也必须要掌握去了解,但是从应用的角度,首先最重要的是去实现需求,所以最初这部分不要去深究,因为偏离去学的话,一方面会占用大量的时间,另一方面这部分资料学起来分散,容易因为没有目标而不知道深入的重点,因此先以熟练使用为目标,后面在工程开发中穿插实现。因此这里就以正点原子提供的uboot和linux系统为准,在掌握这部分知识之前,需要确定Linux的启动方式,这部分会经常用到。
1).使用光盘资料A盘>1、例程源码>3、正点原子修改后的Uboot和Linux,将解压后的文件上传到Ubuntu到的路径下。
2).在/usr/code/uboot下使用
tar -xvf uboot-imx-2016.03-2.1.0-g9bd38ef-v1.0.tar.bz2
指令解压,解决后结果如下:
3).以我的硬件平台(ddr256M, nand512M为例), 使用默认配置文件为mx6ull_14x14_ddr256_nand_defconfig, 使用如下指令进行编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig
执行结果如下,即用于编译的.config的文件,最后执行编译指令:
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
如此就完成了编译,然后参考《Linux驱动开发指南说明V1.0》中8.4.3章节,使用imxdownload即可完成下载(具体如何下载参考。使用指令
./imxdownload u-boot.bin /dev/sdb
即可实现下载,结果如下:
至于sdb就是我的SD卡挂载的地址,可通过ls /dev/sd*查看,此外这个下载会格式化指定的路径,需要格外注意,不要出错。
将SD卡插在嵌入式Linux平台上,修改Boot为Pin1,Pin7高,复位芯片,打印如下:
到这一步初步完成了uboot的体验,此外uboot也支持很多指令,这些后面会了解到,按照进度会掌握。
Linux的编译
1).使用光盘资料A盘>1、例程源码>3、正点原子修改后的Uboot和Linux,将解压后的文件上传到Ubuntu到的路径下,解压即可。
2).在/usr/code/uboot下使用
tar -xvf linux-imx-4.1.15-2.1.0-g49efdaa-v1.0.tar.bz2
指令解压,解决后结果如下:
3).使用如下指令
cd arch/arm/boot/dts
vim Makefile
在400多行添加对应的设备树,如我的开发板对应:
使用:wq保存文件即可。
4).使用如下指令进行编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
执行结果如,即用于编译的.config的文件,最后执行编译指令:
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
如此即完成了编译,编译结果如下:
编译之后文件路径在
arch/arm/boot/zImage arch/arm/boot/dst/imx6ull-14x14-emmc-4.3-800x480-c.dts
将上述文件和uboot文件通过SSH传输到Windows系统,为后面使用MfgTool工具下载做准备。
文件系统的编译
1).使用光盘资料A盘>1、例程源码>6、BusyBox源码,将解压后的文件上传到Ubuntu到的路径下,解压即可。
2).在/usr/code/uboot下使用
tar -xvf busybox-1.29.0.tar.bz2
指令解压,解压后结果如下:
3). 修改Makefile文件,最好使用绝对路径,如果找不编译器,可通过指令echo $PATH查看当前路径是否添加,支持中文字符详细参考文档38.2.2说明。
164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 190 ARCH ?= arm
4). 使用指令进行将链接编译到指定的路径
make install CONFIG_PREFIX=/usr/code/rootfs/nfs/
5). 在编译后的路径添加文件夹,并将支持动态库添加到路径下,参考文档38.2.3说明。
6). 参考38.2.4章节,创建/etc/init.d/rcS,内容
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH runlevel mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
创建文件etc/fstab,内容
#<system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0
创建etc/inittab文件,内容
#etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a
然后使用打包指令
tar -vcjf rootfs.tar.bz2 *
获取打包文件: rootfs.tar.bz2
MgTool工具下载更新
完成上述所有流程,我们就获得了最基础的底层应用结构,包含:
Uboot -- uboot.bin(重命名为imx6ull-14x14-nand-4.3-800x480-c.bin)
Kernel -- zImage, imx6ull-14x14-emmc-4.3-800x480-c.dts
文件系统 -- rootfs.tar.bz2
有了上述软件,就可以进行后续的代码下载,参考39.5章节说明:5.将boot置为Pin1, Pin5, Pin8为高,复位即可发现系统已经替换成我们编译的最小文件系统。
总结
至此,关于项目方案实现的第一步就已经完成,在本节中,体验了编译uboot,内核和文件系统,并进行了烧录,但如果对比本节的内容和参考文档的相关说明,就会发现我省略了很多内容,举几个例子,官方的Uboot是如何变成原子的修改后的Uboot,如何通过make menuconfig配置符合需求应用,这部分重要吗,事实上很重要,未来的很多时候都要和这些知识打交道,但当你当刚踏入嵌入式学习的时候,去深入钻研,一方面没有概念,难以建立清晰的脉络认知,另一方面这部分是基石,知识繁杂且耗时,学习就很难快速给予反馈,这是最大的障碍,所以初步以运用为主,体验下流程即可,重心还是快速进入应用和驱动开发,等真正需要时(如将模块编入内核),就需要去深入掌握,但那时肯定有了足够的嵌入式Linux开发经验,也更容易去理解,事倍功半。