写在前面
本文是根据海思3531DV100平台相关SDK文档进行学习和记录。
环境搭建
虚拟机环境为Ubuntu 20.04
安装交叉编译器
本文使用arm-hisiv600版本编译器。
- 拷贝编译器安装包至开发环境:
cp arm-hisiv600-linux.tgz /your/path - 解压安装包:
tar xvf arm-hisiv600-linux.tgz, 得到文件:arm-hisiv600-linux.install arm-hisiv600-linux.tar.bz2 runtime_glibc.tgz - 运行安装脚本:
sudo sh arm-hisiv600-linux.install。注:此步需要管理员权限!!
- 检查,输入arm后使用tab补全,看是否有如下输出,没有则需要重新安装或导入环境变量:
export PATH="/opt/hisi-linux/x86-arm/arm-hisiv600-linux/target/bin:$PATH"可加入到/etc/profile文件中。
- 验证版本:
arm-hisiv600-linux-gcc -v,输出Using built-in specs. COLLECT_GCC=arm-hisiv600-linux-gcc COLLECT_LTO_WRAPPER=/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/../libexec/gcc/arm-hisiv600-linux-gnueabi/4.9.4/lto-wrapper Target: arm-hisiv600-linux-gnueabi Configured with: ../gcc-linaro-4.9-2015.06/configure --host=x86_64-linux-gnu --build=x86_64-linux-gnu --target=arm-hisiv600-linux-gnueabi --prefix=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/arm-hisiv600-linux --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch=armv5te --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --enable-nls --enable-clocale=gnu --enable-extra-hisi-multilibs --with-sysroot=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/arm-hisiv600-linux/target --with-build-sysroot=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/arm-hisiv600-linux/target --with-gmp=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-mpfr=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-mpc=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-ppl=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-cloog=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-libelf=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --enable-libgomp --disable-libitm --enable-poison-system-directories --with-libelf=/home/sying/toolchain_ljhui/gcc4_9/arm-hisiv600-linux/gcc-glibc/install/host_lib --with-pkgversion=Hisilicon_v600_20180525 --with-bugurl=http://www.hisilicon.com/cn/service/claim.html Thread model: posix gcc version 4.9.4 20150629 (prerelease) (Hisilicon_v600_20180525)若输出:
arm-hisiv600-linux-gcc: No such file or directory则需要安装32位环境兼容工具:sudo apt-get install lib32z1-dev
6.至此,交叉编译器安装全部完成
内核编译
官方文档中使用3.18.20版本,内核,点击即可直接下载:点我下载3.18.20版本内核源码
- 将下载的linux-3.18.20.tar.gz拷贝到SDK中的 osdrv/opensource/kernel目录中.
- 进入目录:
cd osdrv/opensource/kernel - 解压内核源码压缩包:
tar -axf linux-3.18.20.tar.gz - 修改目录名:
mv linux-3.18.20 linux-3.18.y - 进入内核源码目录:
cd linux-3.18.y - 打补丁:
patch -p1 < ../hi3xx_for_linux_v3.18.y.patch - 拷贝配置:
cp arch/arm/configs/hi3531d_nand_defconfig .config - 进行内核配置:
make ARCH=arm CROSS_COMPILE=arm-hisiv600-linux- menuconfig - 在出现的图文字面选择需要的模块,完成后保存退出
- 编译内核:
make ARCH=arm CROSS_COMPILE=arm-hisiv600-linux- uImage
编译成功截图:
若出现报错:
解决方案:sudo apt-get install u-boot-tools
制作根文件系统
使用busybox制作根文件系统。
busybox源码路径:Hi3531D_SDK_V1.0.3.0/package/osdrv/opensource/busybox
- 解压源码:
tar xvf busybox-1.20.2.tgz - 进入目录:
cd busybox-1.20.2 - 进行配置:
cp config_v600_softfp_neon .config - 配置busybox:
make menuconfig,打开大文件支持和静态编译,路径:Busybox Settings ---> Build Options
-
第一个选项选择是否把busybox编译成静态链接的可执行文件。如果选择该选项,编译出来的busybox就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的busybox,体积较小,但需要动态库的支持。
-
第二个选项是用于选择SDK推荐的交叉编译器,配置好后保存并退出。
-
编译安装busybox:
make && make install,生成的文件都在_install目录
-
直接在
_install目录制作根文件系统://创建必要路径 # mkdir etc dev mnt # mkdir -p proc sys tmp mnt # mkdir -p etc/init.d/ //添加文件系统挂载信息 # vim etc/fstab proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 //开机脚本 # vim etc/init.d/rcS echo -e "Welcome to tinyLinux" /bin/mount -a echo -e "Remounting the root filesystem" mount -o remount,rw / mkdir -p /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s # chmod 755 etc/init.d/rcS //busybox执行的文件 # vim etc/inittab ::sysinit:/etc/init.d/rcS //开机执行脚本 ::respawn:-/bin/sh //启动后不断运行shell,然后我们可以运行命令了 ::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r # chmod 755 etc/inittab # cd dev //创建设备节点 c为字符设备 5为主设备号,1为从设备号 # mknod console c 5 1 # mknod null c 1 3 # mknod tty1 c 4 1目录结构
total 44 drwxrwxr-x 11 jeffrey jeffrey 4096 Mar 25 00:25 . drwxr-xr-x 35 jeffrey jeffrey 4096 Mar 25 00:13 .. drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:13 bin drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:31 dev drwxrwxr-x 3 jeffrey jeffrey 4096 Mar 25 00:30 etc lrwxrwxrwx 1 jeffrey jeffrey 11 Mar 25 00:13 linuxrc -> bin/busybox drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:24 mnt drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:25 proc drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:13 sbin drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:25 sys drwxrwxr-x 2 jeffrey jeffrey 4096 Mar 25 00:25 tmp drwxrwxr-x 4 jeffrey jeffrey 4096 Mar 25 00:13 usr jeffrey@ubuntu:~/hi3531d/Hi3531D_SDK_V1.0.3.0/package/osdrv/opensource/busybox/busybox-1.20.2/_install$ ls etc/ fstab init.d inittab jeffrey@ubuntu:~/hi3531d/Hi3531D_SDK_V1.0.3.0/package/osdrv/opensource/busybox/busybox-1.20.2/_install$ cat etc/fstab proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 jeffrey@ubuntu:~/hi3531d/Hi3531D_SDK_V1.0.3.0/package/osdrv/opensource/busybox/busybox-1.20.2/_install$ cat etc/inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r jeffrey@ubuntu:~/hi3531d/Hi3531D_SDK_V1.0.3.0/package/osdrv/opensource/busybox/busybox-1.20.2/_install$ cat etc/init.d/rcS echo -e "Welcome to tinyLinux" /bin/mount -a echo -e "Remounting the root filesystem" mount -o remount,rw / mkdir -p /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s -
制作文件系统镜像
嵌入式系统中常用文件系统包括有cramfs、JFFS2、NFS、initrd、yaffs2、ubifs以及squashfs。它们的特点如下:- cramfs 和 JFFS2 具有好的空间特性,很适合嵌入式产品应用。
- cramfs 与 squashfs 为只读文件系统。
- squashfs 压缩率最高。
- JFFS2 为可读写文件系统。
- NFS 文件系统适用于开发初期的调试阶段。
- ubifs 和 yaffs2 文件系统用于NAND Flash。
- initrd 采用 cramfs 文件系统,为只读。
制作yaffs2格式文件系统:
yaffs2 的优缺点如下: - 优点
− 专门针对NAND Flash,软件结构得到优化,速度快。
− 使用硬件的spare area区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。
− 采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。 - 缺点
- 没有采用压缩的文件格式。当包含的内容相同时,yaffs2镜像文件要比jffs2镜像文件大。
制作方法:
对于SPI Nand Flash:
./mkyaffs2image100 ./_install image_rootfs.yaffs2 pagesize ecctype
对于Parallel Nand Flash
./mkyaffs2image610 ./_install image_rootfs.yaffs2 pagesize ecctype
参数说明:./_install 根文件系统路路径 image_rootfs.yaffs2 制作出的文件系统名字 pagesize the page size to be converted 0 | 512 512 Bytes pagesize 1 | 2k 2K Bytes pagesize 2 | 4K 4K Bytes pagesize 3 | 8K 8K Bytes pagesize 4 | 16K 16K Bytes pagesize ecctype ECC type 0 | none no ecc 1 | 1bit used 1bit/512 ecc 2 | 4bit used 4bit/512 ecc 3 | 8bit used 8bit/512 ecc 4 | 24bit used 24bit/1k ecc 5 | 40bit used 40bit/1k ecc 6 | 64bit used 64bit/1k ecc
制作ext3格式文件系统:
- 制作一个空镜像:
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32 - 格式化镜像:
mkfs.ext3 rootfs.ext3 - 挂载:
mkdir fs && mount -o loop rootfs.ext3 ./fs - 拷贝文件:
cp -fra ./_install/* ./fs/ - 取消挂载:
umount ./fs - 打包:
gzip --best -c rootfs.ext3 > rootfs.img.gz





