0

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

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

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

4

1 回答 1

0

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

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

根据您使用的驱动程序类型,基本上您必须弄清楚它如何适合当前的内核源代码树、它的编译(在 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 内核树中类似设备驱动程序的源代码,看看它们是如何运行的。

希望这可以帮助。

于 2013-12-04T10:17:59.800 回答