【问题标题】:Linux kernel modulesLinux 内核模块
【发布时间】:2013-12-17 06:53:47
【问题描述】:

我不清楚可以“嵌入”在单片内核中的驱动程序与只能作为外部模块使用的驱动程序之间的区别。

需要什么样的努力才能将某些驱动程序(仅作为“外部模块”提供)“移植”到单片内核?

我希望能够运行 Vmware Tools 禁用可加载模块支持并摆脱 initrd 集市。

【问题讨论】:

  • 通常被描述为“内核模块”的东西更具体地说是 DKMS 模块en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support(至少 99.9% 的时间)。但无论如何,您仍然需要源代码和对您计划在您的机器上使用的 linux 内核分支的支持。
  • 好的。但是需要怎样的努力才能“转换”源代码呢? Linux 内核提供了大量代码,既可以编译为 DKMS 模块,也可以嵌入到单片内核中。我猜有某种“通用代码”和某种“模块特定”代码或makefile设置或其他。我对此不太感兴趣,所以我想了解其中涉及的内容。
  • 为什么要使用单片内核?这可能有助于回答您的问题。
  • 安全、性能、简单配置、小尺寸、快速启动。不需要灵活性。

标签: linux-kernel vmware-tools


【解决方案1】:

尽管驱动程序或多或少保持不变(在这两种情况下),但使用嵌入在单片内核中的“驱动程序”肯定有好处。

我将尝试解释您所询问的驱动程序部分的“移植努力”

根据您使用的驱动程序类型,基本上您必须弄清楚它如何适合当前的内核源代码树、它的编译(在 uImage 中包含您的 .ko)以及在内核启动时加载它。让我们稍微说明一下每个步骤:

a.) 找到您认为最适合保存驱动程序代码的文件夹(在内核源代码树中)。

b.) 努力确保您的驱动程序代码正在被编译。[即最终它将成为整体内核映像(uImage 或任何你称之为的)的一部分]。在这种情况下,您必须为您的驱动程序处理 Makefile。您可能必须引入一些 CONFIG 标志来编译您的驱动程序代码。源代码树中有大量的 Makefile 和驱动程序代码。到处走走,你会很好地了解它是如何完成的。

c.) 确保您的驱动程序代码独立于任何其他代码 可加载内核模块(即不属于 “单片”内核映像)。因为如果你调用你的驱动程序 代码(现在是单片的并且在内存中)取决于 可加载的模块代码,那么它可能会导致一些内核 恐慌/分段错误类型的错误。

d.) 确保您的驱动程序已在更高级别的 将初始化所有已注册驱动程序的子系统 在启动期间。(例如:一个 i2c 驱动程序一旦注册 在系统启动期间初始化 i2c 子系统时,将自动加载带有 i2c 驱动程序框架)。如果您能找到另一种调用驱动程序的 __init 和 __exit 函数的方法,则可能不需要此步骤。

e.) 现在,“应该”调用您的驱动程序 _init 和 (_exit 部分) 如果它被任何设备驱动程序框架或直接加载(即当 内核正在启动)。

f.) 对于硬件驱动程序,我们在驱动程序中有 .probe 实现 一旦内核找到相应的设备,就会调用它。 对于 s/w 驱动程序,我猜 __init 和 __exit 就是你所拥有的。

g.) 加载后,您可以像之前将其用作可加载内核模块

一样使用它

h.) 我建议阅读 linux 内核树中类似设备驱动程序的源代码,看看它们是如何运行的。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 2011-05-03
    • 2016-03-25
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多