NPU驱动架构:用户态与内核态的分工昨晚调试一块新来的NPU开发板,跑推理任务时系统突然卡死,dmesg里刷出一堆“npu: page fault in kernel mode”的错误。同事说“是不是驱动没处理好用户态传下来的指针?”我盯着代码看了半小时,发现是用户态和内核态共享内存时,地址映射没做校验——用户态传了个非法地址,内核态直接拿过来DMA,结果把系统总线搞崩了。这种问题在NPU驱动里太典型了。神经网络推理涉及大量数据搬运,用户态应用、内核驱动、NPU硬件三者之间需要高效协作,但安全边界一旦模糊,轻则推理失败,重则系统死机。今天聊聊NPU驱动里用户态和内核态到底怎么分工,哪些活该谁干,哪些坑不能踩。用户态:只管“我要什么”,别管“怎么搬”用户态驱动(通常以库的形式存在,比如libnpu.so)是应用开发者直接打交道的层。它的核心职责是描述计算任务,而不是执行计算。用户态拿到一个模型后,要做三件事:解析模型结构:把ONNX、TFLite这些格式转成NPU能理解的指令序列。这里有个细节——模型里的权重数据通常很大,用户态只负责把权重地址告诉内核,而不是自己搬运。曾经见过新手把整个模型权重拷贝到内核缓冲区再提交,结果内存占用翻了三倍。管理内存句柄:用户态申请的内存(比如输入图片的buffer),需要注册到NPU驱动里,拿到一个“dma_buf fd”或者“ion handle”。后续所有操作都通过这个句柄,而不是直接传虚拟地址。别这样
038、NPU驱动架构:用户态与内核态的分工
NPU驱动架构:用户态与内核态的分工昨晚调试一块新来的NPU开发板,跑推理任务时系统突然卡死,dmesg里刷出一堆“npu: page fault in kernel mode”的错误。同事说“是不是驱动没处理好用户态传下来的指针?”我盯着代码看了半小时,发现是用户态和内核态共享内存时,地址映射没做校验——用户态传了个非法地址,内核态直接拿过来DMA,结果把系统总线搞崩了。这种问题在NPU驱动里太典型了。神经网络推理涉及大量数据搬运,用户态应用、内核驱动、NPU硬件三者之间需要高效协作,但安全边界一旦模糊,轻则推理失败,重则系统死机。今天聊聊NPU驱动里用户态和内核态到底怎么分工,哪些活该谁干,哪些坑不能踩。用户态:只管“我要什么”,别管“怎么搬”用户态驱动(通常以库的形式存在,比如libnpu.so)是应用开发者直接打交道的层。它的核心职责是描述计算任务,而不是执行计算。用户态拿到一个模型后,要做三件事:解析模型结构:把ONNX、TFLite这些格式转成NPU能理解的指令序列。这里有个细节——模型里的权重数据通常很大,用户态只负责把权重地址告诉内核,而不是自己搬运。曾经见过新手把整个模型权重拷贝到内核缓冲区再提交,结果内存占用翻了三倍。管理内存句柄:用户态申请的内存(比如输入图片的buffer),需要注册到NPU驱动里,拿到一个“dma_buf fd”或者“ion handle”。后续所有操作都通过这个句柄,而不是直接传虚拟地址。别这样