
日期2026-10-17起因评估把网络共享迁移到 Android 设备时发现“内核模块”是整个方案的硬约束。顺着这个问题往下查发现它不是一个设备的问题而是四种操作系统在内核扩展机制上的路线差异最终集中体现在 Android 这个最尴尬的位置上。本文整理内核模块的加载机制、四种系统的驱动模型对比以及 Android 为什么卡在中间。文中 Android 设备以“未开源内核源码的机型”代称。目录问题从哪来内核能力的两种形态与加载约束四种系统的驱动模型对比谁能扩展内核谁有用户态出口难题Android 是唯一“两头不靠”的系统实测边界设计原则总结1. 问题从哪来评估把网络共享方案迁移到 Android 设备时遇到一个绕不过去的约束需要 NFS 挂载但没有nfs.ko模块也没有内核源码可以自己编译。顺着这个问题往下查Linux 桌面为什么能加模块因为有源码和 headers。Windows 也锁内核为什么没人觉得受限因为有 UMDF 用户态驱动框架。macOS 为什么能废弃 kext因为有 DriverKit 作为替代。鸿蒙为什么没有“模块”问题因为驱动本来就不在内核里。四个系统都在回答同一个问题驱动代码跑在哪谁有权往里加东西答案各不相同。而 Android 的答案是继承了宏内核的架构锁死了模块能力又没有提供用户态出口。2. 内核能力的两种形态与加载约束2.1 两种形态形态编译选项运行方式能否事后补充编译进内核CONFIG_Xy开机即加载出厂定死内核模块CONFIG_Xm生成.ko按需加载需要匹配的模块文件2.2 模块加载的四道约束约束说明vermagic模块编译时的内核版本字符串必须与uname -r匹配符号依赖模块引用的内核符号必须在/proc/kallsyms中导出ABI 兼容内核数据结构、函数签名在版本间变化跨版本模块运行时崩溃模块签名CONFIG_MODULE_SIG_FORCEy时未签名模块被拒绝四道约束全过模块才能加载。没有内核源码就无法为新版本重新编译模块。3. 四种系统的驱动模型3.1 Linux宏内核模块运行在内核态Linux 是宏内核。模块加载后运行在内核空间拥有完整内核权限。自由度来自源码和工具链的可得性发行版提供linux-headers包DKMS 可以在内核升级后自动重编第三方模块主流发行版默认不强制模块签名。代价是模块与内核版本强绑定且驱动 bug 的爆炸半径是整个系统。3.2 Windows混合内核内核态与用户态驱动并存Windows 的驱动模型分两层框架运行位置崩溃影响WDM / KMDF内核态可能蓝屏BSODUMDF用户态沙盒进程仅进程崩溃系统不受影响UMDF 的意义对于不需要直接操作硬件的设备类传感器、摄像头、USB 协议设备可以完全避开内核态风险。微软官方文档把“提高系统稳定性”列为 UMDF 的首要优势。所以 Windows 的“内核锁死”只锁内核态驱动。用户态驱动是官方提供的出口。3.3 macOS从 kext 到 DriverKit主动把驱动推出内核macOS 内核XNU是 Mach 与 BSD 的混合体。历史上驱动以 kext 形式运行在内核态。但从 macOS Catalina10.15开始Apple 系统性废弃 kext推动驱动迁移到用户态机制运行位置状态kext内核态逐步淘汰DriverKitdext用户态官方替代System Extension用户态安全/网络等功能Apple 的规则很直接从 macOS 11 开始如果存在等效的 System Extension 或 DriverKit 方案内核就不会加载 kext。macOS 在用架构手段把驱动推出内核用稳定性换一点性能开销。3.4 鸿蒙微内核驱动完全在用户态鸿蒙内核是微内核只保留进程调度、内存管理、IPC 等最核心功能。文件系统、驱动、网络服务全部运行在用户态。驱动在鸿蒙上的运行方式加载到用户态执行被限制在EL0 权限用户态特权级无法提升到内核 EL1 层每个用户态服务或驱动拥有独立地址空间只通过 IPC 互通。即使一个驱动被攻破攻击者拿到的也只是 EL0 权限无法触及内核。代价是 IPC 通信开销通过零拷贝、异步 IPC 和 HDF 框架缓解。鸿蒙的“内核模块”问题不存在——驱动从一开始就不在内核里。4. 对比谁能扩展内核谁有用户态出口系统内核架构驱动运行位置扩展内核的路径用户态出口Linux 桌面宏内核内核态有源码、有 headers、DKMS无驱动只能在内核态嵌入式 Linux宏内核内核态厂商提供kmod-*包无Windows混合内核KMDF 内核态 / UMDF 用户态内核态驱动受签名约束UMDFmacOS混合内核kext 内核态 / DriverKit 用户态kext 逐步淘汰DriverKit / System Extension鸿蒙微内核全部用户态驱动本来就不在内核里架构本身Android未开源内核源码的机型宏内核内核态无源码、无 headers、签名强制无关键差异不在“内核锁不锁”而在锁了之后有没有别的路走。Linux 桌面不锁能加模块。Windows锁内核态驱动但 UMDF 提供用户态出口。macOS主动收缩内核边界DriverKit 是官方替代路径。鸿蒙驱动从一开始就在用户态。Android锁死模块能力同时没有用户态驱动框架。5. 难题Android 是唯一“两头不靠”的系统Android 的处境是四个系统里唯一“两头不靠”的架构上它继承了 Linux 的宏内核。驱动和文件系统必须编译进内核或加载模块没有 Windows UMDF、macOS DriverKit、鸿蒙微内核那样的用户态驱动框架。任何需要内核级能力的任务只能走模块这条路。生态上模块这条路被锁死了。对于未开源内核源码的机型三重限制叠加text第一重内核出厂一次性编译厂商不再更新 第二重内核源码不公开无法自行编译模块 第三重模块签名强制未签名模块被拒绝结果是出厂没编译的能力永久不可用。替代上它没有官方的用户态出口。Windows 用户可以完全不碰内核态驱动macOS 用户有 DriverKit鸿蒙的驱动本来就在用户态。Android 没有等价物——想加功能要么走模块走不通要么靠用户态程序FUSE、TUN自己凑而用户态替代能覆盖的功能是有限的。所以真正的难题不是“Android 没有某个模块”而是未开源内核源码的 Android 机型是唯一一个既不能加内核模块、也没有用户态驱动框架的系统。这不是一个可以绕过或变通的技术障碍而是架构选择、生态策略、厂商行为三者叠加后的结构性结果。6. 实测边界6.1 未 root 的 Android 设备Android 125.10 内核proot 容器内核能力实测结论NFS 客户端/proc/net/rpc不存在无NFS 服务端/proc/fs/nfsd目录存在但空有残留无服务mount / proot无CAP_SYS_ADMINCapBnd0任何内核挂载都不可行FUSEAndroid 必有/sdcard模拟就是它用户态挂载可行6.2 已 root 的 Android 设备arm64chroot项情况架构arm64root chroot有CAP_SYS_ADMIN/CAP_NET_ADMIN内核源码不公开 → NFS/cifs 模块永久不可用TUNAndroid 必有VPN 功能→ root 后可开真 tun06.3 Debian 机顶盒armv7l项实测内核模块Debian 真内核apt install即装cpufreq不存在cpuidle不存在 → CPU 永远满频机顶盒是“有内核自由 NFS 能力”的设备适合承担内核级任务。6.4 NFS 与 SMB 的路径差异项目NFSSMB/CIFS内核版nfs.ko必须内核模块cifs.ko必须内核模块用户态替代无挂载级替代libnfs 只能读写不能挂载rclone / sshfsFUSE能挂载Android 上的路径死路只能换协议FUSE 用户态挂载FUSE 用户态挂载比内核版慢约 30-50%但配置同步、文档类 KB 级场景感知不到差距。7. 设计原则text1. 只用出厂必带的内核能力socket / TUN / FUSE 2. 不依赖需要加载模块的能力NFS 挂载 / cifs / 新文件系统 3. 网络共享 - 有内核自由度的设备继续当 NFS 服务器 - 受限设备用 sshfs / rclone / rsyncFUSE 用户态 4. 组网root 设备用 TUN无 root 设备走普通 socket 服务 5. 把需要内核自由度的任务分配给有自由度的设备判断标准很简单这个功能需不需要内核模块需要就永久做不到。不需要就看用户态能不能凑。8. 总结四种系统在内核扩展机制上的路线系统路线结果Linux宏内核模块可加载自由Windows混合内核UMDF 用户态出口锁内核但不锁功能macOS主动把驱动推出内核锁内核但不锁功能鸿蒙微内核驱动本来就在用户态架构本身解决Android未开源内核源码的机型宏内核 生态锁死 无用户态出口两头不靠Android 的难题不是单一技术限制而是四种系统里唯一一个“继承了宏内核架构、锁死了模块能力、又没有提供用户态驱动框架”的组合。这个边界画死之后设计上唯一能做的是把它当作一个固定约束然后把需要内核自由度的任务分配给有自由度的设备。本文基于实际设备实测与各系统官方文档整理。不同机型、内核版本和系统版本下细节可能不同请以实际环境为准。