Linux内核驱动程序接口 【ChatGPT】

简介: Linux内核驱动程序接口 【ChatGPT】

Linux内核驱动程序接口

(回答你的所有问题以及更多)

Greg Kroah-Hartman greg@kroah.com

这篇文章旨在解释为什么Linux没有二进制内核接口,也没有稳定的内核接口。

注意

请注意,本文描述的是内核内部接口,而不是内核与用户空间的接口。

内核与用户空间的接口是应用程序使用的系统调用接口。该接口随着时间的推移非常稳定,不会发生变化。我有一些早期构建在0.9之前内核上的程序,在最新的2.6内核版本上仍然可以正常运行。这个接口是用户和应用程序员可以依赖的稳定接口。

执行摘要

你认为你想要一个稳定的内核接口,但实际上你并不需要,而且你甚至不知道。你想要的是一个稳定运行的驱动程序,只有当你的驱动程序在主内核树中时才能实现。如果你的驱动程序在主内核树中,你还会获得许多其他好处,这些好处使Linux成为一个强大、稳定和成熟的操作系统,这也是你首次使用它的原因。

介绍

只有少数人想要编写需要担心内核内部接口变化的内核驱动程序。对于世界上的大多数人来说,他们既看不到这个接口,也不关心它。

首先,我不打算讨论任何与闭源、隐藏源代码、二进制代码块、源代码包装器或其他不在GPL下发布源代码的内核驱动程序相关的法律问题。如果你有任何法律问题,请咨询律师,我是一名程序员,因此,我只会在这里描述技术问题(并不是为了轻视法律问题,它们是真实存在的,你需要时刻注意)。

因此,这里有两个主要的话题,二进制内核接口和稳定的内核源代码接口。它们彼此依赖,但我们将首先讨论二进制内容,以便解决这个问题。

二进制内核接口

假设我们为内核有一个稳定的源代码接口,那么二进制接口自然也会发生,对吗?错了。请考虑以下关于Linux内核的事实:

  • 根据你使用的C编译器版本的不同,不同的内核数据结构将包含不同的结构对齐方式,并可能以不同的方式包含不同的函数(内联或非内联函数)。单个函数的组织并不重要,但不同的数据结构填充非常重要。
  • 根据你选择的内核构建选项,内核可以假设各种不同的事情:
  • 不同的结构可以包含不同的字段。
  • 一些函数可能根本没有实现(即一些锁在非SMP构建中被编译为空)。
  • 内核内存可以根据构建选项以不同的方式对齐。
  • Linux运行在各种不同的处理器架构上。不同架构的二进制驱动程序无法在其他架构上正常运行。

这些问题中的一些可以通过使用与内核构建时完全相同的C编译器为特定内核配置编译模块来解决。如果你想为特定Linux发行版的特定版本提供一个模块,这就足够了。但是,将单个构建乘以不同的Linux发行版数量和不同支持的Linux发行版版本数量,你很快就会陷入不同构建选项的噩梦中。还要意识到,每个Linux发行版都包含多个不同的内核,所有这些内核都针对不同的硬件类型进行了调整(不同的处理器类型和不同的选项),因此即使是单个发行版,你也需要创建多个版本的模块。

相信我,如果你试图支持这种类型的发行版,你会逐渐变得疯狂,我很久以前就吃过这方面的苦头了...

稳定的内核源代码接口

如果你与那些试图在主内核树之外保持最新状态的Linux内核驱动程序的人交谈,这将是一个更加“不稳定”的话题。

Linux内核的开发是持续不断的,速度很快,从不停下来放慢脚步。因此,内核开发人员会发现当前接口中的错误,或者找到更好的方法来做事情。如果他们这样做,他们会修复当前接口以使其更好地工作。当发生这种情况时,函数名称可能会更改,结构可能会增长或缩小,函数参数可能会重新调整。如果发生这种情况,内核中使用此接口的所有实例将同时进行修复,确保一切继续正常工作。

作为这一点的具体例子,内核内部的USB接口在该子系统的整个生命周期中至少经历了三次不同的重构。这些重构是为了解决一些不同的问题:

  • 从同步数据流模型转变为异步模型。这减少了许多驱动程序的复杂性,并增加了所有USB驱动程序的吞吐量,以便我们现在几乎以最大速度运行所有USB设备。
  • 改变了USB驱动程序通过USB核心分配数据包的方式,以便所有驱动程序现在都需要向USB核心提供更多信息,以解决一些已记录的死锁问题。

这与一些闭源操作系统形成鲜明对比,后者不得不随时间保持其旧的USB接口。这为新开发人员意外使用旧接口并以不正确的方式执行操作提供了可能性,导致操作系统的稳定性受到影响。

在这两种情况下,所有开发人员都同意这些是需要进行的重要更改,并且已经进行了这些更改,而且几乎没有什么困难。如果Linux必须确保保留稳定的源代码接口,将会创建一个新的接口,并且旧的、有问题的接口将不得不随时间保持,这将导致USB开发人员需要额外的工作量。由于所有Linux USB开发人员都是利用自己的时间进行工作,要求程序员为了没有任何收益而免费做额外的工作是不可能的。

对于Linux来说,安全问题也非常重要。一旦发现安全问题,就会在很短的时间内进行修复。有时,这会导致内部内核接口进行重构,以防止安全问题发生。当发生这种情况时,使用这些接口的所有驱动程序也会同时进行修复,确保安全问题得到修复,并且不会在将来的某个时间意外地再次出现。如果不允许更改内部接口,将无法修复此类安全问题,并确保它不会再次发生。

内核接口会随着时间的推移进行清理。如果没有人使用当前接口,它将被删除。这确保内核保持尽可能小,并且所有潜在接口都能得到尽可能好的测试(未使用的接口几乎不可能进行有效性测试)。

做什么

所以,如果你有一个不在主内核树中的Linux内核驱动程序,作为开发者,你应该怎么做呢?为每个不同的内核版本和发行版发布一个二进制驱动程序是一场噩梦,而且试图跟上不断变化的内核接口也是一项艰巨的工作。

简单来说,将你的内核驱动程序放入主内核树中(记住,我们在这里谈论的是在GPL兼容许可下发布的驱动程序,如果你的代码不属于这个类别,祝你好运,你将独自面对,你这个寄生虫)。如果你的驱动程序在树中,并且内核接口发生变化,那么首先进行内核更改的人将修复它。这确保了你的驱动程序始终可构建,并且在时间上工作,你只需要付出很少的努力。

将你的驱动程序放入主内核树中的非常好的副作用包括:

  • 驱动程序的质量将提高,因为维护成本(对于原始开发者)将减少。
  • 其他开发者将为你的驱动程序添加功能。
  • 其他人将找到并修复你的驱动程序中的错误。
  • 其他人将找到你的驱动程序中的调优机会。
  • 当外部接口发生变化时,其他人将为你更新驱动程序。
  • 无需请求发行版添加,驱动程序将自动在所有Linux发行版中发布。

由于Linux支持的设备种类比任何其他操作系统都多,并且支持更多不同的处理器架构,这种经过验证的开发模型一定做对了某些事情 😃

感谢Randy Dunlap、Andrew Morton、David Brownell、Hanna Linder、Robert Love和Nishanth Aravamudan对本文初稿的审查和意见。

相关文章
|
4天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
32 15
|
29天前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
29天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
30天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
30天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
1月前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
37 3
|
2月前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
43 6
|
1月前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
2月前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
51 1
|
2月前
|
算法 前端开发 Linux
深入理解Linux内核调度器:CFS与实时性的平衡####
本文旨在探讨Linux操作系统的核心组件之一——完全公平调度器(CFS)的工作原理,分析其在多任务处理环境中如何实现进程间的公平调度,并进一步讨论Linux对于实时性需求的支持策略。不同于传统摘要仅概述内容要点,本部分将简要预览CFS的设计哲学、核心算法以及它是如何通过红黑树数据结构来维护进程执行顺序,同时触及Linux内核为满足不同应用场景下的实时性要求而做出的权衡与优化。 ####

热门文章

最新文章