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对本文初稿的审查和意见。

目录
打赏
0
1
1
0
113
分享
相关文章
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
128 67
|
8天前
|
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
33 11
7个设置/获取接口了解Linux时间管理
本文系统介绍了Linux时间管理中的7个关键设置/获取接口,涵盖时间获取(如`time`、`gettimeofday`、`clock_gettime`)、时间设置(如`stime`、`settimeofday`、`clock_settime`)以及时间转换和格式化等内容。文章详细解析了绝对时间和相对时间的概念,包括GMT、UTC及本地时间的区别,并通过实例测试展示了各接口的使用方法与特性。此外,还探讨了时区设置对时间计算的影响,强调在实际开发中推荐使用UTC作为基准时间以避免时区变化带来的问题。总结部分结合项目经验,提醒开发者注意时间服务的重要性及潜在风险,例如时间跳跃可能引发的应用故障。
70 14
7个设置/获取接口了解Linux时间管理
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
75 16
Intel Linux 内核测试套件-LKVS介绍 | 龙蜥大讲堂104期
《Intel Linux内核测试套件-LKVS介绍》(龙蜥大讲堂104期)主要介绍了LKVS的定义、使用方法、测试范围、典型案例及其优势。LKVS是轻量级、低耦合且高代码覆盖率的测试工具,涵盖20多个硬件和内核属性,已开源并集成到多个社区CICD系统中。课程详细讲解了如何使用LKVS进行CPU、电源管理和安全特性(如TDX、CET)的测试,并展示了其在实际应用中的价值。
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
223 15
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网
Omnitool 是一款开源的 AI 桌面环境,支持本地运行,提供统一交互界面,快速接入 OpenAI、Stable Diffusion、Hugging Face 等主流 AI 平台,具备高度扩展性。
469 94
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网
哈佛推出全新类ChatGPT癌症诊断AI,登上Nature!准确率高达96%
哈佛大学研究团队开发的新型AI模型CHIEF,在《自然》期刊发表,癌症诊断准确率达96%。CHIEF基于深度学习,能自动识别、分类癌症并预测生存期,具高准确性、多任务能力和泛化性。它结合病理图像与基因组学等数据,显著提升诊断效率和个性化治疗水平,有望改善医疗资源不平等。但数据隐私和临床效果验证仍是挑战。论文见:https://www.nature.com/articles/s41586-024-07894-z
211 101