ft-2000+/64 系统软件开发指南 v1 - phytiumphytium.com.cn/uploads/ft-2000+64sv1.1.pdf ·...

30
FT-2000 0+/64 系统软件开发指 V1.1天津飞腾信息技术有限公司 二零一九年五月 指南

Upload: others

Post on 30-Mar-2020

336 views

Category:

Documents


1 download

TRANSCRIPT

FT-2000+/64

天津飞腾信息技术有限公司

2000+/64 系统软件开发指南

(V1.1)

天津飞腾信息技术有限公司

二零一九年五月

系统软件开发指南

版本历史

版本号 作者 参与者 发布日期 备注

1.0 售前解决方案部 2019.03.04 初稿

1.1 售前解决方案部 2019.03.21 增加了 Uboot 移植内容

版权所有© 天津飞腾信息技术有限公司 2019。

此文档用于指导用户的相关应用和开发工作。天津飞腾信息技术有限公司对此文

档内容拥有版权,并受法律保护。

2

目 录

1 编写目的 ........................................................................................................................................... 1

2 环境和工具 ....................................................................................................................................... 1

3 飞腾 FT-2000+系统软件框架 .......................................................................................................... 1

4 U-BOOT 移植 .................................................................................................................................... 2

4.1 代码补丁说明 .............................................................................................................................................. 2

4.2 代码分布 ...................................................................................................................................................... 2

4.3 补丁主要修改点 .......................................................................................................................................... 2

4.4 DDR 内存划分 .............................................................................................................................................. 3

4.5 u-boot 编译 ................................................................................................................................................... 4

4.6 u-boot 启动说明 ........................................................................................................................................... 4

4.7 打包固件 ...................................................................................................................................................... 4

4.8 烧录固件 ...................................................................................................................................................... 5

5 内核移植 ........................................................................................................................................... 5

5.1 内核编译环境搭建 ...................................................................................................................................... 5

5.2 内核修改 ...................................................................................................................................................... 5

5.3 内核配置 ...................................................................................................................................................... 6

5.4 内核编译 ...................................................................................................................................................... 9

6 CENTOS 7 移植 ................................................................................................................................ 9

6.1 下载 .............................................................................................................................................................. 9

6.2 提取 rootfs ................................................................................................................................................... 9

6.3 系统盘制作 .................................................................................................................................................. 9

6.4 系统配置 .................................................................................................................................................... 10

7 UBUNTU18.04 移植 ........................................................................................................................ 10

7.1 下载 ............................................................................................................................................................. 10

7.2 提取 rootfs ................................................................................................................................................. 10

7.3 系统盘制作 ................................................................................................................................................ 10

7.4 联网安装各种软件包 ................................................................................................................................ 11

8 KVM 虚拟机的搭建 ........................................................................................................................ 11

8.1 KVM 虚拟机简介 ...................................................................................................................................... 11

8.2 KVM 环境搭建 .......................................................................................................................................... 13

8.3 内核相关配置选项 .................................................................................................................................... 15

8.4 创建虚拟机 ................................................................................................................................................ 17

9 交叉编译环境搭建 ......................................................................................................................... 20

10 设备树参考 ................................................................................................................................... 21

11 附录 ............................................................................................................................................... 27

1

1 编写目的

本文基于本地编译环境或交叉编译环境,给出了在飞腾 FT-2000+/64 服务器上基于给定 Linux 内核构建 CentOS 或 Ubuntu

操作系统的安装过程。涉及到 uboot 移植、内核补丁说明、内核编译、设备树编译、操作系统移植等重点环节。在此基础上,

给出了 KVM 虚拟机的启动和配置过程。后续会继续完善基础软件的搭建和配置说明。

2 环境和工具

飞腾提供两种编译环境:

(1) 提供本地编译环境。可在通用飞腾平台台式机或服务器上进行,一般为麒麟 OS。

(2) 提供交叉编译环境。可基于通用 X86 平台 +VMware Workstation14+Ubuntu16.04.6 进行( gcc 工具为

aarch64-linux-gnu-gcc,版本为 5.4.0 20160609)。(交叉编译环境搭建详见第 9 章)

硬件上,准备硬盘一块,可通过挂载从盘的方式,利用 fdisk 或者 Ubuntu 的 Gparted 进行分区,硬盘至少分 2 块主分区,

第 1 个分区存放内核文件,设备树文件(放在 dtb 目录下);第 2 个分区存放文件系统。

注,如果挂载从盘则两块盘分别为 sdb1,sdb2。

3 飞腾 FT-2000+系统软件框架

基于 Phytium Base Firmware 的系统软件栈如下图:

名词解析:

PBF: Phytium Base Firmware

PSCI: Power State Coordination Interface

PSSI: Phytium SiP Service Interface

2

SMCCC: SMC Calling Convention

SIP: Silicon Partner

MCU: Memory Controller Unit

4 U-BOOT移植

下载 uboot 源码,本次下载的版本是 u-boot-2017.09-rc4.tar.bz2 。下载网址:

http://ftp.denx.de/pub/u-boot/

4.1 代码补丁说明

飞腾 cpu 初始化代码主要在/board/phytium/ft2000plus 目录,主要做 pcie 总线扫描,跳过多扫出来的设备,设置内存空间,

获取设备 BAR 地址,DDR 大小和起始地址设置等。

补丁已打包在 pdf 附件中。

打补丁:patch -p0 < u-boot-2017.09-rc4.patch

4.2 代码分布

uboot 根目录

board/目录对应不同厂商单板

phytium/飞腾相关初始化代码,主要是主要做 PCIE 总线扫描,设置内存

空间,获取设备 BAR 地址, DDR 大小和起始地址设置

arch/对应不同 cpu 架构

arm/

cpu/

armv8/start.S 增加一行提前跳转

include/

asm/

arch-ft2000plus 增加此目录,增加 phytium_sip_svc.h

drivers/各类驱动

pci/主要修改部分是跳过多扫描的设备

include/ 头文件和板级配置文件

configs/ft2000plus.h

4.3 补丁主要修改点

路径 目的

arch/arm/Kconfig 增加 ft2000plus menconfig 菜单

board/phytium/ft2000plus/Kconfig 增加 ft2000plus menconfig 菜单

board/phytium/ft2000plus/Makefile 编译规则

board/phytium/ft2000plus/pcie pcie 扫描相关代码

board/phytium/ft2000plus/ft2000plus.c 内存相关设置

board/phytium/ft2000plus/phytium_sip_svc.c PSSI 接口调用示例

arch/arm/include/asm/arch-ft2000plus/phytium_sip_svc.h PSSI 接口调用头文件

cmd/smc_test.c 测试 PSSI 接口命令示例

3

include/configs/ft2000plus.h 飞腾相关配置宏

driver/pci/pci.c 修改 pci_skip_dev,跳过多扫描出来的 pcie 设备。

driver/pci/pci_auto_old.c

driver/pci/pci_common.c

cmd/pci.c

include/pci.h

4.4 DDR内存划分

我们先看内核设备树中的 memory0 节点:

memory@00 {

device_type = "memory";

reg = <0x0 0x0 0x0 0x80000000>;

numa-node-id = <0x0>;

};

memory@01 {

device_type = "memory";

reg = <0x0 0x80000000 0x0 0x7c000000>;

numa-node-id = <0x0>;

};

其中 memory@01 节点起始地址+长度为 0x80000000+0x7c000000 = 0xfc00000000

这个 0xfc000000 地址是固件保留的起始地址,所以从 0xfc000000 到 0xfffffff 之间这段操作系统不可见,不可用。

下面是 DDR 内存划分图:

各个内存块详细信息:

4

4.5 u-boot编译

make distclean

make ft2000plus_defconfig 生成.config

make menuconfig 修改选项

make 编译

编译完成后会在 uboot 代码根目录生成 u-boot.bin 文件

4.6 u-boot启动说明

本文根据飞腾 U-BOOT 固件对内核、设备树、根文件系统等文件的命名和存放要求进行后续工作。如果基于其他商业固

件,则要根据其他固件的说明文档进行配置。

u-boot 启动参数写在 include/configs/ft2000plus.h 中的 CONFIG_EXTRA_ENV_SETTINGS 中。

u-boot 固件的环境变量如下:(可通过串口,输入 pri 得到如下信息)

(1) 存放内核、设备树的硬盘分区须为 ext4 格式,第 1 个分区且必须包含 dtb/目录、内核 uImage 文件,initramfs(不

是必需),设备树文件放在 dtb/目录下;第 2 个分区存放文件系统;

(2) 内核文件名称为 uImage-ft2000plus;

(3) 设备树文件名称为 ft2000plus.dtb;

(4) 如有 ramdisk,名称为 initramfs.img;

(5) U-BOOT 加载内核、设备树、initramfs 地址是固定的,不需要用户修改,地址如下:

内核:0x90100000;

设备树:0x90000000;

initramfs:0x95000000。

以上参数都已经写入 U-BOOT 固件中。

4.7 打包固件

解压附件中的 uboot_package_tools.tar.gz

解压文件如下:

其中 bl1.bin 是 bootloader 启动第一阶段代码,phytium-201707.bin 是飞腾 cpu 初始化相关代码,fiptool_arm、fiptool_x86

分别是 arm64 和 x86 下用的打包工具。

将 uboot 编译生成 u-boot.bin 拷贝到此目录下

./update.sh 将会生成 fip.bin

5

./theone 将会生成 atf-u-boot-ft2000plus.bin

这个 atf-u-boot-ft2000plus.bin 就是我们要烧录 spiflash 中的固件。

4.8 烧录固件

烧录固件软件暂时只有 windows 版本的。我们使用的是下面这款软件,一般购买 spiflash 烧录器商家会提供软件。

烧录完成后安装好 spi flash 重启系统。

5 内核移植

我们选用的是当前支持到 2023 年的内核版本 linux4.9.x。内核源码可以在 linux 官网下载:

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/

我们选用的是 linux-4.9.150。

5.1 内核编译环境搭建

我们现在默认都是在飞腾 ft1500a+kylin 系统开发环境上进行开发,下面是内核编译需要安装的一些工具:

安装 libncurse:sudo apt-get install libncurses5-dev

编译 uImage 需要 mkimage 命令:sudo apt-get install u-boot-tools

安装 gcc: sudo apt-get install gcc

5.2 内核修改

修改 uImage 加载地址,现在的固件需要修改 uImage 加载地址为 0x80000,修改 arch/arm64/boot/Makefile,修改

arch/arm64/Makefile 编译可生成 uImage,在目录 arch/arm64/boot 下。

6

在 linux-4.9.150/arch/arm64/boot/dts/

目录下创建 phytium 目录,修改

/linux-4.9.150/arch/arm64/boot/dts/目录下的 Makefile,在其中添加

dts-dirs +=phytium

将设备树源文件 ft2000plus.dts 放在

linux-4.9.150/arch/arm64/boot/dts/phytium/目录下,在

linux-4.9.150/arch/arm64/boot/dts/phytium/创建 Makefile。Makefile 的内容如下图所示。

关于设备树的说明详见第 8 章。

5.3 内核配置

make menuconfig 进行内核配置

内核选项有许多,在这里我们只选取对性能有较大影响和重要的选项讲。

General setup------>

Support for paging of anonymous memory (swap)

这个选项是支持内存页交换机制,可以在内存不足时将内容交换到磁盘。选上。

General setup------>

System V IPC

这个是支持 system v 进程间通信,选上。

General setup------>

POSIX Message Queues

支持 POSIX 消息队列,选上。

General setup------>

Memory placement aware NUMA scheduler

在 NUMA(Non-Uniform Memory Access Architecture)系统上自动启用进程/内存均衡,选上。

General setup------>

Automatically enable NUMA aware memory/task placement

允许自动根据 NUMA 系统的节点分布状况进行进程/内存均衡,选上。

General setup------>

Control Group support

7

Cgroup(Control Group)是一种进程管理机制,可以针对一组进程进行系统资源的分配和管理,可用于 Cpusets, CFS(完全公

平调度器), 内存管理等子系统,比如现在流行的 docker 容器就是依赖它来管理进程。此外, systemd 也依赖于它,更多

细节可以参考内核的"Documentation/cgroups/cgroups.txt"文件 。

General setup------>

Namespaces support

命名空间支持.用于支持基于容器的轻量级虚拟化技术(比如 LXC),选上。

General setup------>

Optimize very unlikely/likely branches

内核分支优化, gcc 编译时会根据 likely/unlikely 宏优化 cpu 执行顺序,提高 cpu 执行效率。选上。

Kernel Feature------->

Page size----->

Virtual address space size--->

在这里我们推荐选的是 4k pagesize 和 48 bit 虚地址。

Kernel Feature------->

Multi-core scheduler support

针对多核 CPU 进行调度策略优化,选上。

Kernel Feature------->

(64) Maximum number of CPUs (2-4096)

cpu 的核心数,ft2000plus 最多 64 个。

Kernel Feature------->

[*] Numa Memory Allocation and Scheduler Support

支持 numa 非一致性内存访问,选上。

Kernel Feature------->

(8) Maximum NUMA Nodes (as a power of 2)

ft2000plus NUMA 节点数为8。

Kernel Feature------->

Preemption Model (No Forced Preemption (Server)) --->

ft2000plus 主要做服务器,选 server,禁止内核抢占,这是 Linux 的传统模式,可以得到最大的吞吐量,适合服务器和科学计

算环境

Kernel Feature------->

Timer frequency (100 HZ) --->

内核定时器时钟频率,选 100Hz 比 250Hz 定时器中断频率降低,可以稍微提高性能。

Kernel Feature------->

Memory model (Sparse Memory) --->

内存模型,现在基本上都是这个 sparse。

Kernel Feature------->

Sparse Memory virtual memmap 选上。

Allow for balloon memory compaction/migration 选上,内存不足时有用。

Enable KSM for page merging 选上,kvm 虚拟机时有用,可以合并进程内存。

Transparent Hugepage Support 选上,透明大页,有时提升性能时有用。

Enable the block layer --->

IO Schedulers --->

8

CFQ I/O scheduler

Default I/O scheduler (CFQ) --->

I/O 调度算法,选 CFQ 公平调度算法,对性能有一定提升。

Bus support--->

[*] PCI support

-*- Message Signaled Interrupts (MSI and MSI-X)

PCI 总线及 MSI 选上

[*] Networking support --->

Networking options --->

<M> 802.1d Ethernet Bridging

桥接选项,kvm 虚拟机桥接时有用,其他网络协议选项根据需要自行添加。

Device Drivers --->

Block devices ---> 块设备驱动,选上。

Serial ATA and Parallel ATA drivers (libata)

[*] Verbose ATA error reporting

[*] SATA Port Multiplier support

<*> AHCI SATA support

sata 驱动,选上

Network device support --->

Ethernet driver support --->

Intel devices

Intel(R) PRO/1000 Gigabit Ethernet support

Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support

Intel(R) 82575/82576 PCI-Express Gigabit Ethernet support

英特尔千兆网卡驱动选上。

GPIO Support ---> gpio 驱动,选上。

USB support --->

<M> Support for Host-side USB

<M> xHCI HCD (USB 3.0) support

<M> Generic xHCI driver for a platform device

<M> USB Mass Storage support

<M> USB Wireless Device Management support

<M> USB Attached SCSI

Real Time Clock --->

Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025, ISL12057

HWMON support for rtc-ds1307

Century bit support for rtc-ds1307

rtc 驱动,选上。

Graphics support --->

<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->

<M> ATI Radeon

9

Console display driver support --->

-*- Framebuffer Console support 注意,字符界面要选上这个选项。

5.4 内核编译

内核编译:make -j4,4 是代表 4 线编译,如果 64 核可以 64 线编译,make 可以一次性编译内核、设备树和模块。

若单独编译内核 uImage:make uImage -j4;

若单独编译设备树:make dtbs;

编译好的 uImage 在 arch/arm64/boot 目录下,拷贝到制作好的系统盘中的/dev/sda1 中,改名字为 uImage-ft2000plus;

编译好的 dtb 文件在 arch/arm64/boot/dts/phytium/目录下,拷贝 ft2000plus.dtb 到/dev/sda1 中的 dtb 目录下;

内核模块:make modules_install,在/lib/modules 下会生成 4.9.150 目录,拷贝该目录到/dev/sda2 中的根文件系统中

/lib/modules 目录下。

6 CentOS 7移植

6.1 下载

本次移植只是做到 CentOS7 字符界面,图形界面未移植。

下载 centos7-aarch,网址:

http://mirror.xtom.com.hk/centos-altarch/7.6.1810/isos/aarch64/

下载 everything 或者 minimal 都可以,不过 everyting 包含的安装包多,所以建议下载 everything 镜像。

6.2 提取 rootfs

centos7 以后都是以 uefi 启动方式作为引导,所以如果是用 uboot 必须先将根文件系统提取出来。

sudo mount CentOS-7-aarch64-Everything-1804.iso /mnt

cd /mnt

其中 Packages 是软件安装包,LiveOS 是根文件系统。

由于/mnt 中是只读文件系统,将 squashfs.img 拷贝出来,解压,解压 squash 格式需要用到 unsquash 命令。

sudo apt-get install squashfs-tools

unsquashfs squashfs.img 解压。

sudo mount rootfs.img rootfs

可以看到根文件系统目录:

6.3 系统盘制作

将一个磁盘分成两个分区:sda1 sda2,将编译好的 uImage 是放在/sda1 目录,设备树是放在/sda1/dtb 目录,根文件系统

放在/sda2 目录,然后将上面提取好的根文件系统拷贝到/sda2 分区中。注意不要忘记在将生成在/lib/modules 下的 4.9.150 目录,

拷贝该目录到/sda2 中的根文件系统中/lib/modules 目录下。

在/sda2 根目录中创建 media/CentOS 目录,将根文件系统也复制一份到这里面,以备后面需要。

如果仅复制这些文件到根系统,通过 uboot 加载启动,你会发现系统根本无法启动,这是因为此 rootfs 默认启动方式为

anaconda 启动, uboot 引导进入 anaconda 模式后会直接卡死。复制目录下的所有文件到根系统目录,删除

/etc/systemd/system/default.target

创建软链接:ln -s usr/lib/systemd/system/multi-user.target etc/systemd/system/default.target。

10

这样就可以进入 centos 系统了,用户名:root,密码无。

6.4 系统配置

进入系统后,很多常用命令都没有,先将 yum 安装好。

在 media/CentOS /Packages 目录下复制 yum 相关的四个 rmp 包到 rootfs 根目录,请注意一定是根目录,运行会后生成几

个目录。

yum-3.4.3-158.el7.centos.noarch.rpm、

yum-metadata-parser-1.1.4-10.el7.aarch64.rpm、

yum-plugin-fastestmirror-1.1.31-45.el7.noarch.rpm

centos-release-7-5.1804.el7.centos.a.aarch64.rpm

然后启动进入 centos 后执行:

rpm2cpio yum-3.4.3-158.el7.centos.noarch.rpm|cpio -idumv

rpm2cpio yum-metadata-parser-1.1.4-10.el7.aarch64.rpm|cpio -idumv

rpm2cpio yum-plugin-fastestmirror-1.1.31-45.el7.noarch.rpm|cpio -idumv

rpm2cpio centos-release-7-5.1804.el7.centos.a.aarch64.rpm|cpio -idumv

然后 yum -help,yum 命令已经可以使用。

修改文件/etc/yum.repos.d/CentOS-Media.repo 中所有$releasever 为 7.5.1804

修改 enable=1。

配置本地 yum 源:

cd /etc/yum.repos.d/;

mv CentOS-Base.repo CentOS-Base.repo.bak;(否则会首先从网络上下载)

修改 CentOS-Media.repo;

将/media/CentOS 目录添加到 baseurl 即可。

7 Ubuntu18.04移植

7.1下载

在 Ubuntu 官网下载 ubuntu-18.04.1-server-arm64.iso 镜像,网址:

https://www.ubuntu.com/download/server/arm

7.2 提取 rootfs

这个镜像是用 uefi 启动安装,如果我们采用 uboot 方式启动,需要将 rootfs 提取出来:

mount ubuntu-18.04.1-server-arm64.iso ubuntu

在 pool 目录下的内容为安装包;

在 install 目录下有 filesystem.squashfs,这个就是根文件系统;

unsquashfs filesystem.squashfs 解压

7.3 系统盘制作

将编译好的 uImage 是放在/sda1 目录,设备树是放在/sda1/dtb 目录,根文件系统放在/sda2 目录,然后将上面提取好的根

文件系统拷贝到/sda2 分区中。注意不要忘记在将生成在/lib/modules 下的 4.9.150 目录,拷贝该目录到/sda2 中的根文件系统中

/lib/modules 目录下。将/lib/firmware 也拷贝到/sda2 中的根文件系统中/lib 目录下。

拷贝 pool 文件夹到 sda2/home 目录,用于后面安装基本的网络控制命令,例如 ifconfig。

11

这时候启动会发现系统需要用户名和密码,我们可以自己生成密码替换:

openssl passwd -1 'xxx' > tmp

复制 tmp 中生成的密码替换/etc/shadow 中 root 后第一个和第二个冒号中间,如 root:$6$abcdefgxx1dkg:,登录用的用

户为 root,密码为刚才设置的 XXX。

7.4 联网安装各种软件包

进入/home/pool/main/n/net-tools/下找到 net-tools_1.60+git20161116.90da8a0-1ubuntu1_arm64.deb

dpkg –i net-tools_1.60+git20161116.90da8a0-1ubuntu1_arm64.deb

根据网络接入方式,配置网络连通,ifconfig 配置 IP,修改 etc/resolve.conf 配置 DNS,route add default gw 配置网关等。

修改 apt 源文件 /etc/apt/source.list,我们用的是清华大学的源,配置完后 apt-get update 更新源。

安装 vim 编辑器:apt-get install vim

安装固件(显卡固件包含在里面,必须安装):apt-get install linux-firmware(如果已拷贝,则不必安装)

安装 libncurses5-dev,内核配置 make menuconfig 时依赖的库:apt-get install libncurses5-dev

安装内核编译所需工具:apt-get install bc

安装 u-boot-tools,编译 uImage 用:apt-get install u-boot-tools

安装 gcc g++: apt-get install gcc g++

安装 gfortran: apt-get install gfortran

安装 ssh: apt-get install ssh

安装 ifupdown,自动开启网卡: apt-get install ifupdown

安装网络工具 nettools: apt-get install net-tools

如果需要安装图形界面:

apt-get install xinit gdm3 ubuntu-desktop

安装完后重启系统,这时可以进入图形界面了。有时可能会遇到鼠标和键盘无法使用情况,在内核选项中将

INPUT_EVDEV 选上即可。

这时候会提醒语言包的错误:

修改/etc/default/locale 文件,添加以下内容

LANG="en_US.UTF-8"

LANGUAGE="en_US:en"

LC_ALL="en_US.UTF-8"

执行命令 locale-gen en_US.UTF-8 即可。

这时 sudo su 还无法切换到 root 用户,在 root 登陆下修改:

chown root:root /usr/bin/sudo

chmod 4755 /usr/bin/sudo

这时在普通用户下 sudo su 就可以临时切换到 root 了。

如果出现 root ssh 无法登陆现象,在/etc/ssh/sshd_config 文件中修改 PermitRootLogin yes

重启 ssh 服务,再次登陆就可以了。

8 KVM虚拟机的搭建

8.1 KVM虚拟机简介

KVM 的全称是 Kernel Virtual Machine,是基于硬件虚拟化的全虚拟化解决方案。在 kvm 架构中,虚拟机的实现为常规

12

的 Linux 进程。需要注意的是,kvm 本身不执行任何模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务

器地址空间,向他提供模拟 I/O,并将它的显示映射回宿主的显示屏,这个模拟器就是 QEMU。

KVM 虚拟机主要有以下几个特性:

(1) 内存管理

kvm 继承了 linux 强大的内存管理功能。一个虚拟机的内存与任何其他 linux 进程对的内存一样进行存储,可以以大页面

的形式进行交换以实现更高性能,也可以以磁盘文件形式进行共享。NUMA 支持允许虚拟机有效对的访问大量内存。

(2) 存储

kvm 能使用 linux 支持的任何存储来存储虚拟机镜像,包括 IDE、SCSI 和 SATA 的本地磁盘等。kvm 还支持全局文件系

统(GFS2)等共享文件系统上的虚拟镜像,以允许虚拟机镜像等多个宿主之间共享或使用逻辑卷共享。镜像支持按需分配存储

空间,而不是提前分配整个存储空间,提高存储利用率。kvm 原生磁盘格式 QCOW2 支持快照,允许多级快照、压缩和加密。

(3) 设备驱动程序

kvm 支持混合虚拟化,其中准虚拟化的驱动程序安装在客户机操作系统中,允许虚拟机使用优化的 I/O 接口而不使用模

拟的设备,从而为网络和块设备提供高性能的 I/O。

(4) 性能和可伸缩性

KVM 继承了 linux 的性能和可伸缩性。kvm 虚拟化性能在很多方面(比如计算能力、网络带宽等)已经达到非虚拟化原生

环境的 95%以上。kvm 的扩展性也非常良好,客户机和宿主机都可以支持非常多的 cpu 数量和非常大的内存。

下图是 kvm 架构。

在这里我们先了解下 qemu,qemu-kvm,kvm,libvirt 之间的关系。

(1) qemu

qemu 是一个模拟器,它向 Guest OS 模拟 CPU 和其他硬件,Guest OS 认为自己和硬件直接打交道,其实是同 Qemu 模

拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。

(2) KVM

KVM 是 linux 内核的模块,它需要 CPU 的支持,采用硬件辅助虚拟化技术 Intel-VT,AMD-V,内存的相关如 Intel 的

EPT 和 AMD 的 RVI 技术,Guest OS 的 CPU 指令不用再经过 Qemu 转译,直接运行,大大提高了速度,KVM 通过/dev/kvm

暴露接口,用户态程序可以通过 ioctl 函数来访问这个接口, KVM 内核模块本身只能提供 CPU 和内存的虚拟化,所以它必须

结合 QEMU 才能构成一个完成的虚拟化技术,这就是下面要说的 qemu-kvm。

(3) qemu-kvm

Qemu 将 KVM 整合进来,通过 ioctl 调用/dev/kvm 接口,将有关 CPU 指令的部分交由内核模块来做。kvm 负责 cpu 虚拟

化+内存虚拟化,实现了 cpu 和内存的虚拟化,但 kvm 不能模拟其他设备。qemu 模拟 IO 设备(网卡,磁盘等),kvm 加上

qemu 之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为 qemu-kvm。

Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk,

13

virtio_net,提高设备性能。

(4) libvirt

是由 Rethat 开发的一套开源的软件工具,目标是提供一个通用和稳定的软件库来高效、安全地管理一个节点上的虚拟机,

并支持远程操作。Libvirtd 是一个 daemon 进程,可以被本地的 virsh 调用,也可以被远程的 virsh 调用,Libvirtd 调用 qemu-kvm

操作虚拟机。

8.2 KVM环境搭建

centos 安装相关软件:

yum install qemu-kvm libvirt virt-install bridge-utils AAVMF –y

AAVMF 是支持 uefi 虚拟机启动固件,一定要,否则会报 uefi 不支持错误

ubuntu 安装相关软件:

apt-get install qemu-kvm libvirt-bin virt-manager virtinst bridge-utils

AAVMF 这个固件是 aarch 支持 uefi 虚拟机启动必须的,网上未找到 ubuntu 对应包,所以我们要安装 rpm 命令和 alien

工具转换 rpm 为 deb 包。

apt-get install alien rpm

将 centos 中的 aavmf 包转换为 deb 包安装,安装包目录前面 centos 移植章节有说明。

centos 配置网桥:

vim /etc/sysconfig/network-scripts/ifcfg-enp2s0,enp2s0 是当前的网卡名字。

14

修改成以下,使用静态 IP,并设置为桥接,网桥名字为 br0。

DEVICE=enp2s0

MM_CONTROLLED=no

ONBOOT=yes

TYPE=Ethernet

BOOTPROTO=static

BRIDGE=br0

IPADDR=202.197.66.222

NETMASK=255.255.255.0

GATEWAY=202.197.66.1

NAME=System enp2s0

HWADDR=00:1b:21:62:f0:62

创建另一个 ifcfg-br0 修改为:

DEVICE=br0

TYPE=Bridge

BOOTPROTO=static

IPADDR=202.197.66.200

NETMASK=255.255.255.0

GATEWAY=202.197.66.1

ONBOOT=yes

保存退出。重启系统。

ubuntu 配置网桥:

修改/etc/network/interface

其中 enp4s0f0 是以太网卡0名

auto lo

iface lo inet loopback

auto enp4s0f0

iface enp4s0f0 inet static

address 192.168.137.22

netmask 255.255.255.0

gateway 192.168.137.1

auto br0

iface br0 inet static

address 192.168.137.33

netmask 255.255.255.0

gateway 192.168.137.1

dns-nameservers 8.8.8.8

bridge_ports enp4s0f0

bridge_stp off

bridge_fd 0

bridge_maxwait 0

在内核桥接选项选上后,重启系统可以看到 br0 网桥。

15

ifconfig 可以看到已经多了一个 br0 网桥。

8.3 内核相关配置选项

make menuconfig 进入配置界面

进入 virtualization 虚拟化选项中

进入 Networking support 配置网络协议,选定支持网络桥接

16

进入 Device Driver 中的 Network device support 选中 Network core driver support 和 Universal TUN/TAP device support。这

个主要是用于虚拟机创建虚拟网卡时使用。

虚拟化选项 virtualization 选上后,ARM_KVM_HOST 也被打开,arch/arm64/kvm 架构相关的 kvm 也会自动编译进内核。

选上 virtualization drivers 中所有选项,其中 virtio balloon 是动态调节客户机和宿主机内存分配技术,当宿主机或者客户

机内存不足时可以自动调节。

在 Block devices 中选上 virtio block driver

在 Network device support 中选上 virtio net

在 Graphics support 中选上虚拟 gpu 对的支持

在 kernel features 中选上对虚拟时钟的支持

17

选上 IOMMU Harddware Support。选上 SMMU 以及 SMMUv3,这个主要是用于 DMA 虚拟化地址重映射。

配置完成后,编译内核,编译内核请参考内核编译章节。

8.4 创建虚拟机

使用 virt-install 命令创建一个虚拟机:

virt-install

--connect qemu:///system

--virt-type kvm

--name kvm0

--ram 1024

--memballoon model=virtio

--disk path=/var/lib/libvirt/images/kvm0.img,size=8

--network bridge=br0

--nographics

--cdrom /root/ubuntu-18.04.1-server-arm64.iso

virt_blk 和 virt_net 是默认支持的,只要宿主机内核已经支持就行,命令中无需特别标明。memballoon 是用来动态调节虚

拟机中内存大小。

其中需要注意的是:

ram 表示设置的内存大小,单位 MB

size 表示磁盘大小,单位 Gb

path 一定要设 /var/lib/libvirt/images 下,也就是创建的虚拟机镜像路径,其他目录会报错。

ubuntu-18.04.1-server-arm64.iso 是在 ubuntu 官网下载的适合 arm64 服务器的安装版镜像,安装 centos 镜像也是类似,在

此不再重述。

进入安装界面:

18

按照提示一路安装下去

配置 IP 后:

配置用户名、密码:

磁盘分区后安装系统:

19

安装软件,都选上:

安装完成后进入系统:

至此一个虚拟机的搭建已经完成。

在 guest os 中 lspci 查看:

可以看到三个 virtio 设备,网卡和 scsi 以及 memory balloon。

动态调整 guest os 内存大小命令:

virsh setmem xxx 512m

注意:调整的大小不能大于初始设置的 guest os 内存大小。

下面记录了一些我经常使用的几个命令用法:

xxx 代表创建的虚拟机名称

20

打开虚拟机: virsh start xxx

关闭虚拟机: virsh shutdow xxx

主机切换到虚拟机: virsh console xxx

虚拟机切换到主机: Ctrl+]键

列出所有虚拟机: virsh list --all

暂停虚拟机: virsh suspend snale

强制停止虚拟机: virsh destroy xxx

克隆虚拟机: virt-clone -o oldxxx -n newxxx -f xxx.img

设置客户机 vcpu 数: virsh setvcpus xxx 4

设置客户机内存: virsh setmem xxx 1024m

获取域网络接口信息: virsh domiflist xxx

获取域信息: virsh dominfo xxx

9 交叉编译环境搭建

(1) 电脑配置要求

X86 电脑一台,64 位系统,内存至少 4G,硬盘至少 512GB,可上外网,因软件都是通过联网下载。

(2) 镜像下载

在网站:http://releases.ubuntu.com/下载 ubuntu-16.04.6-desktop-amd64.iso 镜像文件。

(3) 安装 Ubuntu(可安装在虚拟机上或 X86 电脑裸机上,此过程不详述)

(4) 安装成功后,虚拟机 apt 源修改

修改/etc/apt/source.list 内容为如下:

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse

(5) 软件安装

运行 apt-get update,作用是从/etc/apt/source.list 文件中定义的源中去同步包的索引文件,即运行这个命令其实并没有更

新软件,而是相当于 windows 下面的检查更新,获取的是软件的状态。

update 完成后,执行以下的命令完成软件安装。 apt-get install libncurses-dev

apt-get install u-boot-tools

apt-get install libssl-dev

apt-get install flex

apt-get install bison

apt-get install gcc-aarch64-linux-gnu

vim ~/.bashrc 文件,增加如下所示内容。

21

保存退出后,执行 source ~/.bashrc 使其生效。使用命令 aarch64-linux-gnu-gcc –v 可以看到 gcc 版本号为 gcc version

5.4.0 20160609;至此,飞腾处理器交叉编译环境搭建完毕。

10 设备树参考

(1) 设备树之多核启动

FT2000plus 多核启动采用 psci 方式,psci 指 arm 架构的一种多核启动方式,通过 smc 系统调用,由 PBF 固件中的代码完

成 CPU FUNCTION,再发信号通知其它核启动,设备树描述如下:

psci {

compatible="arm,psci-1.0","arm,psci-0.2","arm,psci";

method="smc";

cpu_suspend=<0xc4000001>;

cpu_off=<0x84000002>;

cpu_on=<0xc4000003>;

system_poweroff=<0x84000008>;

system_reset=<0x84000009>;

};

(2) 设备树之 CPU

FT2000plus 有 64 个核,系统启动初期只有 CPU0 活动,之后再由 CPU0 唤醒其它 CPU,设备树描述如下,只描述了一

个 CPU,其它 CPU 描述方式类似:

cpus{

#address-cells=<0x2>;

#size-cells=<0x0>;

cpu@4 {

device_type="cpu";

compatible="arm,armv8";

reg=<0x0 0x100>;

enable-method="psci";

numa-node-id=<0>;

22

};

};

其中 reg 属性的第一个数值的[7:0]对应 MPIDR_EL1 寄存器的[39:32],第二个数值的[23:0]对应 MPIDR_EL1 寄存器的

[23:0]。

(3) 设备树之 distance-map

该节点描述的是所有 numa 节点的相对距离,与 core 硬件设计强相关,本节点与自身的距离表示为 0xa。

distance-map {

compatible="numa-distance-map-v1";

distance-matrix=<0x00 0x00 0x0a

0x00 0x01 0x14

0x00 0x02 0x28

0x00 0x03 0x1e

0x00 0x04 0x14

0x00 0x05 0x1e

0x00 0x06 0x32

0x00 0x07 0x28>,

...,

};

(4) 设备树之 memory

该节点描述内存起始地址与长度,reg 中前两个 u32 合并成一个 64bit 数据,代表起始地址,后两个 u32 合并成一个 64bit

数据,代表长度。以上只描述了 8G 内存,其它内存描述方法一样。

memory@10 {

device_type="memory";

reg=<0x00000100 0x00000000 0x1 0x00000000>;

numa-node-id=<1>;

};

memory @11{

device_type="memory";

reg=<0x00000180 0x00000000 0x1 0x00000000>;

numa-node-id=<1>;

};

(5) 设备树之 GIC

1) 综合描述

armv8 SMP cores 架构下使用 GICv3 中断控制器,提供 4 种类型的中断。下面的简图描述了这 4 种中断的范围。

|----SPI:Shared Peripheral Interrupt-------[32,1019]

|----PPI:Private Peripheral Interrupt-------[16,31]

interrupt types-->|

|----SGI:Software Generated Interrupt----[0,15]

|----LPI:Locality-specific Peripheral Interrupt---[8192,↑]

2) GICv3

23

从上图可以看出:

SPI:先到 Distributor,然后再到 Redistributor,最后通过 CPU interface 到达 core;

PPI:不经过 Distributor,直接由 Redistributor 处理后提交给 CPUinterface 后到达 core;

SGI:由 core 写寄存器触发中断,用于各个 core 间通信;

LPI:由 ITS 根据 MSI 消息中断解析后发送给 Redistributor,之后由 CPU interface 提交给 core。

(6) 设备树之 interrupt-controller

gic:interrupt-controller@8002a000000 {

compatible="arm,gic-v3";

#interrupt-cells=<0x3>;

#address-cells=<0x2>;

#size-cells=<0x2>;

ranges;

interrupt-controller;

reg=<0x0800 0x2a000000 0 0x010000>,GICD,/*SPI 中断管理,将

中断发送给 redistributor*/

0x0800 0x2a800000 0 0x800000>,/*GICR,PPI、SGI、LPI 中

断管理,将中断发送给 cpu interface*/

0x0800 0x29c00000 0 0x010000>,/*GICC,cpu interface 传

输中断给 core*/

0x0800 0x29c10000 0 0x010000>,/*GICH,hypervisor

interface*/

0x0800 0x29c20000 0 0x010000>;/*GICV,virtual cpu

interface*/

interrupts=<0x1 0x9 0x4>; /*VGIC 中断:PPI 类型,中断号

24

9,LevelTriggered*/

(7) ITS

GICv3 都有一个或多个 Interrupt Translation Services(ITS),用于将 Message Signalled Interrupts(MSI)解析后发给

Redistributor 进而给 CPU 处理,简图如下;

外部设备可以通过写 GITS_TRANSLATER 寄存器产生一个 LPI 中断,写入寄存器的信息包括两部分,一个是 EventID,

通过 EventID 可以判断外设发送的是何种中断,另一个是 DeviceID,通过 DeviceID 可以判断是哪个设备发送的中断。ITS 解

析 LPI 发送给 Redistributor 可以分为 4 步:

a. 通过 DeviceID 在 Device Table 找到一个 entry,通过这个 entry 可以找到需要的 Interrupt Translation Table;

b. 通过 EventID 在上一步得到的 Interrupt Translation Table 中找到一个 entry,通过这个 entry 可以得到 INTID 和

Collection ID;

c. 通过上一步得到的 Collection ID 在 Collection Table 中找到一个 entry,通过这个 entry 可以得到目标 Redistributor;

d. 将中断发往目标 Redistributor。

ITS 的设备树描述如下:

its:gic-its@8002a020000 {

compatible="arm,gic-v3-its";

msi-controller;

reg=<0x0800 0x2a020000 0 0x020000>;

};

(8) 设备树之 PCI 中断

25

(9) 设备树之 PCI range

FT-2000+使用的是 Generic PCI host controller,其中 ranges 属性详细描述在 IEEE Std 1275-1994 文档中,必须包含一个

non-prefetchable memory。

(10) 设备树之 PCI root

FT-2000+处理器使用 pci-host-ecam-generic 驱动,配置、IO、MEM 空间由处理器级别的硬件设计决定,bus-range 根据需

要自定义范围,但是不能超过 0xFF。

pcie0:peu0-c0{

compatible="pci-host-ecam-generic";/*设备驱动名*/

device_type="pci";

#address_cells=<3>;

#size-cells=<2>;

#interrupt-cells=<1>;

dma-coherent;

reg=<0x800 0x40000000 0 0x10000000>;/*配置空间*/

msi-parent=<&its>;

bus-range=<0 0xff>;/*总线号范围*/

(11) 设备树之 timer

26

FT-2000+的 per-core architected timer 通过连接 GIC 中断控制器提交 per-processor 中断;其中 interrupt 属性的中断链表必须

按照 secure、non-secure、virtual、hypervisor timer 顺序写。

(12) 设备树之 clock

FT-2000+使用固定频率的时钟源,设备树很简洁。

clk100mhz{

compatible="fixed-clock";

#clock-cells=<0>;

clock-frequency=<1843200>;

clock-output-names=”sysclk_24mhz”;

(13) 设备树之 uart

FT-2000+使用 snps,dw-apb-uart 串口驱动,在设备树中需要提供驱动名、寄存器地址和范围、时钟频率、中断、寄存器间

地址偏移、寄存器长度。

(14) 设备树之 i2c

FT-2000+使用 snps,designware-i2c 驱动,中断号为 36,速率为 100K,i2c 总线接一个 RTC 芯片,芯片采用的驱动为

dallas,ds1339,设备树如下。

i2c@80028002000{

#address-cells=<0x1>;

#size-cells=<0x0>;

compatible = “snps,designware-i2c”;

reg = <0x800 0x28002000 0x0 0x1000>;

interrupts = <0x0 0x24 0x4>;

clock-frequency = <0x186a0>;

status = “ok”;

rtc@68{

27

compatible = “dallas,ds1339”;

reg = <68>;

};

};

(15) 设备树之 gpio

FT-2000+的 GPIO 采用 snps,dw-apb-gpio 驱动,共4组 gpio 引脚,每组8根,设备树如下,只列出部分,其它节点类似。

gpio@80028006000{

compatible=”snps,dw-apb-gpio”;

reg=<0x800 0x28006000 0x0 0x1000>;

#address-cells = <0x1>;

#size-cells = <0x0>;

status = “ok”;

gpio-controller@0{

compatible=”snps,dw-apb-gpio-port”;

gpio-controller;

#gpio-cells=<0x2>;

snps,nr-gpios=<0x8>;

reg=<0>;

};

gpio-controller@1{

compatible=”snps,dw-apb-gpio-port”;

gpio-controller;

#gpio-cells=<0x2>;

snps,nr-gpios=<0x8>;

reg=<1>;

};

11 附录

相关源文件已打包到此 PDF 中,找到附件链接可以看到以下四个文件。

u-boot-2017.09-rc04.patch,补丁文件;

ft2000plus_defconfig u-boot 配置文件;

ft2000plus.dts 设备树;

uboot_package_tools.tar.gz ,打包工具。

注,附件打包在 pdf 中,下载时,去掉 txt 后缀使用文件。