目录
目录README.md

🎯 Safe-Loongvisor

project-logo

本项目是我们团队从本科到研究生阶段,在操作系统内核与体系结构领域持续深耕的成果。源于对底层技术的热爱和在全国大学生计算机系统能力大赛中积累的经验,我们再次集结,致力于在国产 LoongArch平台上构建一个兼顾安全与生态的创新虚拟化方案。

在长达九个月(2025.01 - 2025.09)的开发周期中,我们投入了巨大的精力。我们累计修改代码超过2万行,涵盖hvsior(Safe-Loongvisor)、hvsior-tool(hvisor-tool++)、grub2.12(Loongstub)、NPUCore 安全内核 和 Debug_tool(LoongDebugger)五个核心代码仓库,commit提交100余次,构建内核镜像次数超1000次,开发和调试时间超1000小时

本项目不仅100%完成了赛题“基于虚拟化技术的操作系统安全增强技术”的全部要求,成功在龙芯 3A5000/3A6000 平台上构建了 Linux+NPUCore 双内核安全架构,更在此基础上额外实现了多项内容

  • 1.“黑盒”启动与引导虚拟化 (Loongstub):我们创造性地改造 grub2.12,实现了在无内核源码、设备树的条件下完整引导 Guest Linux 的“黑盒”模式,极大提升了系统的兼容性与通用性。
  • 2.高效安全跨虚拟机通信 (Safe-FastAMP):设计并实现了一套基于摘要信息的高效通信协议,为通用内核提供低开销、高效率的安全服务调用通道。
  • 3.图形化硬件调试器 (LoongDebugger):针对 LoongArch 平台开发了一款便捷的图形化硬件调试前端,将复杂的 ejtag 指令操作变为直观的图形界面交互,显著降低了底层系统软件的调试难度,是本次项目攻坚克难的利器。
  • 4.优化虚拟化核心构件:在 hvisor-LA 中实现了对中断(TI/IPI/Eiointc)、多粒度双页(奇偶)映射等关键虚拟化功能的支持和优化,大大降低了虚拟化的开销,为构建稳定可靠的虚拟化环境奠定了坚实基础。

Safe-Loongvisor 是一个面向 LoongArch64 架构、基于虚拟化技术构建的 操作系统安全增强方案,实现了 Linux + Rust-based OS 的双内核架构。其设计目标是解决 系统安全性与软件生态兼容性之间的矛盾,在保障关键安全能力的同时,保留 Linux 丰富的应用生态。

本项目提出的双内核架构,在 Safe-Loongvisor(syswonder社区 hvisor-LA的深度优化版本,包括功能完善以及性能提升) 提供的虚拟化底座(使用了LoongArch的LVZ硬件辅助虚拟化)之上,同时运行两个内存隔离、功能独立的内核:

  • 通用内核(Linux 6.14+):承载完整的Linux应用生态,具有和裸机一样的运行环境和行为(grub2.12和hvisor相互配合,能实现在没有内核源码、设备树以及ACPI源码,只有ISO镜像的条件下,支持ArchLinux和Debain在LVZ提供的虚拟化环境下使用ACPI的方式进行完整运行,本项目称这种启动方式为“黑盒”启动);
  • 安全内核(NPUcore)2024年系统能力大赛内核赛LoongArch赛道全国一等奖,基于Rust 编写,支持RISCV64和LoongArch64,具备高内存安全性,在内核态执行安全敏感任务,为通用内核Linux提供多种安全服务

两者之间通过虚拟化层提供的 内存隔离机制高效通信协议 进行交互,保障数据传输的机密性、完整性和安全性,满足包括 凭据保护、安全分级、密钥管理 等在内的典型安全需求。

具体而言,通用内核上的用户态程序可通过 hvisor-tool++(对原始虚拟机管理工具 hvisor-tool 的改进与扩展版本)向运行于 Safe-Loongvisor 中的 NPUcore 安全内核 发起服务请求(Linux 用户态程序的抽象定义为 Client),NPUcore在内核态执行安全服务后(NPUcore内核态的抽象定义为Server),通过基于 共享内存缓冲区管理 + 消息队列 实现的 Safe-FastAMP 协议(已部署在了ARMv8架构的飞腾派上,实现了Linux和seL4的跨虚拟机通信,并取得了2025年系统能力大赛功能挑战赛的全国一等奖) 能高效完成请求与响应的双向传递,并通过对Rust-based OS引入FastMode,实现了核间中断的压缩/复用,完成了Linux+NPUcore 这样的双内核架构下的轻量、高效的安全服务调用机制(完整时延控制在微秒级,跨虚拟机安全服务调用响应时延控制在纳秒级)。

👋 团队介绍

你好, 本项目团队三人均来自 西北工业大学 计算机学院,目前为在读硕士(研二,24年入学)

长期专注于体系结构、操作系统内核和虚拟化技术领域的研究与实践。

NWPU-logo

团队基本情况如下:

2025 年”中国数谷 • 华为杯”中国研究生操作系统开源创新大赛。

项目信息 内容
赛题 系统创新赛道——基于虚拟化技术的操作系统安全增强技术
队名 Safe-Loongvisor
小组成员 沈铭、郭睆、包子旭
指导老师 张羽

🔬 项目基础

从哪里讲述起呢?

一切的一切,非无本之木,非无源之水,

非一时兴起,是从本到研,持续积累的自然结果,

是无数个实验室的深夜和内核代码汪洋中的挣扎,最终汇聚成的突破契机…


(1)扎实的比赛经验与成果

全体成员本科阶段曾参加 全国大学生系统能力大赛——操作系统内核赛道,并均获 全国二等奖,在操作系统内核的设计与实现方面具备丰富的实战经验,对于LoongArch指令集和系统软件内核设计具有十分深刻的理解。

https://www.sohu.com/a/814157345_121118940

扎实的比赛经验与成果 扎实的比赛经验与成果

在刚结束的2025年的全国大学生系统能力大赛中,本团队已取得操作系统功能挑战赛道的一等奖。项目的硬件平台为飞腾派,在其部署了hvisor的AAarch版本,且同样使用了和本项目相同的通信框架,支持Linux(宏内核)和seL4(安全微内核)异构操作系统之间的跨虚拟机通信,充分证明本项目的跨虚拟机通信框架Safe-FastAMP的通用性(本项目实现了Linux和Rust-based OS之间的跨虚拟机通信)。

扎实的比赛经验与成果

官网链接:

https://os.educg.net/#/index?TYPE=2025OS_F

仓库链接:

https://gitlab.eduxiji.net/educg-group-35717-2721707/T202510699996114-4009


(2)活跃的开源社区贡献者

扎实的比赛经验与成果

沈铭与包子旭是开源社区 syswonderhvisor 项目 的贡献者:

  • 沈铭:负责 hvisor 的 LoongArch64 架构的开发与维护
  • 包子旭:负责 hvisor 的 Aarch64 飞腾开发板的支持与优化

https://www.syswonder.org/#/projects

活跃的开源社区贡献者

(3)项目代码来源与延续性

本项目中所使用的 hvisor LoongArch 分支NPUcore 内核代码 均源自三位成员本科阶段的毕业设计成果,体现了从本科到研究生阶段的技术的不断积累与持续深化。


(4)领先的技术基础与创新性

自2020年龙芯中科摒弃MIPS,推出自研指令集LoongArch以来,LoongArch指令集备受关注。近期的龙芯中科的发布会(2025.06.26)推出2K3000(遗憾地是,2K3000依然不支持LoongArch的LVZ虚拟化)/3C6000,展示了LoongArch指令集的CPU无论是在性能还是生态上,稳中向好,潜力巨大,可谓“今日长缨在手,何时缚住苍龙”。但目前关于LoongArch虚拟化的研究还十分有限,仅有的参考代码为Linux/KVM [1]。阅读KVM的源码几乎成为了开发日常。

今日长缨在手 今日长缨在手2

本项目所基于的 hvisor 是目前唯一支持 LoongArch LVZ 虚拟化扩展 的 Rust 编写的 Type-1 Hypervisor(最初也源自本科毕业设计),为Linux提供安全服务的NPUcore,来自西北工业大学,曾获 2024 年全国大学生系统能力大赛内核实现赛 LoongArch 赛道一等奖。其中,NPUcore 的 安全服务内核模块 由郭睆负责开发。本项目所基于的grub2.12也是众多LoongArch平台的OS镜像引导和启动所采用的bootloader。Linux和NPUcore进行安全服务通信的Safe-FastAMP框架吸收了OpenAMP的优点,摒弃了对应的缺点,将数据负载和摘要信息分离,摘要信息称为msg,放入消息队列中(Linux和NPUcore的一块共享内存区域),负载数据放在缓冲区中(另一块共享内存区域),简洁高效,能利用NPUcore这样的Rust-based的内存安全特性为通用内核Linux提供快速的安全服务,并通过为Rust-based OS设置Fast Mode,控制跨虚拟机安全服务调用的整体时延在微秒级,安全服务的调用响应延迟控制在纳秒级

2025.09.18,syswonder社区hvisor v0.2发布。

https://mp.weixin.qq.com/s/fxo9jAL7gfJPNqNFgK2LvQ

🗺️ 开发周期描述

milestone

📝 项目简介

(1)背景介绍

随着信息技术的快速发展,操作系统的安全性已成为保障信息系统整体安全的核心环节。现代通用操作系统在处理密码凭证、生物识别信息等敏感数据时,面临诸如恶意软件攻击、权限越权访问、内存泄露等多种安全威胁。传统的系统安全机制往往依赖特定处理器硬件支持,如 ARM TrustZone、Intel SGX 等。然而,这些方案在跨平台兼容性、部署灵活性和生态系统适配方面存在较大局限。

操作系统安全事件

近年来,基于虚拟化技术增强系统安全性的方法逐渐成为研究热点。例如,微软的Windows Virtualization-Based Security (VBS) 和Android平台的pKVM(Protected Kernel Virtual Machine)均通过虚拟化层实现对敏感资源的隔离保护。此外,内存安全语言Rust因其无空指针、无数据竞争等特性,在构建高安全性的操作系统内核方面展现出巨大潜力。

将虚拟化技术与Rust语言相结合,构建双内核架构的操作系统,已成为解决系统安全与生态兼容之间矛盾的重要方向。双内核架构通常由两个并行运行的内核组成:一个是功能丰富、生态完善的通用内核(如Linux),另一个是专注于安全服务、用Rust编写的轻量级安全内核。两者通过虚拟化层实现内存隔离与安全通信,从而在保障安全的同时兼顾系统性能与生态兼容性。


(2)目的和意义

本项目利用虚拟化技术将应用生态软件丰富的通用Linux内核和基于Rust编写的内存安全内核结合,提出了一种基于 LoongArch 架构的双内核安全架构设计与实现方案。该方案利用LoongArch提供的LVZ硬件辅助虚拟化扩展,实现了在龙芯的两款桌面级CPU(LS3A5000和LS3A6000)上同时运行两个相互隔离的操作系统内核:

  • 通用内核(Linux):负责支撑完整的Linux用户应用生态,保持良好的兼容性与功能性;
  • 安全内核(NPUcore):Rust 编写,具有内存安全性,执行敏感操作并提供安全服务(如密码管理、凭据保护、加密服务等)。

两者之间通过 Hypervisor 提供的内存隔离机制与安全通信通道(基于共享内存的缓冲区和消息队列的Safe-FastAMP)进行交互,确保数据传输的完整性和机密性。整个系统以 LoongArch 的LVZ硬件辅助虚拟化扩展为基础,实现了高效、灵活、可扩展的安全增强机制。


(3)项目完成情况

比赛方的要求(100%完成,额外的功能为基础设施以及性能优化)

目标 要求 完成情况
基于Rust安全内核和虚拟化技术完成Hypervisor适配 完成至少一种主流Hypervisor的适配(Jailhouse、Rust-Shyper等)
Hypervisor支持同时运行通用内核和安全内核 通用内核是Linux等通用操作系统内核,安全内核是基于Rust语言实现的内核
实现内存隔离和安全通信 支持通用内核与安全内核的内存隔离和安全通信,实现通用Linux内核和安全内核进行数据通信传输和控制交互
设计安全应用场景 实现安全内核为通用内核提供安全服务的演示,包括但不限于密码服务、凭据保护等
部署双内核 任选一个处理器架构平台
性能测试与优化 开展性能测试和优化,性能有明显提升的可以加分

项目的目标

项目目标

(4)整体架构

0. 使用现有hvisor-LA构建双内核的局限性

模块间的关系

1. 模块间的关系

模块间的关系

Loongstub负责引导 Safe-Loongvisor在LS3A5000/LS3A6000上启动,并能实现”黑盒“完整启动虚拟化环境下的Root Linux。

开发人员可以使用LoongDebugger直接上板进行图形化汇编级调试,借用前后端分离设计的思想,使用进程劫持的方式,将PyQT5的前端图形组件和后端的ejtag进行映射,极大地降低了调试成本和开发难度。

hvisor-tool++基于syswonder的虚拟机管理工具hvisor-tool,实现了NPUcore的动态内存分配和镜像加载的功能,并集成了基于共享内存的数据缓冲区和消息队列的管理模块。

Safe-Loongvisor(hvisor-LA深度优化后的版本)还将运行一个Rust-based OS,本项目采用NPUcore,一个支持LoongArch64架构的来自西北工业大学的宏内核操作系统。Linux负责运行通用应用,NPUcore的内核态负责运行安全应用,两者间的内存隔离通过Safe-Loongvisor提供的内存虚拟化功能完成。Linux和NPUcore之间能通过基于共享内存的跨虚拟机通信框架Safe-FastAMP进行安全通信,实现NPUcore向Linux提供安全服务调用的功能。


2. 最终的整体架构设计

运行时整体架构

基于LoongArch的LVZ的硬件辅助虚拟化扩展,本项目实现了基于虚拟化技术的操作系统安全增强技术。

项目核心依托开源项目 hvisorNPUcore,其中:hvisor [1] [2]是一个由 syswonder 社区开发的、基于 Rust 编写的轻量级 Hypervisor,支持Aarch64、RISC-V64、LoongArch64和x86_64等多种架构。

hvisor-overview

NPUcore [1] 是团队成员本科毕业设计成果,是西北工业大学用于教学的一个基于 Rust 的小型操作系统内核,目前支持RISCV64和LoongArch64,曾获2022年全国大学生系统能力大赛操作系统内核实现赛道RISC-V的一等奖以及 2024 年全国大学生系统能力大赛操作系统内核实现赛道 LoongArch 赛道一等奖

hvisor-overview

不仅如此,本项目还在GNU GRUB 2.12[1][2]的基础上,修改了其源码,设计了用于启动基于LoongArch的hypervisor的一个bootloader,称为Loongstub。基于grub2.12提供的linux和initrd指令,重写了loongvisor、root_linux和root_initrd三条指令,新增加了一个模块,摒弃了原有的基于设备树的启动方式,实现了Root Linux虚拟化环境的“黑盒” 完整启动。下面展示了grub.cfg中可以使用的新的三条指令,分别为加载hypervisor的镜像,加载root_linux和root_linux对应的rootfs。这样最大的好处就是让Root Linux的行为和裸机运行一致,便于进行diff调试,并能测出linux所有的代码执行路径,指导完善Loongvisor虚拟化功能

loongvisor /arch/boot/loong64/hvisor.bin 0x1f0000000 0x10000000 0x1e0000000 0x10000000 /arch/boot/loong64/hvisor-trap-vector.txt
root_linux /arch/boot/loong64/vmlinuz-linux archisobasedir=arch loglevel=7 verbose earlycon=uart,mmio,0x1fe001e0,115200n8 console=ttyS0,115200
root_initrd /arch/boot/loong64/initramfs-linux.img

值得注意的是本项目使用的Linux [1]内核为github上的官方代码,无需进行任何修改(也不需要编写dts文件),可以进行直接编译运行(本项目实际运行的Root-Linux版本为6.14)。采用的rootfs为syswonder社区提供的buildroot-loongarch64 [1]

从整体架构上看,Safe-Loongvisor处于Host-PLV0特权级,直接运行在具有4核(4线程/8线程)LoongArch64架构CPU[1][2],32GB内存,多种外设(串口、网卡、NVMe SSD和U盘)的桌面级开发板上,对硬件进行管理,并提供上层虚拟机(通用内核Linux和内存安全内核NPUcore)运行的虚拟化环境。

Safe-Loongvisor基于的hvisor,采用Rust编写,轻量,高效,在整体的架构中称作little kernel,提供了完整的虚拟化功能支持,包括CPU虚拟化、内存虚拟化、IO虚拟化和中断虚拟化。LoongArch提供的虚拟化环境中运行着多个虚拟机(虚拟机使用独立的一套特权寄存器GCSR),架构中称作BIG Kernel,其中zone0为Root区域,具有管理所以虚拟机的功能,通过hypercall和hvisor进行交互。从特权级角度来看,应用程序、OS和hvisor分别运行在Guest-PLV3、Guest-PLV0和Host-PLV0下,Safe-Loongvsior具有最高特权级。

little-BIG

Safe-Loongvisor的CPU虚拟化模块提供了vm的trap handler(向量表+统一地址混合式处理),对于来自Guest的hvc,将在hypercall handler中进行处理,并采用静态划分的方式给每个zone提供CPU资源;内存虚拟化实现了更加通用的页表管理,且通过为PTE添加Flexbits,充分结合第二阶段页表映射区域的连续性以及LA的MTLB的查找方法和LA的TLB重填的软件遍历特性,实现了$2^n$的页面映射,大幅度降低TLB重填的次数,采用LVZ硬件辅助虚拟化技术提供的两阶段地址翻译实现了不同虚拟机之间的地址空间的隔离;IO虚拟化提供了Virtio的跳板,实现了Non Root区域的虚拟机的Virtio前端和运行在zone0用户态的Virtio后端的交互。此外Safe-Loongvisor还支持IOMMU,能实现将PCI设备直通给Root Linux;中断虚拟化参考KVM的中断模拟和注入,实现了正确的TI/IPI/SWI和Eiointc的模拟、过滤、转发和注入。运行在zone0中的Root Linux中的外设都是直通访问的,且可以通过hvisor-tool++,使用ioctl系统调用,和运行在Root Linux中的虚拟机管理内核模块hvisor.ko进行交互,完成虚拟机的启动和关闭等管理功能。hvisor-tool++利用Root Linux的内存分配器实现了为Non Root的虚拟机进行动态内存分配以及加载,无需通过手动修改Root Linux的设备树文件中的保留区域的方式来进行静态内存区域划分。

hvisor-tool++基于syswonder社区提供的虚拟机管理工具hvisor-tool,主要改进了下面两个内容:

  1. 将Non Root VM的镜像加载至Root Linux的堆区,实现了动态内存分配
  2. 完成跨虚拟机安全服务调用的共享内存的分配和维护,为跨虚拟机安全服务调用奠定了基础
dynamic-memory

运行在通用内核Linux用户态的应用程序需向NPUcore发出安全服务的请求时,将通过hvisor-tool++创建一个Client,这个Client将完成一个从Linux到NPUcore的安全服务通信的Channel、基于共享内存的缓冲区和消息队列的初始化,然后在Linux和NPUcore提前设置好的一块共享内存中的缓冲区中申请一块内存区域,将完成此服务所需的输入数据data放入缓冲区中,并从消息队列的空闲队列中申请一个msg,将请求的安全服务id、对应数据在缓冲区中的偏移offset和长度length放入msg中,然后在用户态Guest-PLV3特权级下,直接通过hvc陷入位于Host-PLV0特权级下的Safe-Loongvisor,无需通过ioctl陷入Guest-PLV0,然后陷入Host-PLV0。Safe-Loongvisor将处理这个hvc,然后将SWI1(LoongArch中的保留的软中断)转发并注入到NPUcore中,NPUcore收到SWI后,将从共享内存中的消息队列msg queue中取出一个msg,解析msg中的service_id,以及位于缓冲区中的数据,然后批量完成安全服务。完成安全服务后,NPUcore将修改msg的deal_state字段,并修改msg queue的working_mark字段,告知Linux可以进行下一次批次的服务请求。整个过程只需要一次IPI+SWI(软中断的转发和注入)的组合和共享内存的数据的读写,即可完成NPUcore向Linux提供安全服务的需求。

下表展示了Safe-Loongvisor的具体增量:

Safe-Loongvisor-Table

Safe-Loongvisor基于hvisor,主要修改的代码列表如下:

./hvsior/src/arch/loongarch64/trap_analyzer.rs
./hviosr/src/arch/loongarch64/trap.rs
./hvisor/src/arch/loongarch64/cpu.rs
./hvisor/src/arch/loongarch64/paging.rs
./hvisor/src/arch/loongarch64/zone.rs
./hvisor/src/arch/loongarch64/entry.rs
./hvisor/src/arch/loognarch64/eiointc.rs
./hvisor/src/arch/loongarch64/s2pt.rs
./hvisor/src/arch/loongarch64/iommu.rs
./hvisor/src/arch/loongarch64/pch-pic.rs
./hvisor/src/ls3a5000_loongarch64.rs
./hvisor/src/hypercall/mod.rs
./hvisor/src/percpu.rs
./hvisor/src/zone.rs
./hvisor/src/memory/mm.rs
./hvisor/src/memory/frame.rs
./hvisor/src/memory/mod.rs
./hvisor/src/main.rs
./hvisor/src/pci/pci.rs

(5)Linux向NPUcore发送安全服务的请求和响应

safe-service-request

Linux需要进行安全服务请求时,需要借助hvisor-tool++完成这个过程,一次安全服务调用包括一次request和一次response。

进行request前需要将channel需要的缓冲区和消息队列初始化好,并且将数据放入一块分配的缓冲区中,将msg的service_id、数据的offset和length设置完毕,然后通过hvc陷入hypervisor,SWI+IPI混合中断的方式通知NPUcore处理,并进入polling状态,每个msg会有一个deal_state字段标识该msg是否被正确处理,当NPUcore处理完成后,NPUcore将修改这个字段,Linux用户态中Client将退出polling状态,并从缓冲区中取出数据(参数数据和结果数据共用同一块共享内存缓冲区,Client需要保证申请的缓冲区能足够放下请求的结果)。当服务请求结束,Client将进行内存回收,销毁Channel的所有数据结构。此外,本项目的Client支持多线程的并发请求,即一次Client的创建可以完成多次的安全服务请求,减少重复初始化和销毁的开销,多线程并发相关的技术细节见技术文档。相关代码见hivosr-tool/include/shm和hvisor/shm。一次完整安全服务的request和response过程的主要函数调用如下。更多的原理和细节可见项目文档和项目源码。

client_ops.client_init
    channel_ops.channels_init
        msg_queue_ops.init
        msg_queue_mutex_ops.mutex_is_init
    channel_ops.target_channel_get
    channel_ops.channel_is_ready
    shm_ops.shm_init

client_ops.empty_msg_get
    channel_ops.empty_msg_get
    msg_queue_ops.pop
  
general_safe_service_request
    msg_ops.msg_reset
    client_ops.shm_malloc
    copy data to shm_data
    fill msg->offset/length
    client_ops.msg_send_and_notify
    client_ops.msg_poll(msg)
    fetch data
    client_ops.shm_free

client_ops.empty_msg_put
    channel_ops.empty_msg_put
    msg_ops.msg_reset

client_ops.client_destory
    channel_ops.channels_destroy()
    shm_ops.shm_destory()

hvisor-tool主要修改了以下文件:

./hvsior-tool/tools/hvisor.c
./hvisor-tool/driver/hvsior.c
./hvisor-tool/virtio.c
./hvisor-tool/include/hvisor.h
./hvisor-tool/tools/include/service/*
./hvisor-tool/tools/include/shm/*
./hvisor-tool/tools/shm/*

(6)LoongDebugger概览

LoongDebugger的ejtag后端指令的功能描述,更多具体细节,可以参考ejtag的手册 [1] [2]

序号 指令 功能描述
cpu {x} 切换到cpu {x}
sample 采样,获取当前cpu的PC
cont 让程序继续运行
disas {pc} {count} 反汇编{addr}开始{count}个指令
mems d8/d4 {addr} {count} 读内存地址{addr} {count}个{8}字节/{4}字节
unhb {addr} 删除{addr}上的指令断点
hb {addr} 设置软件指令断点到{addr}
hbls 列出软件断点
csrs d8 {reg_idx} {count} 列出csr中序号为{reg_idx}开始{count}个寄存器的值
gcsrs d8 {reg_idx} {count} 列出gcsr中序号为{reg_idx}开始{count}个寄存器的值
cpuregs d8 {reg_idx} {count} 列出cpuregs中序号为{reg_idx}开始{count}个寄存器的值
si {count} 单步执行{count}次
awatch {addr} 0 设置{addr}读写数据断点
watch {addr} 0 设置{addr}写数据断点
rwatch {addr} 0 设置{addr}读写数据断点
q 退出

LoongDebugger的前端UI界面示意图如下:

loongdebugger-gui

下面的表格展示了目前LoongDebugger支持的调试功能,具体使用方法见项目文档。

序号 功能
查看通用寄存器、CSR和GCSR
切换调试的CPU核心
按钮设置断点
显示当前PC后续的10条汇编指令
设置自动更新显示的汇编指令
显示Safe-Loongvisor的内核栈
程序继续运行
批量设置任意地址断点
读指定区域的内存数据
设置读写数据watchpoint

LoongDebugger前端UI和后端之间的数据交互过程见下图。

loongdebugger

这个数据交互的核心是构建gdb控制脚本,通过找到la_dbg_tool进程的PID,使用gdb劫持进程,控制调试程序的进程调用do_cmd函数,根据la_dbg_tool_usb的输出重定向的文本文件增量作为输出的结果,十分tricky,具体代码细节可以查看./Debug_tool。更多技术原理、代码分析、技术细节见项目文档。代码可参见下面的文件列表:

./Debug_tool/Debugger.py
./Debug_tool/CSR_analyzer.py
./Debug_tool/Register_map.py
./Debug_tool/file_op.py
./Debug_tool/Funcsinfo.py
./Debug_tool/InputEjtag_gdb.py
./Debug_tool/start_gdb_once.sh
./Debug_tool/start_ejtag.sh

(7)Safe-Loongvisor上的Root Linux “黑盒“ 启动

这种启动方式十分巧妙,好处是不需要对Linux进行任何的修改,只需要修改grub2.12和hvisor即可实现Root Linux的执行路径和在裸机环境下通过grub引导一模一样,不需要研究其设备树/ACPI源码的具体内容,核心是构造相同的执行环境,并将hvisor的初始化“插在” grub加载和Linux启动之间,也可以称这种方法为“延迟启动“,毕竟Root Linux的实际启动过程被Safe-Loongvisor初始化推迟了,但并不影响Root Linux正确的初始化过程。grub2.12和hvisor相互配合,让Root Linux以为自己的启动上下文和裸机一样,但实际上这个上下文是grub和hvisor配合,共同构造的虚假启动上下文

这种构造启动虚假启动上下文并正确启动虚拟机的方法,本项目将其定义为“boot virtualization”。

下面的指令对比了原始grub2.12中裸机Linux的启动指令和使用Loongstub启动虚拟化环境Linux的指令。

// 裸机Linux中的grub.cfg的启动指令
linux /arch/boot/loong64/vmlinuz-linux archisobasedir=arch loglevel=7 verbose earlycon=uart,mmio,0x1fe001e0,115200n8 console=ttyS0,115200
initrd /arch/boot/loong64/initramfs-linux.img
// Loongstub中grub.cfg的启动指令
loongvisor /arch/boot/loong64/hvisor.bin 0x1f0000000 0x10000000 0x1e0000000 0x10000000 /arch/boot/loong64/hvisor-trap-vector.txt
root_linux /arch/boot/loong64/vmlinuz-linux archisobasedir=arch loglevel=7 verbose earlycon=uart,mmio,0x1fe001e0,115200n8 console=ttyS0,115200
root_initrd /arch/boot/loong64/initramfs-linux.img

下图展示了使用grub2.12启动裸机Linux和使用Loongstub启动虚拟化环境Linux的流程的对比。

loongstub

Safe-Loongvisor启动流程更加具体的细节可以参考项目文档和代码细节,具体可参考./grub2.12中的以下文件内容:

./grub-2.12/grub-core/loader/loongarch64/loongstub.c
./grub-2.12/grub-core/loader/loongarch64/loongstub_kernel.S
./grub-2.12/include/grub/loongarch64/loongstub_kernel.h
./grub-2.12/include/grub/loongarch64/loongarch.h
./grub-2.12/include/grub/loongarch64/trap_table_entry.h
./grub-2.12/include/grub/loongarch64/regdef.h

(8)跨虚拟机安全服务调用

safe-service
服务列表

Safe-FastAMP仅提供了一个跨虚拟机安全服务调用的框架,无法覆盖所有可能的安全服务。

如需添加新的服务,可以为Rust-based OS添加新的服务接口,然后为hvisor-tool++的Client支持对应的Service ID即可。

本质:将通用内核的安全服务实现转移到了Rust-based OS的内核态中。

下面我们选择了常用的算法对框架进行了验证。

(1) 基础测试服务

Service ID 服务名称 功能描述
0 NULL 不进行任何处理
1 ECHO 回显输入的字符串,用于测试通信
2 FLIP 翻转字符串中的0和1字符

(2) 加密解密服务

Service ID 服务名称 功能描述
3 AES_ENCRYPT AES加密
4 AES_DECRYPT AES解密
5 CHACHA20POLY1305_ENCRYPT ChaCha20Poly1305 加密
6 CHACHA20POLY1305_DECRYPT ChaCha20Poly1305 解密

(3) 哈希函数服务

Service ID 服务名称 功能描述
9 SHA256_HASH SHA-256哈希算法计算
10 SHA512_HASH SHA-512哈希算法计算

(4) 随机数生成服务

Service ID 服务名称 功能描述
14 RAND_STRING 生成随机字符串(支持自定义长度和字符集)
15 RAND_CHAR 生成随机字符(支持自定义字符集)

(5) 认证与授权服务

Service ID 服务名称 功能描述
16 REGISTER_USER 注册新用户(用户名|密码)
17 CHECK_PASSWORD_STRENGTH 检查密码强度(返回强度评分)
18 AUTHENTICATE 用户身份验证(用户名|密码)
19 CHECK_ACCESS 访问权限检查(用户|资源|操作)

(6) 安全管理服务

Service ID 服务名称 功能描述
20 GENERATE_API_KEY 为指定用户生成API密钥
21 VALIDATE_API_KEY 验证API密钥的有效性

(7) 系统状态服务

Service ID 服务名称 功能描述
22 GET_STATUS 获取安全系统状态报告
服务调用规范

需要多个参数的服务

  • 用户注册/认证: username|password
  • ChaCha20Poly1305加密/解密: text|key 或单独的文本
  • 访问控制检查: user|resource|operation
  • 随机数生成: min|max 或使用默认范围
  • 随机字符串: length|charset 或使用默认参数

单参数服务

  • 密码强度检查: 直接传入密码
  • API密钥生成: 传入用户名
  • API密钥验证: 传入密钥字符串
  • 哈希计算: 传入待哈希的文本

无参数服务

  • 系统状态: 传入空字符串 ""

返回值

  • 成功: 操作结果或生成的数据
  • 认证/授权服务: 返回 “true” 或 “false”
  • 密码强度: 返回数字评分
  • 错误: 返回错误信息或 “false”

安全特性

  1. 多重加密算法: 支持多种加密方式,适用于不同安全需求
  2. 强密码验证: 自动检查密码强度,确保安全性
  3. 访问控制: 基于用户、资源和操作的细粒度权限控制
  4. API密钥管理: 安全的密钥生成和验证机制
  5. 哈希完整性: 多种哈希算法确保数据完整性
  6. 安全随机数: 密码学安全的随机数生成
注意事项
  1. 缓冲区大小应足够容纳返回结果
  2. 参数使用 | 字符分隔,确保输入格式正确
  3. 密码应满足强度要求(包含大小写字母、数字、特殊字符)
依赖模块
  • safe::manager::SecurityServiceApi: 安全服务API接口
  • safeservice::amp: 异步消息处理模块
  • safe::auth: 认证授权模块
  • safe::crypto: 加密解密模块
  • safe::hash: 哈希算法模块
  • safe::random: 随机数生成模块

📚 项目文档

(1)赛方要求

(2)技术细节与代码增量

子模块 描述 文档链接
BootLoader 从grub2.12到Loongstub [link]
Debugger 从ejtag到LoongDebugger [link]
Hypervisor 从hvisor到Safe-Loongvisor [link]
VM Management 从hvisor-tool到hvisor-tool++ [link]
Inter-VM Communication OpenAMP->FastAMP->Safe-FastAMP的演变 [link]
Rust-based OS NPUcore Safe Service内核处理 [link]

🎬 演示视频

(1)启动、运行和安全服务演示

点击这个,下载决赛演示视频 [link]

(2)LoongDebugger功能演示

现场作品检查时可以演示

📁 仓库目录结构

Safe-Loongvisor/
├── README.md
├── docs/                     --- 项目文档
├── imgs/                     --- 配图
├── hvisor/                 --- Safe-Loongvisor
├── hvisor-tool/             --- hvsior-tool++
├── grub-2.12/                --- Loongstub
├── ejtag-debug/                --- ejtag 
├── Debug_tool/             --- LoongDebugger
├── NPUcore/                --- NPUcore
├── RootLinux/              --- Linux kernel source (6.14)
├── buildroot-loongarch64/     --- syswonder社区定制的Linux根文件系统
├── Test_Disk/                 --- 数据盘,测试用(包括 non root的测试文件,以及benchmark)
...

⚙️ 功能特性与创新点

  • ✅ 支持LS3A5000/LS3A6000处理器平台 + 7A2000桥片

  • 支持 LoongArch LVZ 虚拟化环境下的 Linux(6.14+) 完整启动与运行

修改了grub2.12的源码(参照linux/initrd指令,设计并实现了loongvisor/root_linux/root_initrd指令),使用十分tricky的技巧实现在Guest Mode,无需设备树源码和ACPI源码,即可让虚拟化环境中运行的 多核 Root Linux和bare-mental的Linux的执行环境一样。

  • ✅ 支持LoongArch 的中断虚拟化(TI/IPI/Eiointc)

参考最新Linux(6.14+)源码中LoongArch KVM关于TI、IPI和Eiointc的实现,实现了对定时器中断(TI)、核间中断(IPI)以及扩展中断控制(Eiointc)的虚拟化支持,确保 Guest OS 的中断响应的准确可靠,保障虚拟化环境下多核Linux的稳定运行。

  • ✅ 支持向量表/统一地址处理的混合异常/中断方式

充分发挥LA架构异常的两种模式,实现运行时切换异常/中断处理方式,加速IDLE的处理,降低虚拟化开销(达95%)。向量表的初始化和拷贝位于Loongstub,统一地址处理位于Safe-Loongvisor。

  • ✅ 支持两阶段地址翻译中的GPA->HPA地址翻译的$2^n$多粒度 双页(奇偶) 页表映射

扩展传统的1GB/2MB大页,引入Flexbits,改进TLB重填入的处理函数,无需修改原有的4级页表的映射方式,充分利用MTLB,大幅度降低TLB重填的次数以及处理时间的开销(最高达99%)。补充:Linux-LA中也没有对应的实现。即如何在TLB refill handler触发时的DA模式下动态调整MTLB填入的PS。

  • ✅ 为Safe-Loongvisor引入Fast Mode

针对Linux在初始化和正常运行过程中异常/中断处理的不同特征,通过压缩IPI+Eiointc的处理路径,降低50%的开销

  • ✅ 使用Safe-FastAMP实现了Linux和NPUcore之间的快速跨虚拟机安全服务调用

为Rust-based OS引入Fast Mode后,Safe-FastAMP能将低负载条件下整体的通信时延控制在微秒级,高负载条件下整体的通信时延迟仅与缓冲区数据填充时延相关,安全服务调用的响应时延控制在纳秒级

  • ✅ 支持IOMMU的页表映射以及PCI设备直通至Root Linux

主要参照龙蜥的Linux4.19的IOMMU驱动实现;复用了hvisor-LA原有的MMU页表映射和维护接口实现了LoongArch的IOMMU。

  • ✅ NPUcore内核能为Linux提供数十种常用安全服务,包括各类加/解密算法
  • ✅ Non Root虚拟机的动态内存分配

Non-Root Zone使用的内存与通信协议所用的共享内存由 Root Linux 分配,无需手动修改设备树中的保留区域。动态分配的共享内存一定程度上保证了跨虚拟机安全服务调用的

  • ✅ Hypervisor的内核区域保护

使用基于grub2的Loongstub在启动引导阶段,提前将Loongvisor的区域进行保留,确保Safe-Loongvisor的指令不被Root Linux访问。

  • ✅ LoongArch系统软件上板调试神器——LoongDebugger

使用进程劫持的方式,将图形化界面和ejtag的指令进行映射,完成更加复杂的调试功能,极大提高了调试效率。

实际开发过程中,许多bug和问题都是通过调试器解决发现和解决的(特别是中断和TLB重填)。

🚀 性能提升

(决赛阶段主要内容:2025年8月~9月)

基于虚拟化技术的双内核架构的性能分析与优化思路

纵向+ 横向两个维度降低双内核架构下虚拟化开销与安全服务调用的响应延迟

优化目标
  1. 设计虚拟化性能分析模块,运行不同的workload,得到Safe-Loongvisor处理不同异常类型的时间开销
performance
  1. 分析目前虚拟化的最大性能瓶颈是处理何种异常/中断

① 引入向量表+统一地址混合式处理异常/中断

opt1-1 opt1-2

② 引入FastMode+FastPath,加速处理高频异常/中断

opt2-1 opt2-2

③ 引入多粒度双页(奇偶) 页表映射,充分利用LA的MTLB,加速GVA到HPA的映射,最大程度减少TLB refill的次数

无论是设计思想,还是实验结果,均和2020年的ISCA的Tailored Page Sizes,十分类似。

opt3-1 opt3-2

Linux运行benchmark分析虚拟化开销

Single Core为单核运行,Three Cores为三核运行

Stage1:裸机Linux

Stage2:未经优化的hvisor-LA运行虚拟机Linux

Stage6:使用了①②③+IOMMU优化后的Safe-Loongvisor运行虚拟机Linux

S2 Δ(%) 表示单核下Stage2(未优化)相对于Stage1(裸机)的性能变化百分比

S6 Δ(%) 表示单核下Stage6(组合优化)相对于Stage1(裸机)的性能变化百分比

T2 Δ(%) 表示三核下Stage2(未优化)相对于Stage1(裸机)的性能变化百分比

T6 Δ(%) 表示三核下Stage6(组合优化)相对于Stage1(裸机)的性能变化百分比

S6-S2表示单核下使用了①②③+IOMMU直通优化后的性能变化

T6-T2表示三核下使用了①②③+IOMMU直通优化后的性能变化

(1)libc-bench

benchmark1 benchmark1-table

(2)unixbench

benchmark2 benchmark2-table

使用了①②③+IOMMU优化后,benchmark的跑分有明显的提升,控制总体虚拟化的开销在1%以内。

  1. 分析利用Safe-FastAMP进行跨虚拟机安全服务调用的各阶段时延,找到性能瓶颈。

④ 为安全内核引入Fast Mode,使用IPI+SWI混合中断的方式加速跨虚拟机安全服务调用的响应

opt4-1 opt4-2

为了提高跨虚拟机安全服务调用的响应速度,为Rust-based OS引入Fast Mode,将多次IPI压缩为一次,或者是重复利用IPI,使Rust-based OS激进地响应SWI,快速完成安全服务调用。

opt4-2

结论:

在Safe-FastAMP提供跨虚拟机安全服务调用框架下(启用了Fast Mode):

  1. 跨虚拟机安全服务调用响应时延控制在纳秒级(150~200ns)。
  2. 低负载条件下(低于2300字节左右,时延小于1ms),完整安全服务调用时延控制在微秒级。
  3. 高负载条件下(高于2300字节左右,时延大于1ms),完整安全服务调用时延仅于共享内存缓冲区数据填充拷贝的时延相关。

🧰 开发与运行环境

类别 名称 说明
运行环境 Board 天创者 L5A2(LS3A5000<4核4线程>+7A2000桥片)
Memory 沃存 16GBx2
NVMe SSD 瑞储NVMe SSD(256GB)
Serial USB转TTL
ejtag 调试器
电源 长城开关稳压电源 GW-425(额定功率 325W)
Board XA61200(LS3A6000<4核8线程>+7A2000桥片)
Memory Faspeed 16GBx2
NVMe SSD 西部数据 NVMe SSD (1TB)
Serial 绿联 USB R232 母头
ejtag 调试器
电源 长城开关稳压电源 GW-6000SW(额定功率 500W)
U盘 闪迪32GB USB3.0
开发系统 OS Ubuntu 22.04 LTS(64 位)
交叉编译链工具[1] loongarch64-unknown-gnu-gcc/g++/objdump…``gcc version 13.0.1 20230316 (experimental) (GCC)
Rust(NPUcore) rustc 1.80.0-nightly (f705de596 2024-04-30)host: x86_64-unknown-linux-gnurelease: 1.80.0-nightly``LLVM version: 18.1.4
Rust(hvisor) rustc 1.77.0-nightly (89e2160c4 2023-12-27)host: x86_64-unknown-linux-gnurelease: 1.77.0-nightly``LLVM version: 17.0.6
VSCode 1.97.2 丰富的插件生态
GTKTerm 1.1.1 串口工具,具体使用方法见文档
实物清单 示意图
天创者 L5A2 天创者 L5A2
XA61200_V1_1 XA61200_V1_1
沃存内存条 16GBx2 沃存内存条 16GBx2
Faspeed内存条 16GBx2 Faspeed内存条 16GBx2
瑞储NVMe SSD(256GB) 瑞储NVMe SSD(256GB)
西部数据 NVMe SSD (1TB)  西部数据 NVMe SSD (1TB)
USB转TTL USB转TTL
绿联 USB R232 母头 绿联 USB R232 母头
长城开关稳压电源 GW-425(额定功率 325W) 长城开关稳压电源 GW-425(额定功率 325W)
长城开关稳压电源 GW-6000SW(额定功率 500W) 长城开关稳压电源 GW-6000SW(额定功率 500W)
ejtag硬件调试器 ejtag硬件调试器
闪迪32GB USB3.0 闪迪32GB USB3.0

🛠️ 依赖&编译&构建

系统 : 一个空的 x86_64,Ubuntu 22.04。

1. 准备工作

1.1 安装依赖包

在开始之前,请确保你的系统已安装所有必要的编译依赖包。打开终端并运行以下命令:

sudo apt update
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
              gawk build-essential bison flex texinfo gperf libtool patchutils bc \
              zlib1g-dev libexpat-dev pkg-config  libglib2.0-dev libpixman-1-dev libsdl2-dev \
              git tmux python3 python3-pip ninja-build vim pyqt5* qttools5-dev-tools qttools5-dev 

2. 环境配置

2.1 LoongArch 交叉编译工具链环境配置

你需要配置 LoongArch 交叉编译工具链。

# 下载LoongArch编译工具链          
wget https://github.com/sunhaiyong1978/CLFS-for-LoongArch/releases/download/8.0/loongarch64-clfs-8.0-cross-tools-gcc-full.tar.xz
#解压到/opt目录
sudo tar -xvf loongarch64-clfs-8.0-cross-tools-gcc-full.tar.xz -C /opt/
#设置环境变量
echo 'export PATH=/opt/cross-tools/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
#确认是否正确安装
loongarch64-unknown-linux-gnu-gcc -v

2.2 Rust 环境配置

hvisor和NPUcore依赖Rust,请按照以下步骤配置 Rust 环境:

#设置Rust镜像源
export RUSTUP_DIST_SERVER="https://mirrors.ustc.edu.cn/rust-static"
export RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup"
#安装 Rustup
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
#激活环境变量
source "$HOME/.cargo/env"
#验证 Rust 安装
rustc -V
#添加 Rust 组件和目标
rustup component add llvm-tools-preview
rustup target add loongarch64-unknown-linux-gnu
cargo install cargo-binutils

2.3 Python 环境配置

Debug_tool依赖python环境运行,配置步骤如下:

#安装 libssl-dev
sudo apt update
sudo apt install -y libssl-dev
#下载 Python 3.12.7源码
wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz
#编译并安装 Python
cd Python-3.12.*/
./configure --enable-optimizations --with-ssl
make -j $(nproc)
sudo make altinstall
#安装 Python 依赖
python -m pip install PyQt55.15.10 pyelftools==0.31

3.编译各个子模块

3.1 hvisor 编译、镜像生成和生成反汇编

进入 hvisor 项目目录并进行编译:

#编译 hvisor 并生成镜像
cd hvisor
make ARCH=loongarch64
#生成反汇编文件
make disa ARCH=loongarch64

3.2 编译 NPUcore

NPUcore 项目需要单独的交叉编译工具链。

#下载 LoongArch 交叉编译工具链
wget https://github.com/LoongsonLab/oscomp-toolchains-for-oskernel/releases/download/gcc-13.2.0-loongarch64/gcc-13.2.0-loongarch64-linux-gnu.tgz
#解压到 /opt 目录
sudo tar zxf gcc-13.2.0-loongarch64-linux-gnu.tgz -C /opt/
#设置环境变量
echo 'export PATH=${PATH}:/opt/gcc-13.2.0-loongarch64-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
#验证安装
loongarch64-linux-gnu-gcc -v
#编译 NPUcore
cd NPUcore
chmod +777 os/buildfs.sh
chmod +777 util/mkimage
make all

3.3 编译 Linux kernel(6.14)

下载 https://github.com/torvalds/linux/releases/tag/v6.14,放入RootLinux中

cd RootLinux
cp ./linux-6.14/arch/loongarch/configs/loongson3_defconfig /linux-6.14/arch/loongarch/configs/loongson3_defconfig_bak
cp ./loongson3_defconfig ./linux-6.14/arch/loongarch/configs/loongson3_defconfig
./build-root menuconfig
./build-root kernel

3.4 编译 rootfs

本仓库来自:https://github.com/enkerewpo/buildroot-loongarch64

若网络状态不佳,可考虑提前下载dl,2GB大小,放入buildroot-loongarch64,然后编译。

https://pan.baidu.com/s/1sVPRt0JiExUxFm2QiCL_nA?pwd=la64

cd buildroot-loongarch64
make loongson3a5000_hvisor_defconfig
# !!! You can change the GCC path to your own by
# !!! entering menuconfig and adjusting toolchain settings
make menuconfig
make -j8 # Build the rootfs

3.5 编译 grub2.12

grub2.12原仓库:https://github.com/rhboot/grub2

进入 grub2.12 目录并运行编译脚本:

cd grub2.12
chmod +777 configure
./build.sh

使用下面的脚本生成U盘镜像:

# 需要将/media/boneinscri/替换为你实际的U盘挂载路径
sh generate_3a5000.sh # 生成3a5000的启动镜像
sh generate_3a6000.sh # 生成3a6000的启动镜像

更新non root工作目录下的文件:

sh update-root-rootfs.sh

3.6 使用 Debug_tool

#安装 pyelftools
pip install pyelftools
#生成 funcs_info.pickle 文件
python Funcsinfo.py

使用 addr2line 工具,结合 hvisor 可执行文件和调试地址,可以定位到对应的源代码文件和行号:

addr2line -e hvisor 0x9000000100041984 -f -s

运行以下命令启动调试器:

python Debugger.py

如果在运行 Debugger.py 时遇到以下 libGL 错误:

libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast

解决方案:

/lib/x86_64-linux-gnu/dri/中的 iris_dri.soswrast_dri.so复制到 /usr/lib/dri下,如果没有 /usr/lib/dri路径,创建

https://blog.csdn.net/weixin_43686259/article/details/141135736

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
$ cd /home/boneinscri/miniconda3/lib
$ mkdir backup  # Create a new folder to keep the original libstdc++
$ mv libstd* backup  # Put all libstdc++ files into the folder, including soft links
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6  ./ # Copy the c++ dynamic link library of the system here
$ ln -s libstdc++.so.6 libstdc++.so
$ ln -s libstdc++.so.6 libstdc++.so.6.0.19

如果 hvisor 代码有更新,你需要运行下面指令

python Funcsinfo.py

启动调试器:

一个terminal中运行

sh start_jtag.sh

另其一个terminal运行

python Debugger.py

用于启动的U盘的目录结构如下:

./
├── arch
│   ├── boot
│   │   └── loong64
│   │       ├── hvisor.bin
│   │       ├── hvisor-trap-vector.txt
│   │       ├── initramfs-linux.img
│   │       └── vmlinuz-linux
│   └── loong64
├── boot
│   └── grub
│       ├── 2024-12-23-06-36-05-00.uuid
│       ├── fonts
│       ├── grub.cfg
│       ├── grubenv
│       ├── locale
│       └── loongarch64-efi
│           ├── acpi.mod
...
│           ├── loongstub.mod
...
│           └── zstd.mod
└── EFI
    └── BOOT
        ├── BOOTLOONGARCH64.EFI
        └── grub.efi

用于测试的数据盘结构如下:

./Test_Disk
├── benchmark-test -- 存放benchmark测试脚本
├── nonroot-test   -- 存放non root zone的一些配置文件
└── testbench      -- 存放一些benchmark的可执行文件,比如libc-bench、Unixbench

如果需要设置网络:

开发板 ip :192.168.0.1/24

主机 ip:192.168.0.2/24

两者通过网线相连

ip addr add 192.168.0.1/24 dev eth0
ip addr add 127.0.0.1/8 dev lo
ip link set eth0 up
ip link set lo up
sudo ip route add default via 192.168.0.2

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

🛸🔗 参考文献&资料&手册&链接

[1] Thomas K, Li F, Zand A, et al. Data breaches, phishing, or malware? Understanding the risks of stolen credentials[C]//Proceedings of the 2017 ACM SIGSAC conference on computer and communications security. 2017: 1421-1434.

[2] Kuraku S, Kalla D. Emotet malware a banking credentials stealer[J]. Iosr J. Comput. Eng, 2020, 22: 31-41.

[3] Pereira T, Barreto L, Amaral A. Network and information security challenges within Industry 4.0 paradigm[J]. Procedia manufacturing, 2017, 13: 1253-1260.

[4] Werlinger R, Hawkey K, Beznosov K. An integrated view of human, organizational, and technological challenges of IT security management[J]. Information Management & Computer Security, 2009, 17(1): 4-19.

[5] Stewin P, Bystrov I. Understanding DMA malware[C]//International Conference on Detection of Intrusions and Malware, and Vulnerability Assessment. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 21-41.

[6] Ravi S, Raghunathan A, Kocher P, et al. Security in embedded systems: Design challenges[J]. ACM Transactions on Embedded Computing Systems (TECS), 2004, 3(3): 461-491.

[7] Zhang Z. Enhancing iot security through trusted execution environments[C]//2024 2nd International Conference on Image, Algorithms and Artificial Intelligence (ICIAAI 2024). Atlantis Press, 2024: 580-589.

[8] Cerdeira D M. Towards Trustworthy TrustZone-Assisted TEEs[D]. Universidade do Minho (Portugal), 2024.

[9] Jeon G H, Jeon S. A Survey on Attack Cases with VBS Malware[C]//Information Security Applications: 25th International Conference, WISA 2024, Jeju Island, South Korea, August 21–23, 2024, Revised Selected Papers. Springer Nature, 2025, 15499: 284.

[10] Ng Y T, Chen Z, Qiu H, et al. Prism: To Fortify Widget Based User-App Data Exchanges Using Android Virtualization Framework[J]. 2025.

[11] Jung R. Understanding and evolving the Rust programming language.(2020)[J]. Dizertačná práca. Saarland University, 2020.

[12] Hong J, Ryu S. Type-migrating C-to-Rust translation using a large language model[J]. Empirical Software Engineering, 2025, 30(1): 3.

[13] Li Z, Narayanan V, Chen X, et al. Rust for Linux: Understanding the Security Impact of Rust in the Linux Kernel[C]//2024 Annual Computer Security Applications Conference (ACSAC). IEEE, 2024: 548-562.

[14] Sharma A, Sharma S, Tanksalkar S R, et al. Rust for embedded systems: current state and open problems[C]//Proceedings of the 2024 on ACM SIGSAC Conference on Computer and Communications Security. 2024: 2296-2310.

[15] Levy A, Campbell B, Ghena B, et al. The case for writing a kernel in rust[C]//Proceedings of the 8th Asia-Pacific Workshop on Systems. 2017: 1-7.

[16] Tian H, Peng Y, Luo Y, et al. Asterinas: A Rust-Based Framekernel to Reimagine Linux in the 2020s[J].

[17] Lankes S, Klimt J, Breitbart J, et al. RustyHermit: a scalable, rust-based virtual execution environment[C]//International Conference on High Performance Computing. Cham: Springer International Publishing, 2020: 331-342.

[18] Peng Y, Tian H, Junyang Z, et al. Asterinas: A Linux ABI-Compatible, Rust-Based Framekernel OS with a Small and Sound TCB[J]. arXiv preprint arXiv:2506.03876, 2025.

[19] 胡伟武, 高翔, 张戈. 龙芯指令系统架构及其软件生态建设[J]. 信息通信技术与政策, 2022, 48(4): 43.

[20] 胡伟武, 汪文祥, 吴瑞阳, 王焕东, 曾露, 徐成华, 高翔, 张福新. 龙芯指令系统架构技术[J]. 计算机研究与发展, 2023, 60(1): 2-16.

[21] Rusling D A. The linux kernel[EB/OL].(1999-1)

[22] Kivity A, Kamay Y, Laor D, et al. kvm: the Linux virtual machine monitor[C]//Proceedings of the Linux symposium. 2007, 1(8): 225-230.

[23] ACPI Specification 6.5[EB/OL].(2022-8-29).https://uefi.org/specs/ACPI/6.5/01_Introduction.html

[24] 龙芯中科.龙芯3A5000[EB/OL].(2021-8-11).https://www.loongson.cn/product/show?id=10

[25] 龙芯中科.龙芯3A6000[EB/OL].(2024-7-25).https://www.loongson.cn/product/show?id=26

[26] syswonder.a Rust Hypervisor for mission-critical system[EB/OL].(2025-7-2).https://hvisor.syswonder.org/chap01/Overview.html

[27] Kernel Virtual Machine[EB/OL].(2023-10-8).https://linux-kvm.org/page/Main_Page

[28] jailhouse[EB/OL].(2023-12-11).https://github.com/siemens/jailhouse

[29] Xvisor: eXtensible Versatile hypervISOR[EB/OL].(2025-5-11).https://github.com/xvisor/xvisor

[30] José Martins, Adriano Tavares, Marco Solieri, Marko Bertogna, and Sandro Pinto. “Bao: A Lightweight Static Partitioning Hypervisor for Modern Multi-Core Embedded Systems”. In Workshop on Next Generation Real-Time Embedded Systems (NG-RES 2020). Schloss Dagstuhl-Leibniz-Zentrum für Informatik. 2020.

[31] ACRN.A Big Little Hypervisor for IoT Development[EB/OL].(2018-6-20).https://github.com/projectacrn/acrn-hypervisor

[32] Jiang Z, Wei R, Dong P, et al. Bluevisor: Time-predictable hardware hypervisor for many-core embedded systems[J]. IEEE Transactions on Computers, 2021, 71(9): 2205-2218.

[33] Rust-Shyper.A Reliable Embedded Hypervisor Supporting VM Migration and Hypervisor Live-Update[EB/OL].(2013-4-23).https://gitee.com/openeuler/rust_shyper

[34] hvisor.a Rust Hypervisor for mission-critical system[EB/OL].(2025-7-1).https://github.com/syswonder/hvisor

[35] rCore.rCore-Tutorial-Book[EB/OL].(2020-11-3).https://rcore-os.cn/rCore-Tutorial-Book-v3/index.html

[36] ArceOS.An experimental modular operating system (or unikernel) written in Rust.[EB/OL].(2024-4-27).https://github.com/arceos-org/arceos

[37] Peng Y, Tian H, Junyang Z, et al. Asterinas: A Linux ABI-Compatible, Rust-Based Framekernel OS with a Small and Sound TCB[J]. arXiv preprint arXiv:2506.03876, 2025.

[38] kycore[EB/OL].(2025-5-1).https://gitee.com/openkylin/kycore

[39] Redox[EB/OL].(2025-7-13).https://www.redox-os.org/zh/

[40] NPUcore[EB/OL].(2024-6-1).https://github.com/Fediory/NPUcore-IMPACT

网页资料

[1] 7a2000 https://www.loongson.cn/EN/news/show?id=641

[2] Linux https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.19

[3] fireware https://github.com/loongson/Firmware

[4] 3a6000 https://www.loongson.cn/EN/news/show?id=658

[5] KVM https://lwn.net/Articles/927561/

[6] QEMU

https://wiki.qemu.org/ChangeLog/7.1

https://www.loongson.cn/EN/news/show?id=643

[7] grub2.12

https://fedoraproject.org/wiki/Changes/rebase_grub2_to_2_12}

[8] UEFI

https://uefi.org/press-release/uefi-forum-releases-uefi-210-specification-and-acpi-65-specification

https://www.loongson.cn/EN/news/show?id=645

[9] 3a5000

https://loongson.github.io/LoongArch-Documentation/Loongson-3A5000-usermanual-EN

[10] Archlinux

https://www.loongson.cn/EN/news/show?id=656

[11] LoongArch 卷一手册

https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html

https://www.kernel.org/doc/html/v6.13-rc3/arch/loongarch/index.html

支持LoongArch的OS

  1. ArchLinux

https://loongarchlinux.org/pages/download/

https://mirrors.wsyu.edu.cn/loongarch/archlinux/iso/2024.12.23/archlinux-2024.12.23-loong64.iso

https://github.com/loongarchlinux/

  1. Debain

https://wiki.debian.org/LoongArch

https://lists.debian.org/debian-loongarch/

https://lists.debian.org/debian-loongarch/2025/06/threads.html

https://bbs.loongarch.org/d/167-lauosc-debian-ports

https://mirrors.aliyun.com/debian-ports/

https://mirrors.tuna.tsinghua.edu.cn/loongson/install/loongarch64_debian13_20240630a.zip

  1. OpenEuler

https://gitee.com/openeuler

https://gitee.com/organizations/openeuler/projects

https://gitee.com/openeuler/kernel

https://www.openeuler.org/zh/download/?archive=true

https://www.openeuler.org/zh/download/archive/detail/?version=openEuler%2024.03%20LTS%20SP1

https://mirror.nyist.edu.cn/openeuler/openEuler-24.03-LTS-SP1/ISO/loongarch64/openEuler-24.03-LTS-SP1-loongarch64-dvd.iso

  1. OpenKylin

https://www.openkylin.top/downloads/

https://gitee.com/openkylin

https://gitee.com/openkylin/linux

https://www.openkylin.top/downloads/download-smp.php?id=81

openKylin 2.0 SP2 LoongArch 最新版 2025-08-28

  1. OpenAnolis

https://openanolis.cn/

https://gitee.com/anolis/cloud-kernel

https://openanolis.cn/download

https://mirrors.openanolis.cn/anolis/8.10/isos/GA/

https://mirrors.openanolis.cn/anolis/23.2/isos/GA/

  1. UOS

旧版本的linux

https://www.chinauos.com/

https://www.chinauos.com/resource/download-professional

https://cdimage-download.chinauos.com/desktop-professional/1072/release/uos-desktop-20-professional-1070-loongarch64-202412.iso?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTExMDU3NDksImZpbGVfbmFtZSI6ImRlc2t0b3AtcHJvZmVzc2lvbmFsLzEwNzIvcmVsZWFzZS91b3MtZGVza3RvcC0yMC1wcm9mZXNzaW9uYWwtMTA3MC1sb29uZ2FyY2g2NC0yMDI0MTIuaXNvIn0.ngurMi5xCCJABESNgmFB1drWlBr-aNqamDlVSSxoYEU

  1. Loongnix

https://www.loongson.cn/system/loongnix

https://www.loongnix.cn/zh/loongnix/

https://docs.loongnix.cn/loongnix/lnd-20/loongarch64/Installation_Guide/04.%E5%AE%89%E8%A3%85%E6%96%B9%E5%BC%8F.html

https://pkg.loongnix.cn/loongnix/isos/

  1. DeepinOS

https://www.deepin.org/index/en

https://www.deepin.org/zh/download/

https://cdimage.deepin.com/releases/25/loong64/

https://cdimage.deepin.com/releases/25/loong64/deepin-desktop-community-25-loong64.iso

  1. Hivosr-linux

https://github.com/enkerewpo/linux-hvisor-loongarch64

https://github.com/enkerewpo/buildroot-loongarch64

目前LVZ下运行的多核 Root Linux 已支持运行的workload

基础:

  1. Ltp
  2. Libc-bench
  3. IOzone
  4. Lmbench
  5. Unixbench
  6. Netperf
  7. Iperf
  8. Cyclic-test

扩展:

  1. XSBench
  2. Redis
  3. Btree
  4. Graph500
  5. GUPS
  6. Masstree
  7. Memcached
  8. GAP Benchmark Suite
  9. Graphbig
  10. SPEC CPU 2017
  11. PARSEC 3.0 benchmark

🏆 比赛收获与反思

向前,向前,向前!

克服重重困难,坚持到最后,就是胜利!

  1. 想要完成本项目绝非易事,即使通关过NJU的PA,写过模拟器和调试器,参加过操作系统内核赛,编码和调试依然是困难重重。当系统的模块增多,代码量从原先的几千行,到上万行(grub2.12就20多万行,更不说调Linux了),复杂性大大增加是必然的。具有正确的调试方法和利用合适的工具,能巧妙的发现和解决许多看似很复杂的问题。
  2. 当Linux成为程序调试的负载时,系统的复杂性将大大提升,开发并使用调试器,并采用diff-test的思想能解决绝大部分问题!想要让虚拟化的功能正确,需要保证虚拟机的运行行为和裸机运行的行为一致,这形成了一个天然的diff!
  3. 让代码编写、测试和运行滚动起来。不要将时间浪费在重复的机器劳动上,通过自动化脚本工具加速开发流程!
  4. 没有源码,那就hack。在系统软件程序员面前,只要敢想,就总会有办法,从入门到hacker!
  5. 只要程序有输出,那么根据输出反向定位对应的源码,然后读懂它,总能有些思路!快速定位代码,在源代码的汪洋大海中快速找到想要读的那一行是系统软件开发的必备能力。
  6. 善于使用AI大模型。过分依赖AI不可取,但完全不使用AI也是万万不行,AI不仅可以辅助读懂代码,还能减少许多重复的机械的劳动,极大的提高代码的开发效率。
  7. 当程序卡住时,停下来,仔细想想,CPU就是一个无情执行指令的机器,现在整个系统卡在了哪里?大概执行到哪个地方时是否是某个寄存器不正确?是否是某个指令或者内存区域的数据不正确?是否可以进行diff-test?
  8. 本项目模块众多,软件运行的层次深,对系统编程的要求极大,且LoongArch的虚拟化的相关的特权寄存器的行为也仅能通过KVM的代码进行反向推演(假设没有LoongArch卷三虚拟化手册的情况下)。即使面对这样复杂的棘手的项目,经历过规范和系统的训练也能十分从容面对。编码、测试的方法正确,恰当使用工具,能极大简化复杂的系统软件开发!
  9. 不要频繁构建镜像并上板运行和测试,因为即使有自动化构建的工具,构建一次镜像,并在开发板上运行的时间成本是很大的。利用防御性编程的思想,多写assert和关键的log输出能让一次运行获取到系统运行的状态更多,减少调试成本。
  10. 在进行性能优化前,首先需要运行不同的workload,分析当前系统的最大瓶颈,然后针对具体的问题,给出减少性能开销的方法。

📬 联系方式

如有任何问题,欢迎提交 Issue。

🙌 致谢

感谢张羽教授的指导;感谢比赛主办方的精心组织与辛勤付出,为我们提供了展示自我、交流学习的宝贵平台;

感谢 syswonder 社区(陈康老师、曹东刚老师)和 计算所 张福新老师龙芯中科工程师团队 的技术支持与指导;

同时感谢 hvisor 的maintainer 韩喻泷 的优化建议;

感谢队友的帮助与支持,才能让比赛能顺利完成。

🧩 未来展望

(1)提供更加丰富和完善的安全服务。

(2)对基于共享内存的跨虚拟机通信进行加密,防止共享内存数据被恶意获取和篡改。

(3)目前hvisor仅支持静态分配的CPU虚拟化功能,没有vCPU的抽象和调度,后续可以进一步扩展对应的CPU虚拟化功能,实现高效的vCPU调度,提高Rust-based OS的多核执行安全服务的能力。这同时也是syswonder社区的未来工作。

(4)将本项目的功能扩展以及性能优化代码合并进hvisor的主分支。

关于
1.1 GB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号