1 虚拟机安装(以在win10下安装vmware station 16.0 Pro为例)
(1)点击vmware station 16.0 pro安装包,按默认方式安装该安装包
 (2)点击帮助->输入许可证密钥选项,并输入激活密钥
 (3)若出现以下提示:您无权输入许可证密钥。请使用系统管理员账户重新尝试。
 则按以下方式激活:
     a 按win + R键,并输入cmd打开命令行窗口
     b 在命令行窗口输入以下命令切换工作目录
       cd C:\Program Files (x86)\VMware\VMware Workstation\x64
     c 输入如下命令激活vmware,其中xxx为激活码
       vmware-vmx.exe --new-sn xxx
 (4)若出现以下提示:与 vmx86 驱动程序的版本不匹配: 预期为 385.0,实际为 331.0错误。
     则进入C:\Windows\System32\drivers目录,将vmx86.sys修改vmx86.zzz,即将其后缀名修改为系统无法识别的类型,然后重启系统后再删除该文件
2 Ubuntu18.04安装
(1)打开vmstation ->创建新的虚拟机 -> 指定os镜像文件,一路next安装操作系统,如ubuntu18.04
 (2)设置ubuntu的root密码
     sudo passwd
     然后输入密码,该密码即为root密码
 (3)ubuntu18.04更换国内源
     a 备份/etc/apt/sources.list文件
       sudo mv /etc/apt/sources.list/etc/apt/sourses.list.backup
     b 新建/etc/apt/sources.list文件
       sudo vi /etc/apt/sources.list
     c 输入以下内容(阿里源)
       deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
       deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
       deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
       deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
       deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
       deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
       deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
       deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
       deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
       deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
 (4)若主机ping不通虚拟机,且主机不显示vmnet8网络适配器。则可能是前一次的虚拟机卸载后,注册表未清理干净导致。可用如下方法清理注册表
     a 打开CCleaner官网,根据提示安装CCleaner清理软件
 
     b 安装完成后,双击打开CCleaner软件,找到Registry选项
 
     c 点击Scan for Issues,会出现以下problem和data信息
 
     d 点击右下角的Fix selected Issues按照提示步骤清空问题信息
 
     e 重新启动虚拟机,点击编辑 -> 虚拟网络编辑器,勾选将主机虚拟适配器连接到此网络选项
 
 (5)安装vim
     sudo apt-get install vim
 (6)设置虚拟机静态ip
     a&ensp在/etc/netplan目录下打开01-network-manager-all.yaml文件。注意:该文件名不一定与上面一样,需根据实际情况配置
     b 在该文件中设置如下内容
      # Let NetworkManager manage all      devices on this system
      network:
      version: 2
      renderer: NetworkManager
      ethernets:
      ens33:
      dhcp4: no
      addresses: [192.168.136.135/24]
      gateway4: 192.168.136.2
      nameservers:
      addresses: [192.168.1.1]
      其中:网卡名称,ip地址等需根据实际情况配置
      网关地址可查看虚拟机的 编辑 --> 虚拟网络编辑器 --> nat设置 获取
      dns地址查看 windows cmd -->ipconfig /all --> 默认网关
     c yaml语法格式
      使用缩进作为不同层次区分,且缩进只能用空格,不能用tab键。
      缩进的空格数目没有限制,但同层次的缩进空格数必须相同后面需要加空格
     d 使配置生效
       netplan apply
 (7)安装sshd
     a sudo apt-get update
     b sudo apt-get install openssh-server
     c 启动ssh服务
       sudo /etc/init.d/ssh start 或
       sudo systemctl start ssh
     d 重启ssh服务
       sudo /etc/init.d/ssh restart 或
       sudo systemctl stop ssh
     e 关闭ssh服务
       sudo /etc/init.d/ssh stop
     f 设置ssh服务为自启动
       sudo systemctl enable ssh
     g 查看ssh的启动状态
       sudo systemctl status ssh
 (8)安装samba
     a 安装samba服务器
       sudo apt-get install samba samba-common
     b 创建一个samba分享的目录
       mkdir /home/lgj/work
     c 设置目录权限
       sudo chmod 777 /home/lgj/work
     d 添加samba用户
       sudo smbpasswd -a lgj
       然后设置samba密码。其中lgj为我的用户名
     e 配置samba配置文件
       sudo vim /etc/samba/smb.conf
       添加如下内容
       [share]
       comment = share folder
       browseable = yes
       path = /home/lgj/work
       create mask = 0700
       directory mask = 0700
       valid users = lgj
       force user = lgj
       force group = lgj
       public = yes
       available = yes
       writable = yes
     f 重启samba服务器
       sudo service smbd restart
     g 在windows下映射网络驱动器
       输入:\192.168.136.135\share
       输入用户名和密码,samba挂载成功
     h 开启ufw以后,samba挂载不上问题解决(允许samba端口访问)
       sudo ufw allow 137
       sudo ufw allow 138
       sudo ufw allow 139
       sudo ufw allow 389
       sudo ufw allow 445
       sudo ufw allow 901
3 开发工具安装
(1)make安装
     sudo apt-get install make
 (2)gcc安装
     sudo apt-get install gcc
     sudo apt-get install g++
 (3)aarch64交叉工具链安装
     a 下载
       wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
     b 解压
       xz -d gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
       tar xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar
 (4)编译内核时缺少库问题解决
     a /bin/sh: 1: flex: not found问题
       sudo apt-get install flex
     b /bin/sh: 1: bison: not found
       sudo apt-get install bison
     c fatal error: openssl/bio.h: No such file or directory
       sudo apt-get install libssl-dev
     d <stdin>:1:10: fatal error: libelf.h: No such file or directory
       sudo apt-get install libelf-dev
4 Jenkins安装
(1)sudo update
 (2)安装jdk-8
       sudo apt install openjdk-8-jdk
 (3)下载jenkins公钥
       wget https://pkg.jenkins.io/debian/jenkins.io.key
 (4)使用apt-key将公钥添加到系统密钥中
       sudo apt-key add jenkins.io.key
 (5)将jenkins存储库添加到来源列表中
       打开/etc/apt/sources.list文件,将下列内容添加到末尾:
       deb https://pkg.jenkins.io/debian-stable binary/
 (6)安装jenkins
       sudo apt update
       sudo apt install jenkins
 (7)如果jenkins被正确安装,则会自动启动,可通过下列命令验证其是否已启动
       sudo systemctl status jenkins
 (8)默认情况下,jenkins仅允许本地访问服务器,因此需配置ufw防火墙以允许传入连接到jenkins服务器的端口。jenkins默认在8080端口工作,必须要允许ufw防火墙访问此端口
       sudo ufw allow 8080
 (9)检查ufw是否允许8080端口传入流量
       sudo ufw status
 (10)通过http访问jenkins(端口转发)
     a nat方式需要设置端口转发
       在虚拟机–>编辑–>虚拟网络编辑器–> nat设置中添加端口转发
     b 其中192.168.136.135为虚拟机ip,8080为jenkins端口,9080为主机端口。
     c 访问jenkins,其中192.168.1.4为主机ip
       https://192.168.1.4:9080
 (11)如果防火墙处理关闭状态。可用下列命令开启
       sudo ufw allow OpenSSH
       sudo ufw enable
 (12)获取并输入jenkins密码
       sudo cat /var/lib/jenkins/secrets/initialAdminPassword
       da10519418c2446ba1dfb89b1152c450
 (13)安装插件
 (14)创建管理员账户
       设置用户名和密码
5 代码下载及编译
5.1 ATF代码
(1)下载atf
     git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
 (2)编译atf
     cd trusted-firmware-a
     export ARCH=arm64
     export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
     make PLAT=qemu BL33=yyy/u-boot/u-boot.bin all fip DEBUG=1
     以上编译方式将编译可在qemu平台运行的atf镜像,并且在启动过程中会加载yyy/u-boot/u-boot.bin作为uboot镜像。
 (3)由于atf的qemu配置中默认使用GICv2,若要配置系统使用GICv3,则需修改plat/qemu/qemu/platform.mk中的如下行:
     QEMU_USE_GIC_DRIVER := QEMU_GICV2 修改为:
     QEMU_USE_GIC_DRIVER := QEMU_GICV3
5.2 Uboot代码
(1)下载uboot
     git clone https://source.denx.de/u-boot/u-boot.git
 (2)编译uboot
     export ARCH=arm64
     export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
     make qemu_arm64_defconfig
     make
     以上编译方式将编译可在qemu平台运行的atf镜像
 (3)若uboot需用semihosting方式加载内核和dtb,则在configs/qemu_arm64_defconfig中添加以下配置:
     CONFIG_SEMIHOSTING=y
5.3 kernel代码
(1)下载kernel
     a 进入内核官网
       https://www.kernel.org/
     b 选择一个希望下载的分支,点击browse,然后点击summary
     c 拉到底,复制git地址xxx
     d 下载代码
       git clone xxx
 (2)编译内核
     export ARCH=arm64
     export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
     make defconfig
     make
     以上编译方式编译的内核可在qemu环境下运行
5.4 rootfs代码
(1)我们选择buildroot来编译我们的rootfs
 (2)buildroot下载
     从以下地址下载buildroot并解压
     https://buildroot.org/download.html
     tar zxvf buildroot-2021.05.1.tar.gz
     或者采用git下载
     git clone git://git.buildroot.net/buildroot
 (3)buildroot配置
     a 若出现Unable to find the ncurses libraries or the …问题,则安装以下lib
       sudo apt-get install libncurses5-dev libncursesw5-dev
 (4)buildroot具体配置方式可参考以下链接
     buildroot使用详解
5.5 qemu代码
(1)源码下载
     git clone https://gitlab.com/qemu-project/qemu.git
     cd qemu
     git submodule init
     git submodule update --recursive
 (2)相关库安装
     sudo apt-get install libcap-dev (–enable-virtfs需要)
 (3)编译错误解决
     a ERROR: Cannot find Ninja 错误解决
       sudo apt-get install re2c
       git clone https://github.com/ninja-build/ninja.git
       ./configure.py --bootstrap
       sudo cp ./ninja /usr/bin/
     b ERROR: meson setup failed问题解决
        sudo apt-get install python3
        python3-pip ninja-build
        切换到python3
        sudo rm /usr/bin/python3
        sudo ln -s /usr/bin/python3.6 /usr/bin/python3
        安装meson
        pip3 install --user meson
     c RROR: Problem encountered: virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel 问题解决
       从以下网站下载libcap-ng包:
       https://launchpad.net/ubuntu/+source/libcap-ng/0.7.7-3.1
       cd libcap-ng-0.7.7
       ./autogen.sh
       ./configure
       make
       sudo make install
 (4)编译qemu
       ./configure --target-list= aarch64-linux-user, aarch64-softmmu --enable-virtfs --enable-debug
       make
       sudo make install
6 qemu运行
6.1 qemu运行kernel示例
(1)主机安装brctl和tunctl工具
     sudo apt install uml-utilities
     sudo apt install bridge-utils
 (2)主机通过桥接方式配置tap接口,该接口可用于虚拟机与主机之间的网络通信
     brctl addbr br0
     ip addr flush dev ens33
     brctl addif br0 ens33
     tunctl -t tap0 -u whoami
     brctl addif br0 tap0
     ifconfig ens33 up
     ifconfig tap0 up
     ifconfig br0 up
     ifconfig ens33 192.168.136.135
     ifconfig br0 192.168.136.110
     ifconfig tap0 192.168.136.115
     其中ip地址需要根据实际情况配置。
     虚拟机启动后可在模拟目标板上使用以下命令配置ip:
     sudo ifconfig eth0 192.168.136.226
 (2)启动qemu
     cur_time=$(date +%Y-%m-%d-%H-%M-%S)
    qemu-system-aarch64 
       -M virt,gic_version=3
       -cpu cortex-a53 
       -smp 2 
       -m 2048M 
       -kernel xxx/kernel/arch/arm64/boot/Image 
       -drive file=xxx/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw 
       -device virtio-blk-device,drive=blk1 
       -append "console=ttyAMA0 root=/dev/vda" 
       -netdev tap,id=net0,ifname=tap0,script=no,downscript=no 
       -device virtio-net-device,netdev=net0 
       -fsdev local,security_model=mapped-xattr,path=zzz/share,id=fsdev0 
       -device virtio-9p-device,fsdev=fsdev0,mount_tag=virtshare 
       -dtb xxx/kernel/arch/arm64/boot/dts/qemu/test-board.dtb 
       -nographic -d guest_errors,unimp -D log/$cur_time \
    其中:
     a -d guest_errors,unimp -D log/$cur_time用于将qemu的log导出到文件log/$cur_time中。
     b -dtb用于指定内核启动时使用的dtb,该参数可以不指定,此时qemu将会使用指定machine默认创建的dtb。
     c -fsdev用于虚拟机与host之间共享目录,即主机上的zzz/share目录可以与虚拟机共享,虚拟机启动后通过以下mount命令挂载该目录即可:
       mount -t 9p -o trans=virtio /mnt/host virtshare
       其中挂载点可以通过以下sysfs路径查看:
       /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag
6.2 qem启动uboot示例
    qemu-system-aarch64 
       -M virt 
       -cpu cortex-a53 
       -smp 2 
       -m 2048M 
       -kernel /home/lgj/work/u-boot/u-boot 
       -nographic
6.3 qemu通过atf启动kernel示例
(1)按第五章的方式分别编译atf、uboot和kernel
 (2)按以下命令启动qemu
     cur_time=$(date +%Y-%m-%d-%H-%M-%S)
     qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3 
       -cpu cortex-a53 
       -smp 2 -m 2048 
       -d guest_errors,unimp -D log/$cur_time 
       -bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin 
       -drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw 
       -device virtio-blk-device,drive=blk1 
       -semihosting-config enable=on,target=native
     该命令执行后,qemu会从atf的bl1.bin开始执行,并依次启动其后的bl2、bl31和uboot
 (3)由于uboot添加了对semihosting的支持,因此在uboot命令行中执行以下命令,通过semihosting方式从host上加载kernel和dtb
     smhload xxx/kernel/arch/arm64/boot/Image 0x40000000
     smhload xxx/kernel/arch/arm64/boot/dts/qemu/test-board-smc.dtb 0x43000000
 (4)设置bootargs并启动内核
     setenv bootargs " console=ttyAMA0 root=/dev/vda"
     booti 0x40000000 - 0x43000000
6.4 退出qemu
先按住Ctrl + A,松开后再输入X
7 qemu通过gdb调试目标镜像
(1)在启动qemu时添加-s –S选项,如:
     qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3 
       -cpu cortex-a53 
       -smp 2 -m 2048 
       -d guest_errors,unimp -D log/$cur_time 
       -bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin 
       -drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
       -device virtio-blk-device,drive=blk1 
       -semihosting-config enable=on,target=native
     其中:
     -S:表示QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令
     -s:表示在1234端口接受GDB的调试连接,其与-gdb tcp::1234参数相同
 (2)在另一窗口下通过dgb从atf的bl1开始启动
     xxx/bin/aarch64-linux-gnu-gdb yyy/trusted-firmware-a/build/qemu/debug/bl1/bl1.elf
 (3)添加uboot和kernel的符号表
     add-symbol-file /home/lgj/work/u-boot/u-boot
     add-symbol-file /home/lgj/work/linux/vmlinux
     若需要调试bl2和bl31,其符号表添加方式类似
 (4)gdb通过tcp方式attach到qemu的目标板上
     target remote localhost:1234
 (5)设置断点
 (6)开始代码执行
     c
 (7)若未设置断点,系统将会进入uboot命令行,此时可采用6.3的方式启动内核
8 qemu monitor的使用
    qemu monitor是一个qemu控制台,我们可以通过它实现与qemu或正在运行虚拟机之间的交互。在qemu monitor中我们可以实现很多功能,如查询虚拟机的状态信息,添加删除设备,更改虚拟机的运行时配置等。
 (1)进入qemu monitor
     先按住Ctrl + A,松开后再输入C
 (2)退出qemu monitor
     与进入时相同,也是先按住Ctrl + A,松开后再输入C
 (3)help命令
     其作用是用于显示qemu monitor支持的命令及其相应的用法
     示例1:显示其支持的所有命令
 
     示例2:显示特定命令的用法
 
 (4)info命令
     该命令用于显示虚拟机的状态
     示例1:显示目标系统的cpu
 
     示例2:显示所有cpu的寄存器值
 
 (5)其它命令可参考帮助信息










