系统集成
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 | runtime 侧设备收集、IRQ 注册、init_network()、动态 Wi-Fi/SoftAP 注册、vsock 初始化 |
os/arceos/modules/axruntime/src/irq.rs | 将 platform IRQ 注册能力适配为 ax_net::EthernetIrqRegistrar |
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()、register_device_with_config()、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 | 收集设备、注册 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 负责把平台发现、驱动能力、IRQ 注册和文件系统命名空间转换为 ax-net 可消费的输入。它不保存接口或路由副本;静态 NIC、动态 Wi-Fi 和 vsock 分别通过明确入口交给对应网络运行时,并由后者拥有后续状态。
2.1 初始化入口
ax-runtime 的设备初始化是普通 Ethernet 进入 ax-net 的主要入口,它先注入 IRQ 与 Unix namespace 能力,再收集 driver 并调用 init_network()。动态设备在全局服务建立后走追加路径,因此静态和动态流程共享状态边界,但不能颠倒发布顺序。
// os/arceos/modules/axruntime/src/devices.rs, 简化示意
ax_net::set_ethernet_irq_registrar(&crate::irq::NET_IRQ_REGISTRAR);
register_unix_namespace();
let config = parse_network_config();
let (nics, wireless) = collect_net_devices();
ax_net::init_network(nics, config);
register_wireless_devices(wireless);
这条路径完成三件事:
- 将 runtime 发现的 Ethernet 设备包装成
ax_net::EthernetDriver。 - 将结构化
NetworkConfig交给ax-net,由ax-net创建lo、Ethernet 接口、路由、DHCP 状态和 DNS registry。 - 在主网络栈初始化后注册需要独立控制面的 Wi-Fi/SoftAP 设备。
parse_network_config() 当前直接返回 NetworkConfig::default(),尚未接入系统配置。因此启动时所有未显式匹配的普通 NIC 都采用 ax-net 默认策略:eth{order}、metric 100、DHCP、无静态 fallback DNS。该函数是未来接入接口地址/DNS/metric 的预留转换点,不应把它描述成已经生效的配置解析器。
2.2 IRQ 适配
ax-net 的 Ethernet 设备只依赖抽象的 EthernetIrqRegistrar。runtime 侧通过 set_ethernet_irq_registrar() 注入平台 IRQ 注册能力:
ax_net::set_ethernet_irq_registrar(&crate::irq::NET_IRQ_REGISTRAR);
有 IRQ 的 driver 通过 take_irq_handler() 将独立 endpoint 移交给 platform action。IRQ callback 不获取正常 RX/TX 所用的 driver SpinLock,只确认/汇总事件并调用 wake_net_task_irq();没有独立 handler 或注册失败时由 RX worker 10 ms 兜底轮询。IRQ 上下文不进入 smoltcp poll。
2.3 Unix 命名空间
Unix domain socket 的路径名绑定需要文件系统命名空间协助。ax-runtime 在启用 fs-ng 时注册 namespace adapter:
ax_net::unix::register_unix_namespace(crate::unix_ns::AxFsUnixNamespace);
该适配层只处理 pathname socket 与 VFS namespace 的关系;Unix socket 的连接、收发、poll 和生命周期仍位于 ax-net。