VVの嵌入式(一)开发环境搭建

交叉编译系统的搭建

平台:Ubuntu32位虚拟机 目标平台:海思Hi3559V100 工欲善其事必先利其器,在进行嵌入式linux开发的时候需要搭建一个能够调试的环境,在电脑上无疑是最好最方便的了。至于虚拟机怎么搭建就不多说了,这里我用的32位的Ubuntu16.04主要是方便编译之前文章中自己写的OS 首先安装aarch64-linux-gnu工具链

apt-cache search aarch64-linux-gnu-gcc 

接下来选择一个你需要的gcc版本就可以了 刚开始的时候使用的GCC版本稍微低一点,避免出现因为版本过新导致的故障。

sudo apt-get install gcc-4.9-aarch64-linux-gnu-gcc

模拟器环境的搭建

对于一个烧录都好半个小时乃至一个小时的系统来说debug一次真的真的太心累了,直接是对人的折磨,所以虚拟机是非常有必要的,arm环境的模拟器用的qemu,还是老样子直接安装就好了。

sudo apt-get install qemu qemu-user-static

然后开始着手模拟一个base ubuntu的arm64环境 首先下载rootfs

mkdir ~/rootfs && cd ~/rootfs
wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.2-base-arm64.tar.gz
mkdir ubuntu-rootfs
tar -xvf ubuntu-base-16.04.2-base-arm64.tar.gz -C ubuntu-rootfs
cd ubuntu-rootfs
ls

把qemu的静态模拟器放到根目录下面去

cp /usr/bin/qemu-aarch64-static  usr/bin
cp -b /etc/resolv.conf etc/

写一个用来挂载分区的bash shell,内容如下:

#!/bin/bash
function mount() {
    echo "MOUNTING"
    sudo mount -t proc /proc ${2}proc
    sudo mount -t sysfs /sys ${2}sys
    sudo mount -o bind /dev ${2}dev
    sudo mount -o bind /dev/pts ${2}dev/pts		
    sudo chroot ${2}
}
function umount() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    sudo umount ${2}dev/pts
    sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mount $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umount $1 $2
else
    echo ""
    echo "第1个参数和第2个参数都是必要参数"
    echo ""
    echo "第1个参数为-m时候为挂载、为-u的时候为卸载"
    echo "第二个参数表示需要挂载的根文件目录)"
    echo ""
    echo ".eg: ch-mount -m ./workspace/rootfs/"
    echo ""
    echo 1st parameter : ${1}
    echo 2nd parameter : ${2}
fi

通过ch-mount.sh脚本chroot到arm64的文件系统下

./ch-mount.sh -m ubuntu-rootfs

这个时候就进来到虚拟机的根目录下面来了,此时arm64的文件也能执行了

(我这里是用windows去连接ubuntu linux的虚拟机的,在linux下执行也是同样的道理) 此时需要配置一下基本的工具环境

apt-get install net-tools network-manager openssh-server

注意:openssh-server工具很重要,在没有屏幕的情况下使用开发板没有ssh连接就是一摸黑

添加用户、组合密码

passwd yourusername
passwd root

你要是嫌麻烦可以直接把你的虚拟机的shadow、group、passwd三个文件直接复制到目标arm linux的/etc文件夹里面

sudo cp /etc/{shadow,group,passwd} /workspace/ubuntu-rootfs/etc

设置主机名

echo 'ubuntu.arm64' > /etc/hostname

海思的到此结束了,因为串口输出也不是这里输出的,直接跳到下一步,海思的ubuntu系统修改后面我会给出,基本上到此为止的东西只需要复制到海思的目标板上去不覆盖原有的就行了,因为海思板子是官方给的busybox的,所以整起来有点麻烦。 其他ARM64的板子继续

配置登录的串口

因为暂时未安装桌面,所以这里的配置要具体和内核中登录的串口的设备对应起来,不然对导致无法通过串口登录的问题。 在 /etc/init/ 下添加或修改ttyS0.conf

start on stopped rc or RUNLEVEL=[12345]
stop on RUNLEVEL [!12345]
respawn
exec /sbin/getty -L 115200 tty000 vt102

白板上别忘了在/etc/prifile里写

echo "Start SSH server"
/usr/bin/sshd

这里我的登录串口为tty000,因为不同板子有所差异,我ZYNQ的板子是ttyACM0.所以还是要根据板子进行调整。

制作固件

退出arm64模拟文件系统

exit
./ch-mount -u ubuntu-rootfs

这里有两种操作任选一个都可以

1.使用make_ext4fs生成可烧录的固件.ext4文件

make_ext4fs -s -l 1024M rootfs.ext4 ./rootfs

关于make_ext4fs各参数的含义

形如make_ext4fs -s -l 314572800 -a root -L linux ./rootfs_qt.img ./root

make_ext4fs [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ] [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ] [ -L <label> ] [ -f ] [ -a <android mountpoint> ] [ -z | -s ] [ -J ] <filename> [<directory>]

  • -s 就是生成ext4的S模式制作;
  • -l 314572800 是分区大小;
  • -a root 是指这个img用于Linux系统(若为-a system即表示为android系统,挂载点即是/system。使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限)。
  • ./rootfs_qt.img 表示在当前目录下生成镜像文件。
  • ./root 指定源路径。

2.使用dd指令制作空的固件容器.img文件

dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
sudo  mkfs.ext4  ubuntu-rootfs.img

将arm64文件系统内容制作到ubuntu-rootfs.img

mkdir  ubuntu-mount
sudo mount ubuntu-rootfs.img ubuntu-mount/
sudo cp -rfp ubuntu-rootfs/*  ubuntu-mount/
sudo umount ubuntu-mount/
e2fsck -p -f ubuntu-rootfs.img
resize2fs -M ubuntu-rootfs.img

打开你的板子不出意外远程ssh也可以连接了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券