体系结构与平台移植
SkillDev tools为 ArceOS、StarryOS、Axvisor、someboot、动态统一可扩展固件接口平台启动、对称多处理启动、QEMU 启动配置、目标 JSON 文件、axbuild 体系结构映射、axcpu 陷阱与上下文代码、axplat-dyn、somehal,以及 LoongArch、x86、AArch64 或 RISC-V 平台调通工作新增、适配、调试或审查支持。
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the 体系结构与平台移植 skill
What this skill tells your AI
The instructions your AI receives, as published by rcore-os/tgoskits in .agents/skills/arch-platform-porting/SKILL.md and read by ahel’s review.
新增或修复体系结构、把 QEMU 用例切换到动态统一可扩展固件接口平台启动、为 someboot 启用对称多处理、调试早期启动挂起,或在新体系结构与平台路径上验证 ArceOS、StarryOS 或 Axvisor 时使用本技能。
任务涉及早期启动、陷阱向量、内存管理单元、对称多处理、退出统一可扩展固件接口启动服务或 Axvisor LoongArch 虚拟化扩展 QEMU 时,完整读取 references/boot-debugging.md。
当前 Axvisor LoongArch QEMU 使用动态统一可扩展固件接口平台路径。宿主 Axvisor 通过 LoongArch 开放虚拟机固件启动;Linux 客户机通过客户机统一可扩展固件接口启动,内核与根文件系统来自 Axvisor 运行时根文件系统,构建时保存本地开放虚拟机固件。
初步检查
- 确定变化层:目标规格、axbuild、测试套件配置、someboot、axcpu、axplat-dyn 或 somehal、设备驱动或操作系统配置。
- 先检查最接近且已工作的体系结构。动态统一可扩展固件接口路径优先与 x86_64 比较,不要直接创造新行为。
- 从 QEMU 参数一直追踪到内核入口的完整启动契约。固件、目标二进制接口、加载器和运行时平台不一致时,只改 QEMU 配置不能解决问题。
- ArceOS、StarryOS 和 Axvisor 优先使用
cargo xtask。特殊 QEMU 或容器环境必须用原生命令时,先检查xtask路径并保持参数一致。 - 最终补丁不得留下临时调试标记,除非用户明确要求保留。
- 修改 axloader UEFI 网络发现、HTTP 启动或 QEMU smoke 时,按
references/boot-debugging.md的“axloader UEFI 网络启动”检查同网卡协议束、串口边界、发现响应注入和ExitBootServices前资源释放。
对称多处理前的运行时控制台
- 中断处理和多任务调度是强制运行时能力。先初始化调度器与中断框架,探测串口,创建按所有者处理器亲和的串口工作任务,尝试完成公共运行时控制台移交,再释放任何次处理器。不得增加独立
serial或runtime-console功能。探测后全部运行时保持休眠;可以注册禁用的控制器中断,但选中或显式打开串口前不得屏蔽、复位或重新配置硬件。 - 没有匹配的运行时串口时,底层硬件抽象层控制台继续独占,并通过同一任务控制台能力输出。只有底层控制台具备中断时才能提供任务输入:公共层在硬中断中把接收数据排入有界队列并唤醒
WaitQueue。没有控制台中断时,take_input返回不支持,消费者关闭交互入口;禁止通过yield_now轮询伪造可休眠能力,也禁止用亲和性保留一个处理器。底层任务写入先取得可休眠任务锁,再取得中断安全硬件锁;早期次处理器和硬中断日志没有有效当前任务,只能非阻塞尝试硬件锁。一旦选中运行时进入Preparing,任何失败都进入封闭状态;成功提交后,对称多处理代码不得退回早期串口。 - 固件选中的硬件
DeviceId必须精确匹配。只有NotSpecified可以退回通用 LinuxttyS0编号。Preparing前找不到匹配项时保留底层所有者,不得猜测其他运行时串口;移交已经开始后才采用失败封闭。 begin -> adopt -> commit和失败封闭策略归ax-runtime::console所有。固件选中的控制台已经运行,应接管线路、波特率、先进先出缓冲区和启用状态,不调用普通串口startup()。只屏蔽设备本地来源,启用预注册中断动作,再发布路由。这样可避免以循环次数计数的忙等待在 QEMU 与高速实体处理器上产生不同实际时长。非控制台串口仍按显式打开生命周期正常启动和配置。ArceOS、StarryOS 与 Axvisor 适配层不得保存第二套控制台选择或移交状态。- x86 固定 COM1 回退属于
ax-driver的 NS16550 ACPI 探测:先匹配PNP0500或PNP0501命名空间设备,成功后由 rdrive 的同模型去重阻止后续根回调;没有 AML 命名空间设备时,再由空标识列表的 ACPI 根回调注册固定 PIO0x3f8、时钟1_843_200 Hz和实例 0,并把该资源关联到生成的DeviceId,使 SPCR 仍能精确选择。ax-driver不得依赖 someboot,axplat-dyn不登记串口模型。不得通过 IIR 等带设备语义的寄存器重新猜测硬件是否存在;ISA IRQ4 无 MADT Interrupt Source Override 时使用 GSI4、高电平、边沿触发,存在 override 时采用其完整路由,并要求最终 GSI 由 IOAPIC 覆盖。 - 次处理器安装逐处理器区域后、发布当前任务前,可以发布完整启动日志记录。此时只入队,不唤醒所有者工作任务;只有该处理器的调度器、中断和处理器间中断路径就绪后,才发布明确日志唤醒就绪状态。后续调度器就绪记录发送合并门铃通知,把早期记录作为同一流排空。
- 每个串口驱动的有界中断处理自行决定接收端是否需要延后重新使能。批次未完成、溢出、耗尽中断预算或运行时环溢出时保留明确重新使能;来源已完全排空时保持接收中断使能,不能在任务上下文运行前无条件屏蔽小型先进先出缓冲区。延后重新使能立即发现硬件可读而中断样本为空时,通过直接端口路径排空。
- 只有软件仍有待发送字节时才重新使能
TX_SPACE。先进先出缓冲区或移位寄存器完成状态只能在工作任务拥有的DrainTx控制事务内查询。没有完成中断的串口让该事务让出执行并重查,不得保留虚假发送就绪状态,也不得创建超时任务事后修复。 - 致命输出只执行一次终结性串口所有权转移。使用有界且不休眠的声明,避免内核恐慌死锁于被中断的普通事务。声明成功后,紧急所有权保持到关机,排除工作任务和中断寄存器访问,并在返回任何可写紧急能力前屏蔽设备本地来源。接口不得表达“可写但未屏蔽”状态。同步输出完整格式化记录,不得截断到固定软件缓冲区。
- Axvisor 在启动虚拟处理器前取得唯一输入;运行时后端支持时,还要取得完整记录日志订阅。启动横幅和普通宿主日志前配置所有者。取得订阅后,宿主日志和带来源代数的原始客户机字节通过同一有界队列发布;唯一消费者按入队顺序完成日志和客户机行格式化,再交给物理输出任务。移交时先转移早期日志,不能依赖启动等待、日志文字匹配或扩容保证顺序。宿主日志在启动期是独立行,在管理模式中采用清除、输出、重绘事务,客户机占用前台时采用有界完整记录积压。启动虚拟处理器前,把
TaskConsoleOutput移入一个专用任务。虚拟串口或设备回调可能运行在虚拟处理器固定且禁用抢占的区域,只能在非休眠锁下向固定容量、无分配队列提交,并发出中断安全通知。只有输出任务可以等待可休眠运行时锁或串口背压。由该任务报告有界队列丢失;禁止用监视任务、超时任务、处理器保留或平台轮询修补原子上下文休眠。客户机输入队列第一次溢出时输出完整宿主记录,客户机排空前抑制重复报告,绝不把报告注入客户机串口字节。设备回调运行前预分配客户机输出环,性能敏感路径保持有界,并在重放前报告被逐出字节数。 - 对称多处理后出现交错失败时,先确认
runtime console active早于次处理器启动消息,并确认后续日志进入所有者工作任务或 Axvisor 多路复用器;不得放宽冒烟测试失败匹配规则,也不得保留轮询处理器绕过问题。
移植检查清单
-
目标与工具链:检查
scripts/targets目标规格、目标三元组、内核恐慌策略、重定位与代码模型、二进制接口、软浮点、musl 或标准库支持、链接器、目标文件复制工具和rust-src。四架构裸机构建和 Clippy 必须通过共享BareBuildTarget统一解析scripts/targets/bare/<逻辑目标名>.json,不得为单一架构退回内置目标或另加命令行 target feature;逻辑目标名、AX_TARGET和产物目录仍使用原目标三元组,JSON 路径只作为 Cargo--target输入。各 JSON 精确保持固定 nightly 对应内置目标的二进制接口和指令集基线;LoongArch 目标额外保持lp64ssoft-float,并在 target specification 的features中声明-ual,不得恢复会产生 unstable target feature 警报的命令行-Ctarget-feature=-ual。改动 LoongArch 规格后同时运行 ArceOSunaligned-fixup与 Starryc-regression-test-loongarch-unaligned-cross-page回归,确认未对齐异常修复、跨页访问和SIGBUS语义。 -
内核运行模式:明确最终映像契约。Starry 是以
build-std=core,alloc构建的独立no_std、no_main位置无关可执行文件,始终保留对称多处理能力且不得含内核线程局部存储。Axvisor 保持标准库与 musl 位置无关可执行文件,并显式启用线程局部存储。ArceOS 默认启用线程局部存储;uspace + tls按uspace选择寄存器所有权,内部kernel_tlscfg 关闭。 -
处理器局部执行上下文二进制接口:
cpu-local独占当前来源选择、上下文绑定、切换事务和体系结构选定的抢占状态;ax-percpu只负责类型化布局与存储。不得创建第二个逐处理器当前上下文指针。最终映像模式决定寄存器分配;精确初始化后的CpuAreaRef地址就是区域身份,不增加映像内二进制接口版本、代数、标记、提供者特征外部函数接口或原始线程指针访问。体系结构 处理器区域 LinuxCurrentUnikernelTlsx86_64 GS 基址 GS 运行时锚点,FS 不使用 GS 运行时锚点,FS 保存线程局部存储 AArch64 TPIDR_EL1 或 TPIDR_EL2 SP_EL0,TPIDR_EL0 不使用 SP_EL0,TPIDR_EL0 保存线程局部存储 RISC-V 从当前上下文指针回溯或使用 sscratchtp = current、sscratch = 0锚定当前上下文, tp = TLS、sscratch = CPU baseLoongArch r21,并镜像到 KS3 tp = current锚定当前上下文, tp = TLSLoongArch 的
KS4和KS5保留给虚拟处理器暂存。RISC-V 的gp恢复为普通全局指针;位置无关可执行重定位需要时,目标规格仍使用--no-relax,但不得把gp描述为处理器局部存储。CpuPin<'scope>只能在检查实时处理器基址、区域自指针、索引和当前上下文指针后,通过不逃逸受保护回调创建。原子标量要求排除迁移;共享T: Sync还依赖对象自身同步;可变局部对象还需在排除中断、重入和冲突远端访问后取得ExclusiveCpu。上下文切换保持中断关闭,并消费准备与前序事务令牌。AArch64 借出SP_EL0给用户空间前,把唯一当前上下文指针保存到固定内核栈,返回 Rust 前恢复。抢占令牌为线性令牌。装载或存储型体系结构跨迁移保留当前上下文所有者;x86_64 使用处理器锚点,暂停的切换保护在另一处理器恢复时必须消费旧证明并接管目的处理器外出上下文留下的等价深度。运行时释放最后抢占深度前必须取得调度器接力棒;任务策略和接力棒状态不属于cpu-local。处理器拥有抢占状态的体系结构中,新上下文首次进入尾部必须完成切换深度;上下文拥有状态的体系结构从深度零开始。 -
构建系统:接入
scripts/axbuild的体系结构与目标映射、动态平台默认值、功能传播、内核格式转换、统一可扩展固件接口或二进制转换、根文件系统和各操作系统测试发现。 -
QEMU 与固件:核验 QEMU 程序、机器类型、处理器、对称多处理数量、闪存或 OVMF 文件、串口、磁盘与根文件系统设备、
-snapshot、调试参数、超时和成功或失败匹配规则。通过cargo xtask ovmf --arch <arch>取得 OVMF CODE 与 VARS;该命令复用 Ostool 固定版本、镜像探测、SHA-256 校验和$TMPDIR/ostool/ovmf缓存。TGOS_OVMF_DIR只用于选择另一 Ostool 格式缓存根目录,不能给各消费者新增固件变量或扫描发行版/usr/share。qemu-*.toml中的uefi、to_bin、加速、处理器功能和设备选择属于用例契约,axbuild 不得按目标体系结构或宿主/dev/kvm可用性推断或覆盖。Axvisor x86_64 运行时按 CPUID 选择 VMX 或 SVM,通用 QEMU 板卡与构建配置保持后端中立;持续集成保留 Intel/VMX 与 AMD/SVM 两个用例,但都不得选择 Cargovmx或svm功能,并使用同一后端中立客户机基线。 -
someboot 体系结构层:实现或审计入口、重定位、未初始化数据段清理、栈、内存映射、分页、陷阱向量、定时器、中断、电源、对称多处理和地址转换。
-
处理器局部启动:最终可执行与可链接格式文件恰好含一个
.percpu.template、.percpu.init和.percpu.align,不含已链接运行时区域或兼容别名。发现运行时处理器数后,按模板几何动态分配所有最终区域,在最终地址构造一次全部类型化值,冻结布局,再在处理器离线时用CpuAreaRef绑定;只有之后运行时代码才能取得有作用域CpuPin。所有可能失败的准备成功后才发布寄存器。丢弃未提交的准备切换令牌必须回滚下一任务绑定;进入尾部必须消费前一绑定代数后,任务才能在其他处理器运行。AArch64 最终别名按共享属性维护缓存;RISC-V 次处理器初始化sscratch;LoongArch 保持 r21 与 KS3 一致。 -
线程首次启动与回收:
ax-task::ThreadBuilder统一内核与用户任务的生命周期。PreparedThread::stage只预留首次投递及 CPU 热插拔租约,任务保持New;OS 身份发布后由StagedThread::activate首次入队,禁止新增 trampoline start gate。ax-runtime::thread::prepare_user_thread只装配 MM、FP、TLS 与架构上下文,必须使用公共 trampoline 并完成首次 switch tail。退出线程的执行资源在 off-CPU 与回调门禁结束后由任务上下文 reaper 释放,不能因管理句柄存活而一直保留栈;OS 扩展与 active-MM 的独立寿命不得合并。参照docs/design/ax-task-thread-lifecycle.md中 Linux v7.1 PREEMPT_RT 顺序及回归证据。 用户 clone 的 FP 装配不能只复制通用陷阱帧:AArch64/LoongArch 在 soft-float 内核中从当前 CPU 的 eager FP 状态快照到未发布子上下文,x86 先兑现 lazy xstate 所有权,RISC-V 保留显式寄存器快照与 FS 状态。通过UserContextOptions装配,并运行四架构qemu/test-clone-fp-state的真实寄存器断言。 -
用户锁字原子访问:
ax-cpu::user::user_cmpxchg_u32使用各体系结构的user_atomic.S和既有 nofault 异常表。返回观察值与 expected 相同才表示替换成功;失配只承诺原子观察。成功替换保持 Linux futex 的内存排序;Fault或有界 LL/SC 耗尽的Retry不返回观察值,缺页和让出 CPU 由退出 raw 临界区后的任务调用方处理。RV32/RV64 共用汇编,sext.w必须受既有XLENB == 8条件保护;RISC-V 和 LoongArch 的高位 u32 比较必须匹配 LR.W/LL.W 的符号扩展。异常表必须覆盖读和条件存储两条指令,真实 QEMU 验证同时覆盖未映射地址、只读页存储、比较失配和高位锁字,不能用普通物理地址 Atomic 代替用户地址异常恢复。 -
处理器运行时:更新
components/axcpu/src/arch/<arch>中的陷阱入口、上下文切换、用户或内核上下文、系统调用返回、浮点与向量状态和逐处理器假设。下游使用ax_cpu::context、registers、trap等功能入口,不能访问私有arch。TaskAnchor只保存不透明任务地址;ExecutionContextHeader、准备切换令牌和取消回滚留在运行期。prepared.commit()后必须立即进入TaskContext::switch_to(),保持原有中断关闭窗口,不加入检查、回调或析构。 -
CPU 运行期服务装配:通过
trait-ffi静态绑定真正由运行期拥有的窄服务。TrapDiagnostics接收按值的BacktraceRegisters,栈展开与符号解析由ax-hal::cpu_diagnostics提供。x86TrapStorageProvider由ax-hal::cpu_trap_storage提供每核 GDT、TSS 和双重故障栈;内存固定并映射到处理器关闭,重复交接必须在返回指针前失败。__CPU_LOCAL_TSS_OFFSET必须指向该提供者交出的同一 TSS;TSS 字段偏移由 CPU 层offset_of!生成。恢复栈、TLS 和 CPU anchor 前的汇编不能调用运行期服务。不得用弱默认实现掩盖缺失装配。 -
CPU 集成验证:ax-cpu 不含宿主测试、假寄存器或测试专用 feature。通过
cargo xtask clippy --package ax-cpu核对目标配置,通过cargo xtask arceos test qemu --arch <arch> --test-group cpu验证集成。页表描述符查询不等于硬件权限或 TLB 验证;PMU 溢出状态轮询不等于中断投递验证,不能互相代替。AArch64 PMU 寄存器与计数宽度参照 Linuxdrivers/perf/arm_pmuv3.c,perf 拉取请求只作为消费者需求。 -
AArch64 扩展状态布局:
ax_cpu::registers::FpState的 FPCR/FPSR 是相邻的 32 位字段,保存恢复用str/ldr wN和 Rustoffset_of!,不能按两个 64 位槽访问。共享实现位于arch/aarch64/fp.rs;迁移客户机入口时从这里取得原语,并通过 ArceOScpu/fp-context验证字段与真实寄存器一致。 -
AArch64 EL2 启停所有权:
ax_cpu::virtualization::PerCpu在独占、固定 CPU 且 IRQ 关闭的范围安装向量,关闭时恢复启用前的完整 HCR_EL2/VBAR_EL2,而非清零 HCR_EL2。重复启用和未启用时关闭必须失败,向量按 2 KiB 校验;平台保留 IRQ 处理与向量存储生命周期。ArceOScpu/virtualization-lifecycle在真实 EL2 验证恢复与非法转换。 -
LVZ 机器边界:LoongArch 客户机使用
ax_cpu::virtualization::{PerCpu, Vcpu},通用寄存器布局来自registers::GeneralRegisters,FP/LSX/LASX 保存恢复来自arch/loongarch64/fp.rs。入口的机器镜像与代码必须具有切换二阶段根后仍可访问的直映别名,别名由宿主内存所有者提供。返回 Rust 前恢复宿主 FP、TLS 和 r21/KS3;解绑恢复原翻译、虚拟化控制与 scratch 状态,关闭 per-CPU owner 恢复原客户机向量。IOCSR、软件定时器和退出策略在 AxVM,不能进入 CPU 包或在机器 IRQ 窗口内分配。上层hv必须同步开启平台 FP 初始化,不能只启用 CPU 的 FP 保存代码。通过 ArceOScpu/guest-entry和cpu/virtualization-lifecycle的真实 LVZ 用例验证。 -
本地 TLB 边界:范围归一化、架构阈值与本地失效由
ax_cpu::mmu所有,HAL 只保留跨核协议。非对齐范围必须覆盖最后一个字节所在页;不能只对长度向上取整。x86 全量失效必须包括 global 项,不能仅重载 CR3。ArceOScpu/paging-kvm与cpu/paging-kvm-pge分别验证 INVPCID 和 PGE 路径;TCG 对 global 项的过度失效不能替代硬件回归证据。 -
CPU 入口状态布局:
ax_cpu::registers::CpuEntryState和 RISC-VTaskEntryState拥有机器字段;cpu-local::cpu_entry从实际区域和任务布局生成__AX_CPU_AREA_ARCH_STATE_OFFSET、__AX_CPU_TASK_ARCH_STATE_OFFSET、__AX_CPU_TASK_CPU_BASE_OFFSET。这些是隐藏的绝对偏移符号,不是运行期地址或第二套当前任务来源。大小、对齐和 RISC-V 正 12 位立即数范围必须在提供者处编译期验证。修改后检查链接产物没有残留动态重定位,保持 LinuxCurrent 的sscratch=0、TLS 模式的 CPU 基址恢复及暂存寄存器保存顺序,并分别验证两种入口模式。 -
平台桥接:更新
platforms/axplat-dyn、platforms/somehal、平台配置、内存区域、中断路由、定时源、电源和处理器启动操作。 -
调度器时钟所有权:可比较调度时间属于
ax-plat::time,不属于ax-task或体系结构陷阱模块。someboot只报告原始计数器的计数率稳定性和运行时处理器间同步性;axplat-dyn在发布调度器和中断前初始化每个已绑定处理器的时钟锚点,并由本地定时中断盖章。x86 对称多处理中的不变时间戳计数器不自动证明跨处理器同步;可信虚拟平台可以同时提供计数率与同步契约,即使客户机 CPUID 没有暴露invariant_tsc。两项条件不能互相替代,任一项未证明时都使用校正逐处理器路径。远端读取者只能耦合调用处理器与目标处理器已发布时钟,不能以调用处理器原始计数代替目标样本。处理器离线时先关闭远端接纳,再撤销发布。 -
运行时平台身份:动态平台名由
someboot或somehal从固件发现,经axplat-dyn和ax_plat::platform::platform_name()暴露。ax-hal只转发;静态平台继续返回config::PLATFORM。 -
启动熵:
someboot在ExitBootServices前取得可信启动熵。先尝试统一可扩展固件接口随机数协议,再尝试扁平设备树/chosen/rng-seed的精确 32 字节值,并通过somehal、axplat-dyn与ax-hal暴露。没有来源时,要求每次启动唯一性的消费者应省略可选接口或返回明确不支持;能力正常缺失不得触发内核恐慌,也不得用单调时间、计数器、地址或其他可重放状态代替。 -
运行时中断所有权:ArceOS 运行时中断陷阱归
ax-cpu,经ax_hal::irq::handle_irq(raw_vector)分派,并立即把处理器陷阱入口包装成TrapVector。somehal保持与操作系统无关,通过somehal::irq::begin_irq(raw_vector) -> ActiveIrq暴露控制器事务;ActiveIrq::id()返回解析后的IrqId。axplat-dyn分派期间持有ActiveIrq,其Drop完成体系结构特定中断结束。不得恢复_someboot_handle_irq或#[somehal::irq_handler]作为运行时分派适配。 -
运行时中断初始化顺序:动态平台在注册运行时处理器或探测普通设备前调用
ax_hal::irq::init_boot_irqs(cpu_id)。rdrive::ProbeLevel仍是粗生命周期边界,PreKernel内顺序由ProbePriority决定:时钟、控制器、定时源、消息信号中断父控制器,最后才是普通早期设备。扁平设备树中相同级别和优先级保持树顺序;中断控制器还按父节点先于子节点,兄弟节点保持树顺序。优先级屏障能表达依赖时,不得在axruntime增加体系结构特定探测调用。 -
块运行时对称多处理顺序:中断驱动块运行时在要求次处理器前创建控制任务和一个处理器 0 启动硬件上下文,使早期根文件系统可用。只有全部目标处理器都具备在线调度器、可用处理器间中断和本地中断后,
axruntime才调用一次ax_fs_ng::block::runtime::online_smp()增加上下文与向量并重建逐处理器软件提交通道。驱动不得从次处理器入口扩展队列;中断注册或队列扩展失败必须回滚,不能改为轮询。与docs/design/block-mq-runtime.md保持一致。 -
网络队列运行时顺序:物理网卡初始化是对称多处理后的全有或全无事务。探测可在之前发布一次性
TakenNetDevice,但axruntime必须等待全部目标处理器的调度器、本地中断和同步处理器间中断就绪,才能选择亲和域、固定队列与协议执行任务或注册设备中断。全部动作以禁用、NonReentrant、共享线路语义和IrqAffinity::Fixed(owner_cpu)注册;匹配工作任务完成亲和性与队列初始化握手后才启用。工作任务固定、中断路由、共享亲和性或重新使能失败时回滚整个物理网络初始化,禁止退回IrqAffinity::Any、远端中断继续执行或周期轮询。 -
运行时处理器间中断身份:动态平台通过
somehal::irq::ipi_irq()、axplat-dyn和ax_hal::irq::ipi_irq()以IrqId暴露处理器间中断。不得通过ax-config注册动态处理器间中断。RISC-V 中该中断是处理器局部域中带标志的监管者软件中断原因,不是平台级中断控制器的裸来源1。 -
运行时处理器上限:生成的
CPU_CAPACITY与SMP配置值是常量泛型和固定容量调度结构的构建上限,不是复制可执行与可链接格式逐处理器模板的指令。实际在线或可用处理器数和动态区域分配来自平台发现数量,并在操作系统容量适用时受ax_hal::cpu_num()限制。 -
中断命名空间:处理器陷阱向量、平台
IrqId { domain, hwirq }、固件来源、控制器本地HwIrq和客户机全局系统中断或向量保持分离。新运行时注册使用IrqId,不能使用usize;旧IrqNumber(raw)只留在静态或尚未迁移的平台边界,并位于ax-plat、ax-hal或axklib等操作系统或硬件抽象层,不进入irq-framework或somehal。irq-framework只负责通用登记、亲和性、执行和装箱回调分派。动态外部控制器域在探测时分配,通过alloc_irq_domain、domain_by_kind、domain_by_owner或domain_is_kind查找,不能在动态平台代码中构造固定数字域。不得通过0x20 + gsi、PCI_INTX_VECTOR_BASE + gsi等算术推导宿主中断。固件来源经ax_hal::irq::resolve_irq_source(...)或平台解析器变成IrqId。高级配置与电源接口的触发、电平和控制器元数据应保留为IrqSource::AcpiGsiRoute;扁平设备树绑定保留原始说明符与父控制器到操作系统或平台层解析。rdif_intc控制器提供可失败的translate_fdt与translate_acpi,返回控制器本地线路和触发元数据。缺失控制器、锁失败、不支持亲和性、类型不匹配、空、畸形、越界或不支持说明符都返回错误,不能静默忽略、返回中断 0、基向量或猜测旧编号。 -
各平台中断域:x86 本地高级可编程中断控制器定时器与输入输出中断控制器属于不同域,陷阱向量
0x20不是AcpiGsi(0)。AArch64 通用中断控制器的中断标识是该控制器域内的HwIrq;RISC-V 平台级中断控制器来源是该控制器域内的HwIrq;LoongArch 的扩展输入输出中断控制器与外围设备控制器中断控制器保持不同域。无法解析时返回IrqError::Unsupported。 -
x86 64 位 trap 现场:同特权级异常也由硬件保存
SS:RSP;不得按短帧结束地址推算中断前栈指针,IST 和栈对齐会使这种推算错误。KernelTrapFrame::snapshot复制完整机器返回帧,普通 trap 与客户机入口共用ax_cpu::registers::GeneralRegisters;Linux 信号和 ptrace 格式转换留在 Starry。通过 ArceOScpu/trap-entry的实际断点和软件 IRQ 检查 PC/SP/FP 与修改 GPR 后返回。 -
x86 QEMU 中断契约:动态 x86 目标为现代 QEMU
q35,使用高级配置与电源接口、多重高级可编程中断控制器描述表、本地高级可编程中断控制器或扩展高级可编程中断控制器、输入输出中断控制器、外围部件互连总线传统中断路由,以及somehal在输入输出中断控制器平台设备上注册的物理目标消息信号中断父控制器。不得增加 8259 后备、i440fx特定假设、非高级配置与电源接口探测、绕过控制器的原始全局系统中断启用或控制器外向量算术。X86IoApicIntc独占外部路由,X86MsiProvider独占保留向量和消息路由;固定亲和性先更新提供者路由,再由外围部件互连总线租约重新组合并写入仍屏蔽的消息信号扩展中断项。硬中断只读预装原子向量路由和通用中断路由,不能查找rdrive。扩展高级可编程中断控制器保留完整u32标识;无法编码的标识必须在传统高级可编程中断控制器、输入输出中断控制器和当前消息格式中被拒绝。 -
LoongArch QEMU 中断契约:动态路径使用 QEMU
virt或 LS7A 风格固件路由,包含处理器局部定时器与处理器间中断、EIOINTC 和 PCH-PIC。loongarch-intc-driver独占与操作系统无关的寄存器协议及控制器和处理器接口端点;somehal独占固件解析、映射、动态域、rdrive、级联策略和ActiveIrq。somehal::begin_irq(raw)接收ESTAT.IS的处理器中断线,只允许定时器、处理器间中断和 EIOINTC 级联进入运行时分派。EIO 控制器、域和关闭期处理器接口发布后才能启用级联。PCH-PIC 本地启用不跨控制器持锁;平台先处理父 EIO,再处理本地 PCH,失败时恢复父状态。不得通过减去基向量推导 PCH 输入,也不得把未知处理器局部线当作 PCH-PIC 中断。 -
LoongArch LS2K 局部输入输出中断控制器:按照 AArch64 通用中断控制器的分发器与处理器接口分工。
rdif_intc控制器独占路由和一次写入启用或禁用寄存器;独立关闭期处理器接口只保存中断状态映射、类型化父线路和共享原子启用快照。注册控制器并发布接口与域后才能启用父级联。硬中断不得调用rdrive::get_list、取得任务所有控制器锁、分配或阻塞。控制器硬件写入后以发布内存序(Release)公布启用状态;禁用前以获取并发布内存序(AcqRel)隐藏输入。每次认领还要按触发父线路的有效输入位图与启用快照过滤;重叠位图采用已编程首个匹配路由,所有位图遗漏输入只属于首个后备父线路,不同父线路同时待处理时不能相互认领。 -
RISC-V QEMU 中断契约:动态路径使用处理器局部监管者定时、软件、外部中断原因和一个平台级中断控制器域。
somehal::begin_irq(raw)接收scause.bits(),不是平台级中断控制器来源号。该控制器来源只能由扁平设备树翻译或在监管者外部中断陷阱后认领产生。不得把裸来源号作为陷阱分派,不得把来源 0 当作有效,也不得绕过已注册rdif_intc::Intc控制器启用来源。 -
RISC-V 客户机监管者二进制接口处理器间中断:监管者二进制接口解码、硬件线程掩码和完成二进制接口属于 AxVM 的
arch/riscv64/policy;已保存或实时HVIP的硬件操作属于ax_cpu::virtualization,单个虚拟中断更新必须使用 CSR 位操作,不能覆盖其他来源的实时待处理位;客户机硬件线程到虚拟处理器拓扑解析属于 AxVM 的 RISC-V 层;VSSIP通过体系结构中立VmInterruptSender发布。发布前验证完整目标集合;当前与远端虚拟处理器使用同一排队投递路径,客户机VSSIP与宿主监管者软件中断和平台级中断控制器路由分离。与docs/design/axvm-riscv-sbi-ipi.md一致。 -
RISC-V 客户机控制与状态寄存器所有权:
RiscvVcpu::setup()构造复位状态时不读写实时宿主sstatus或hstatus;只有汇编客户机入口交换宿主和客户机状态。客户机目标暴露 F/D 时,从客户机指令集契约初始化宿主监管者sstatus.FS,架构客户机状态留在vsstatus。从客户机等待中断返回后立即出现宿主InstructionFault,通常表示宿主与客户机状态边界泄漏;稍后的客户机浮点非法指令表示指令集或复位状态不一致。不得复制当前宿主寄存器位修补。 -
运行时控制台选择与所有权:动态平台通过
somehal::console_device_id()和ax_hal::console::device_id()暴露固件选择的硬件控制台,值来自启动参数console=、高级配置与电源接口 SPCR 或扁平设备树stdout-path。ttyS<N>与ttyAMA<N>选择第 N 个普通串口节点;RockchipttyFIQ<N>只匹配第 N 个启用的rockchip,fiq-debugger。数字tty<N>、裸tty和ttynull是虚拟选择,不绑定硬件。Starry 只在Err(NotSpecified)时退回ttyS0;非硬件选择、选中硬件未匹配或没有串口终端时让/dev/console返回ENODEV。解析器和节点到DeviceId映射都在somehal。运行时绑定串口后,通过串口运行时所有权操作同时取得运行时输出路由和底层平台输出。进入Preparing后拒绝新的早期寄存器访问并等待在途访问;驱动接管、中断注册和路由成功后才提交Runtime;之后失败进入FailedClosed,不得退回底层硬件抽象层。紧急接管只屏蔽设备本地来源,不能禁用共享控制器线。硬件控制台只有一个寄存器所有者,Axvisor 任务、客户机和日志输出也都经过一个应用级输出所有者。 -
x86 底层控制台中断后备:COM1 IRQ4 可能共享输入输出中断控制器线路。只有串口中断标识寄存器报告待处理且为已知接收或线路状态中断时才认领;不存在端口常读为
0xff,即使合成线路状态看似就绪也视为未处理。每次硬中断排空受固定软件接收容量限制。 -
Axvisor 客户机平台身份与设备规划:每个客户机有稳定标识
console0的必需虚拟串口,按机器后备、有效宿主扁平设备树或高级配置与电源接口快照、同标识用户请求的顺序解析。用户 TOML 可替换模型或选项,或添加另一串口标识,但不能指定数字地址、中断、控制器、消息信号中断、低优先级中断,或enabled = false。物理宿主控制台始终宿主所有且禁止直通。各体系结构独立构建DeviceGraphBuilder,图节点保留同一Arc<dyn DeviceModel>供requirements()、firmware()和build()使用;声明时只计算一次固件贡献。DeviceFirmwareSpec::None不生成平台节点,Interfaces可以只支持扁平设备树、只支持高级配置与电源接口或两者都支持,但被选平台必须有接口。用户配置为id + model + typed options,通过显式填充、初始为空的ConfiguredDeviceCatalog解析;条目是带所有者路径的普通ConfiguredModelRegistration函数指针,不增加工厂特征、实例包装、设备类型枚举、链接器注册或动态固件容器。每个体系结构生成确定性计划,中断控制器先于消费者注册,每个节点独占一个ResourceClaimSet,全部槽位被租约持有后才封装DeviceRuntime。固件和运行时读取同一ResolvedDeviceGraph;内存映射输入输出、端口输入输出和系统寄存器退出只查找一次并调用动态Device::read/write,不得恢复地址或设备特殊分支、向下转换、两次分派或第二套中断结构。与docs/design/axvisor-resolved-device-graph.md和docs/design/arm-vgic-interrupt-topology.md一致。 -
Axvisor 外设部件互连规划:支持外设部件互连标准的体系结构必须注册类型化的
PciHostProvider,端点模型通过DeviceRequirements声明一个PciFunctionRequirement,再由设备图声明过程实体化宿主机与依赖关系;不得按模型名称匹配,也不得由端点代码分配总线号、设备号和功能号。把总线号、设备号和功能号、基址寄存器、平台功能、所有者和宿主机身份冻结为同一份ResolvedDeviceGraph中的外设部件互连元数据;不得公开第二份总线图或增加第二次密封阶段。x86 Q35 宿主机、低引脚数配置与端点必须共享同一个PciRootState;配置地址端口CF8和配置数据端口CFC只解码第一号配置机制,不得包含总线号、设备号和功能号特例。完整的外设部件互连内存窗口只注册为一个顶层运行时设备,基址寄存器重定位仅更新根状态内部路由,高级配置与电源接口中的外设部件互连内存窗口也必须来自同一运行时窗口。x86 通用虚拟外设部件互连端到端验证使用pci-enumeration虚拟机监控器扩展或安全虚拟机启动由构建流程生成、含 BusyBox 初始内存文件系统的 Linux;/init必须断言恰好存在一个0500:1af4:1110设备、没有绑定驱动、分配了有基址的 64 KiB 不可预取BAR2,且没有消息信号中断或扩展消息信号中断能力,成功时输出AXVISOR_X86_VPCI_ENUMERATION_PASSED,准备阶段失败则必须匹配失败规则。所有 Axvisor 客户机断言用例先通过shell_check_steps的vm console 1接入客户机控制台,再匹配该步骤的成功标记;仅有顶层success_regex不会切换控制台。真实 VirtIO Block PCI 用例还必须在 VMX/SVM 上使用同一 backend-neutral guest/config,按1af4:1042发现唯一 endpoint,验证 Revision 1、Subsystem1af4:1042、4 KiB BAR0、INTA、驱动绑定、WRITE→READ、只读拒写、guest-visible flush 和中断计数增长;失败时必须匹配显式 block failure marker。 MP table 的 PCI 路由消费 resolved INTx,同时保留 ISA IRQ0 到 INTIN2、PIC ExtINT 级联以及本地 LINT0 ExtINT/LINT1 NMI 条目;迁移 PCI 路由接口时不得删除这些独立的传统中断投递信息。 -
Axvisor 物理串口直通与固件贡献:扁平设备树直通选择器用节点边界匹配,选择父节点时包含其后代但不包含同前缀其他节点。包含宿主控制台串口时返回
HostOwnedDevice。明确选择的非控制台串口保留地址、中断路由和客户机节点;未选择物理串口在安装机器虚拟控制台后删除。所选串口需要被排除宿主设备保留的中断来源时,虚拟机配置失败。所有扁平设备树或高级配置与电源接口贡献都按类型类别和固件身份消费,拒绝重复、未支持剩余和硬编码图节点标识。InterruptController贡献保留(controller, input),显式映射到扁平设备树句柄或高级配置与电源接口全局系统中断域,不能默认父节点或压平输入。 -
Axvisor 共享固件提供者:替换宿主所有的固件设备时,客户机不得保留可以关闭宿主依赖的共享时钟、复位或电源域写权限。不可变机器计划保留提供者身份,虚拟机构造前解析类型化能力,并用提供者专用
Arc<dyn DeviceModel>作为HostReplacement节点声明完整范围,使第二阶段页表陷入。只在提供者给出的硬件特定保护规则下转发无关访问;性能敏感路径不含板卡或片上系统判断。缺少能力、寄存器布局歧义、说明符不支持或保护规则无效时,虚拟机创建失败,不退回原始直通。与docs/design/axvisor-shared-firmware-provider.md一致。 -
AArch64 客户机通用定时器:虚拟机级频率与计数偏移保存在不可变软件状态;每个虚拟处理器分别保存 CNTV/CNTP CVAL、ENABLE、IMASK 和装载状态。每个可用物理处理器都记录
CNTFRQ_EL0,缺失、为零或不一致时拒绝。有效宿主扁平设备树clock-frequency只校正客户机固件可见值,不能跳过硬件一致性检查。硬件CNTVOFF_EL2只是装载执行上下文副本。最终汇编入口依次禁用 CNTV、安装偏移和 CVAL、执行 ISB、启用控制;退出依次读取控制与 CVAL、禁用 CNTV、执行 ISB、清除 CNTVOFF 并在进入 Rust 前恢复宿主定时器。不得把硬件 CNTVOFF 读回虚拟机软件状态。与docs/design/axvisor-aarch64-generic-timer.md一致。 -
AArch64 客户机定时中断:从机器
GuestTimerProfile推导 CNTV/CNTP 私有外设中断和原始说明符,只向虚拟机局部虚拟中断控制器发布电平状态。宿主 CNTV 私有外设中断在虚拟机监控器生命周期内只声明一次,并在每个物理处理器配置为电平触发。低异常级中断时,汇编必须在 CNTV 仍有效时读取 GICv2 内存映射确认寄存器或 GICv3ICC_IAR1_EL1,之后退出事务才能禁用 CNTV、清除偏移、恢复宿主控制并调用 Rust 执行优先级下降。反向顺序会把电平中断变成伪确认与重复进入。虚拟中断控制器负责待处理、活动、启用、路由、结束、停用和电平重新待处理。启用hv时全部宿主处理器接口采用分离结束:EOIR只降优先级,普通宿主ActiveIrq::drop执行匹配停用,AxVM 延后到客户机退休。硬中断只发布固定预分配状态,不能分配、查找虚拟机、取得rdrive锁或调用通用订阅者,也不能通过多生产者单消费者通道传递中断状态。 -
动态中断路由锁:
somehal::irq::IRQ_ROUTES会从硬中断读取,因此读写都必须取得字段级保存中断状态的锁。不能用普通自旋获取;本地中断重入会递归同一登记表并使全部处理器停顿。 -
AArch64 分配物理共享外设中断:通过硬件支持列表项投递经过所有权检查的宿主共享外设中断,客户机和物理中断标识相同。正常退休让物理 GIC 停用,不得在软件回收后重复宿主停用。客户机陷阱停用或销毁时显式停用;该操作完成电平重采样。旧列表项尚未回收时到达新的确认,应保留到补充阶段创建下一硬件列表项。未分配的 GICv3 中断与低优先级中断仍归宿主,通过已注册消息信号中断叶路由解析父控制器并保留完整 24 位中断标识。
-
AArch64 客户机定时等待与迁移:等待中断调度最早可投递 CNTV 或 CNTP 截止时间。回调失效由
Aarch64TimerBinding::wait_generation所有,不属于ArmTimerContext。回调通过代数检查后,重新按当前物理计数评估捕获快照,先把私有外设中断电平发布到虚拟中断控制器,再唤醒虚拟处理器;先唤醒可能让虚拟处理器看不到待处理中断并再次休眠。陈旧回调不得发布或唤醒。虚拟中断查询和定时器重新设置放在调度等待队列临界区外。检查前捕获虚拟机运行时通知代数,设置后重查待处理状态,等待谓词只比较生命周期和原子代数。取消使用含所有者处理器的VmTimerHandle;远端取消在所有者执行并重设比较器。虚拟处理器迁移前完成旧物理处理器上的本地定时激活;复位、停止和销毁使绑定失效、清除虚拟线路并推进等待代数。 -
临时宿主比较器保护:
ax-task::begin_hardware_timer_irq只有进入匹配定时中断后才清除记录的比较器截止时间,避免通用调度器尚未分别建模已编程、待处理和活动状态时,在待处理事件被消费前重写过期比较器。该保护可能以过期截止时间作为调度参考并延后重新编程,暂时接受此性能代价。只有中断确认路径能明确消费待处理状态后才能删除。与docs/design/axvisor-aarch64-generic-timer.md一致。 -
动态固件设备与子提供者:
rdrive高级配置与电源接口探测的非空真实标识列表枚举命名空间Device节点,并通过AcpiInfo暴露_CRS内存、输入输出端口和中断资源;空列表或合成根标识只用于根表回调。固件传输拥有协议子节点时,通过FdtInfo::available_children()枚举或FdtInfo::prepare_child()验证,再用PlatformDevice::register_fdt_child()或原子父子注册发布。能力不得发布到原始句柄。Rdrive 负责直接子节点验证、禁用过滤、稳定DeviceId、路径与已填充状态、重复与所有权错误及可重试提交。子节点没有句柄仍可作为协议身份;句柄只是消费者查找键。每个提供者保留自己的后端与代理,不能路由到无关全局单例。 -
页表与内存所有权:检查页表项标志、大页、直接映射、内核高地址映射、设备映射、地址转换缓存或缓存屏障,以及内存管理单元状态完整记录前的
phys_to_virt。page-table-generic只负责体系结构中立遍历、映射、页帧生命周期、结构性页表项操作和错误,把调用方页表项配置视为不透明关联类型。硬件页表位编码、虚拟地址规范化、页错误访问标志和本地地址转换缓存失效属于ax-cpu;someboot拥有启动映射、分配与属性策略;虚拟化所有者拥有客户机映射、二阶段表的几何、分配及失效生命周期。EPT 使用ax_cpu::paging::EptEntry,AMD NPT 和 RISC-V G-stage 复用对应 CPU 原生描述符的位布局,不能复制掩码或以主机 TLB 失效冒充二阶段失效。ax-hal可提供FrameAllocator适配和别名,但不能选择体系结构或定义页表项位。不得在memory/恢复多体系结构选择器。AArch64 的用户叶子页表项必须设置 nG,使地址转换缓存项受当前 ASID 约束;内核叶子仍可保持 global。EL1 启动代码根据ID_AA64MMFR0_EL1.ASIDBits配置TCR_EL1.AS,运行时 tag allocator 必须读取已配置的TCR_EL1.AS决定 8 位或 16 位容量,不能只根据硬件能力发放尚未启用的 ASID。 -
AArch64 页表失效顺序:按地址或完整失效都必须先通过
DSB ISHST或DSB SY完成页表描述符写入,再执行TLBI,之后等待完成并执行ISB。本地完整失效由ax-hal的目标处理器集合与同步确认提供跨核完成;不能用普通 Rust 原子发布代替体系结构要求的存储完成屏障。指令序列静态回归只验证 ISA 顺序,仍需目标 QEMU 的真实页表与调度验证。 -
启动描述符复用:someboot 的
PteConfig和TableMeta保留启动属性与几何策略,硬件标志和地址编码通过ax_cpu::paging取得。不得以运行期默认策略替换启动层的脏位、全局位、MAIR 槽或共享属性。AArch64 查询写权限必须取反AP_RO;LoongArch 有效位不能覆盖NR的读禁止语义。通过 ArceOScpu/paging运行真实启动描述符的属性回归。 -
地址空间切换分配边界:调度器在禁用中断的切换路径使用值类型
SchedulerAddressSpaceActivation,只转移已有 MM 所有者,不新建Box、Arc分配或扩容退休队列。MM 退休和异常 activation 使用创建时内嵌的MmWorkLink;没有 root-switch proof 时必须保留实际强引用,不能只留下活动计数。最后一次 MM 析构由可睡眠回收入口取得唯一所有者后执行。 -
固件地址与设备映射:固件表暴露 LoongArch 直接映射窗口等处理器可见别名时,在体系结构边界规范化后再交给扁平设备树内存、早期控制台或设备映射后端。不得把体系结构掩码藏入通用
mem或common,也不得在驱动重复。phys_to_virt与virt_to_phys只用于内存直接映射;设备资源通过ax-mm::iomap(),由ax_hal::mem::prepare_iomap()先给出体系结构或平台决定,再退到页表设备映射。LoongArch 非缓存窗口放在someboot::ArchTrait::ioremap_device()后面。 -
驱动与根文件系统:检查外围部件互连总线命令位、设备映射、直接内存访问宽度、非易失性存储消息信号扩展中断或传统中断路由、块设备可见性、根文件系统修补和控制台或输入功能。QEMU 宿主根磁盘使用非易失性存储,不能静默退回
virtio-blk;绕过宿主块运行时的客户机虚拟设备二进制接口属于另一范围。 -
RISC-V 客户机 initrd 与 virtio-mmio:RISC-V 客户机使用 initrd 时,先确保客户机设备树存在
/chosen,再由客户机配置写入bootargs、stdout-path与linux,initrd-{start,end}。virtio-mmio 块设备使用 PLIC 单单元中断绑定;宿主 PCI 与 NVMe 仍由 Axvisor 所有时,从客户机设备树禁用宿主 PCI 桥。 -
StarryNixOS x86_64 诊断:从
apps/starry/nixos/flake.lock原生构建应用所有映像,再运行cargo xtask starry app qemu -t nixos --arch x86_64。只有相邻清单通过锁文件、闭包、目标、ext4 和映像散列检查的已发布映像才能设置STARRY_NIXOS_REUSE_ROOTFS=1。不得重建或切换宿主 NixOS,也不得在.ci-cache/{cargo,rustup,tmp}外创建仓库本地缓存。按有序阶段定位最早分歧,并在改变系统调用、procfs、挂载或文件系统语义前添加定向qemu/system/<behavior>;后续 systemd 连锁错误不是第一根因。 -
x86 调度基准启动:
apps/arceos/scheduler-latency-bench/qemu-x86_64.toml对动态平台 PIE 使用uefi = true、to_bin = true,与 ArceOS Rust 套件一致。直接把没有 PVH note 的映像交给 QEMU-kernel会在进入内核前失败;比较旧提交与新提交时两侧使用同一份有效启动配置,不把启动失败计作性能数据。 -
操作系统配置与测试用例:只为已验证体系结构更新 ArceOS、StarryOS 和 Axvisor 配置。
qemu-<arch>.toml运行配置与build-*.toml构建配置分离。Starry 应用板卡用例默认使用匹配的os/StarryOS/configs/board/<board>.toml;只有共享同一目标的全部板卡都能安全使用相同处理器、内存管理单元和片上系统功能集时,才加入应用局部build-<target>.toml。板卡需要扫描输出桌面(card0/fb0 链路)时,构建特性必须同时包含ax-runtime/display与ax-driver/virtio-gpu:ax_runtime::devices::init_display由ax-runtime/display特性门控,缺配时 ax_display 永不初始化——/dev/fb0不创
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 67
- Forks
- 133
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
arch-platform-porting- Source
- github.com/rcore-os/tgoskits