您编写内核模块的目的是什么?

4 linux kernel-module linux-kernel

更多的是概述问题而不是技术问题。我可以看到周围的 Linux 内核开发人员职位,我想知道您希望成为什么内核模块?与使用系统调用和执行其他操作相比,哪些类型的任务最适合作为内核模块完成?

less /proc/modules在我的系统上显示 dm_log,设备映射器的记录器。为什么日志记录是从内核完成的,而不是在用户空间完成的?

saw*_*ust 5

你希望什么成为内核模块?

尽管大多数人(仅)将内核模块与设备驱动程序相关联,但其他内核服务(例如文件系统和网络协议处理程序)也可以构建为模块。
内核模块与静态链接(即内置在内核中)的主要理由是为了运行时可配置性(这反过来又提高了内存效率)。可选功能、服务和驱动程序可以从启动的内核中删除,但仍可以在以后需要时加载。
加载模块的开销、模块所需的存储空间(内核通常以压缩形式存储,而模块未压缩)以及每个模块浪费的内存页片段通常被认为是可接受的权衡。

与使用系统调用和执行其他操作相比,哪些类型的任务最适合作为内核模块完成?

这是一个与前一个问题没有真正关系的单独问题。您实际上应该比较用户模式与内核模式。内核模式是否使用模块(必须加载)或静态链接代码(始终可用)对于实际问题来说并不重要。(另一个答案提到“由于虚拟内存开销而运行模块代码时会出现较小的性能损失”,这是不正确的。)

用户模式服务或驱动程序具有以下优点:

  • 通常更容易、更快速地实现(无需构建和安装内核)。大多数 C 程序员(仅)使用 C 运行时库进行学习,因此内核环境而不是用户模式可能是一种学习体验。

  • 更容易控制专有源代码。可以免除 GNU GPL。

  • 受限制的权限不太可能无意中破坏系统或造成安全漏洞。

内核模式服务或驱动程序具有以下优点:

  • 系统中多个程序的可用性,无需混乱的排除锁。

  • 设备可访问性可以通过文件权限进行控制。

  • 只要系统运行,设备或服务的状态就是连续且可用的。每次程序启动时,用户模式驱动程序都必须将设备重置为已知的静态状态。

  • 更一致/更准确的计时器并减少事件延迟。

用户模式与内核模式的一个例子是可靠数据报套接字,它在 2.6.30 版本中添加到 Linux 内核中。此前,RDS 是基于 UDP 的用户模式协议,但通过“确认/窗口/分段/重新排序等”进行了增强进行了增强。在重负载下,用户模式协议的计时器不准确,因此额外的重传和丢弃消息会导致稳定性和性能问题。切换到内核模式网络协议旨在改进/解决此类问题。

然而,内核模式也存在一些陷阱(或责任)。内核代码负责确保系统的完整性和安全性。RDS 被发现在内核中引入了一个安全漏洞。

为什么日志记录是从内核完成的,而不是在用户空间完成的?

可能有多种原因,但对于此示例,日志请求者很可能处于内核模式而不是用户模式,因此这将避免尴尬的模式切换。