Linux kernel Linux内核模块

Linux kernel Linux内核模块,linux-kernel,vmware-tools,Linux Kernel,Vmware Tools,我不清楚可以“嵌入”在单片内核中的驱动程序和只能作为外部模块使用的驱动程序之间的区别 将某个驱动程序(仅作为“外部模块”提供)“移植”到单片内核需要付出何种努力 我希望能够运行Vmware工具,禁用可加载模块支持并摆脱initrd bazaar。尽管驱动程序或多或少保持不变(在这两种情况下),但使用嵌入单片内核的“驱动程序”肯定有好处 我将尝试解释您所问的驱动程序部分的“移植工作” 根据您所使用的驱动程序的类型,基本上您必须弄清楚它将如何适应当前内核源代码树、它的编译(包括uImage中的.ko

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

将某个驱动程序(仅作为“外部模块”提供)“移植”到单片内核需要付出何种努力


我希望能够运行Vmware工具,禁用可加载模块支持并摆脱initrd bazaar。

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

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

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

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

b、 )继续工作,确保您的驱动程序代码得到编译。[也就是说,最终它将成为单片内核映像(uImage或任何您称之为它的东西)的一部分]。在这种情况下,您必须为您的驱动程序处理Makefile。您可能需要引入一些配置标志来编译驱动程序代码。源代码树中有大量的makefile和驱动程序代码。四处走走,你会得到一个很好的参考,它是如何做的

c、 )确保您的驱动程序代码独立于任何其他代码 可加载内核模块(即不属于 “单片”内核映像)。因为如果你调用你的驱动程序 依赖于 可加载的模块代码可能会导致某些内核 死机/分段故障是一种错误

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

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

f、 )对于h/w驱动程序,我们在驱动程序中有.probe实现 一旦内核找到相应的设备,就会调用它。 如果是s/w驱动程序,我想只有启动和退出

g、 )加载后,您可以像以前一样将其用作可加载的内核模块

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


希望这能有所帮助。

通常所说的“内核模块”更具体地说是一个DKMS模块(至少99.9%的时间)。但无论如何,您仍然需要源代码和对计划在您的机器上使用的linux内核分支的支持。但“转换”源代码需要什么样的努力呢?Linux内核提供了大量代码,这些代码既可以作为DKMS模块编译,也可以嵌入到单片内核中。我猜有一些“通用代码”和一些“模块特定”代码或makefile设置或其他什么。我对这个不太感兴趣,所以我想了解其中涉及的内容。为什么要使用单片内核?这可能有助于回答您的问题。安全性、性能、配置简单、占地面积小、引导速度快。不需要灵活性。