为 Linux 内核编写内置对象?

Jam*_*een 5 c linux linux-kernel

在我搜索 Linux 内核开发的任何地方,我都会得到创建 Linux 内核模块的答案。例子

 /*
* hello?1.c ? The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)

在这里,有 init_module 和 cleanup_module 函数,我了解它们包含在内核初始化和清理时要执行的内容。通过在 makefile 中添加 obj-m += hello-1.c 来制作。

但我不想要这个。我想添加一个内置程序,而不是驱动程序,基本上是一个服务,以方便从内核级别云上传一些数据。编译内核时,我不想要程序的模块选项。

我只理解我应该使用 obj-y 而不是 obj-m 的程序。但是没有编写此类程序的手册。为什么?我错过了什么吗?即使这些程序不是模块,它们是否也具有 init_module 和 cleanup_module 功能?

San*_*h A 5

例如,考虑您的源代码driver/new位于 linux 内核源代码树下。您需要修改Makefile'sdrivers并将new您的模块静态构建到 linux 内核中。

在最后drivers/Makefile添加以下行。

obj-y   += new/
Run Code Online (Sandbox Code Playgroud)

在最后drivers/new/Makefile添加以下行。

obj-y   += hello.o
Run Code Online (Sandbox Code Playgroud)

构建linux内核后。并加载以查看您的模块是否printk使用dmesg命令打印了消息。

注意:当静态构建模块到 linux 中时,更改

int init_module(void)
Run Code Online (Sandbox Code Playgroud)

int __init init_module(void)
Run Code Online (Sandbox Code Playgroud)

和改变

void cleanup_module(void)
Run Code Online (Sandbox Code Playgroud)

void __exit cleanup_module(void)
Run Code Online (Sandbox Code Playgroud)