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 功能?
例如,考虑您的源代码driver/new
位于 linux 内核源代码树下。您需要修改Makefile's
下drivers
并将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)
归档时间: |
|
查看次数: |
1477 次 |
最近记录: |