系统集成
ax-net 是 ArceOS 和 StarryOS 直接使用的网络栈实现。Axvisor 只有在启用 http-axum 等依赖 ax-std/net 的管理服务功能时,才经 ArceOS 间接使用它。ax-net 统一维护接口、地址、路由、DNS、ARP、网卡统计、socket 状态和协议栈 poll 机制;上层系统只负责平台设备接入和 ABI 转换。
核心源码:
| 源码 | 集成职责 |
|---|---|
os/arceos/modules/axruntime/src/devices.rs | 一次性消费全部物理设备、准备 DMA/IRQ source、构造 NetworkRuntimeBuilder、init_network()、vsock 初始化 |
os/arceos/modules/axruntime/src/irq.rs | 将 platform IRQ 注册能力适配为 fixed-affinity PinnedNetIrqRegistrar |
os/arceos/modules/axruntime/src/unix_ns.rs | 将 ArceOS 文件系统命名空间适配为 Unix socket namespace |
os/StarryOS/kernel/src/file/net.rs | Linux ifreq/SIOCGIF*/FIONREAD 等网络 ioctl 适配 |
os/StarryOS/kernel/src/file/packet.rs | AF_PACKET、sockaddr_ll、packet socket ioctl 和模拟 ARP reply |
os/StarryOS/kernel/src/file/netlink.rs | RTM_GETLINK/GETADDR/GETROUTE 查询和 IPv4 RTM_NEWADDR/DELADDR 更新 |
os/StarryOS/kernel/src/syscall/net/opt.rs | getsockopt()/setsockopt(),包括 SO_BINDTODEVICE |
os/StarryOS/kernel/src/pseudofs/proc.rs | /proc/net/arp、/proc/net/dev 等 procfs 视图 |
net/ax-net/src/lib.rs | init_network()、唯一 protocol executor、Wi-Fi transaction、init_vsock()、public facade |
net/ax-net/src/config.rs | NetworkConfig、InterfaceInfo、InterfaceId、DeviceBinding 等跨系统数据模型 |
源码表表明设备初始化、Linux ABI 和网络状态分别由不同模块维护,跨系统修改应沿公共 API 连接,而不是共享内部锁或对象。集成模型将在这些代码锚点基础上展示三类调用方进入 ax-net 的不同路径。
1. 集成模型
系统集成的基本原则是:网络状态只有一份,位于 ax-net;外部系统不复制接口表、路由表或 socket domain。
各层边界:
| 层级 | 负责 | 不负责 |
|---|---|---|
| runtime / platform | 一次性收集设备与 source binding、固定 CPU 注册 IRQ、传入结构化配置 | 维护路由表、运行时追加物理设备、解析 Linux socket ABI、直接访问 SocketSet |
ax-net | 接口 registry、路由、DNS、socket、协议栈 poll、多设备 dataplane | 平台设备发现、Linux ifreq 编解码、虚拟机管理策略 |
| StarryOS | Linux syscall 参数校验、ABI 结构体编解码、namespace 可见性过滤 | 复制第二套路由表、直接驱动 smoltcp、固定假设 eth0 |
| Axvisor | 功能启用后经 ax-std/net 使用 ArceOS 网络 API | 直接构造或维护 ax-net 控制面 |
职责表明确 runtime、ax-net、StarryOS 与 Axvisor 各自负责和禁止承担的工作。ArceOS runtime 是设备能力进入共享网络状态的首要边界,下面按初始化、IRQ、namespace 和动态设备展开。
2. ArceOS Runtime
ArceOS runtime 负责把平台发现、驱动 parts、物理 IRQ binding 和文件系统命名空间转换为 ax-net 可消费的输入。它不保存接口或路由副本;所有物理 Ethernet/Wi-Fi 在启动阶段一次性移交,vsock 使用独立入口。
2.1 初始化入口
ax-runtime 的设备初始化是物理网卡进入 ax-net 的唯一入口。它先注册 Unix namespace,消费全部 TakenNetDevice,解析每个 typed IRQ source,准备 DMA,再构造 queue runtime。只有 builder 全部成功后才发布 protocol service。
// os/arceos/modules/axruntime/src/devices.rs, 简化示意
register_unix_namespace();
let config = parse_network_config();
let devices = collect_net_devices();
let active_cpus = crate::task::active_cpu_set()?;
let (runtime, ports) = ax_net::NetworkRuntimeBuilder::new(
devices,
&crate::irq::NET_IRQ_REGISTRAR,
active_cpus,
).build()?;
ax_net::init_network(runtime, ports, config);
这条路径完成三件事:
- 将 runtime 发现的设备消费为
PreparedNetDevice,并把 source ID 精确解析为物理IrqId。 - 只从 scheduler active CPU mask 选择立即可运行的 queue/protocol owner;固定拓扑中尚未 online 的 CPU 不参与启动期放置。
- 将结构化
NetworkConfig交给ax-net,由ax-net创建lo、Ethernet 接口、路由、DHCP 状态和 DNS registry。 - 在 worker pin、disabled IRQ registration 与 enable 完成后执行 owner startup;安全剔除不适用的候选设备,并在剩余设备 initial refill/rearm 和 startup Wi-Fi transaction 成功后发布 service。
parse_network_config() 当前直接返回 NetworkConfig::default(),尚未接入系统配置。因此启动时所有未显式匹配的普通 NIC 都采用 ax-net 默认策略:eth{order}、metric 100、DHCP、无静态 fallback DNS。该函数是未来接入接口地址/DNS/metric 的预留转换点,不应把它描述成已经生效的配置解析器。