为 Linux 内核编写内置对象?
Writing a built in object for 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");
}
这里有 init_module 和 cleanup_module 函数,据我所知,这些函数包含在内核初始化和清理时要执行的内容。
有通过添加
obj-m += 你好-1.c
到生成文件。
但我不想要这个。我想添加一个内置程序,而不是驱动程序,基本上是一种服务,以促进从内核级别云上传一些数据。在编译内核时,我根本不想要程序的模块选项。
我知道对于程序我应该使用 obj-y 而不是 obj-m。但是没有编写此类程序的手册。为什么?我错过了什么吗?这些程序是否也具有 init_module 和 cleanup_module 功能,即使它们不是模块?
例如,假设您的源代码位于 linux 内核源代码树中的 driver/new
下。
您需要修改 drivers
和 new
下的 Makefile's
以将您的模块静态构建到 linux 内核中。
在 drivers/Makefile
下,在末尾添加以下行。
obj-y += new/
在 drivers/new/Makefile
下,在末尾添加以下行。
obj-y += hello.o
构建 linux 内核后。并加载以查看您的模块已使用 dmesg
命令打印了 printk
消息。
注意:静态构建模块时进入linux,更改
int init_module(void)
至
int __init init_module(void)
并更改
void cleanup_module(void)
到
void __exit cleanup_module(void)
参考:
”
--- 3.2 内置对象目标——obj-y
The kbuild Makefile specifies object files for vmlinux
in the $(obj-y) lists. These lists depend on the kernel
configuration.
Kbuild compiles all the $(obj-y) files. It then calls
"$(LD) -r" to merge these files into one built-in.o file.
built-in.o is later linked into vmlinux by the parent Makefile.
The order of files in $(obj-y) is significant. Duplicates in
the lists are allowed: the first instance will be linked into
built-in.o and succeeding instances will be ignored.
Link order is significant, because certain functions
(module_init() / __initcall) will be called during boot in the
order they appear. So keep in mind that changing the link
order may e.g. change the order in which your SCSI
controllers are detected, and thus your disks are renumbered.
Example:
#drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystem and device drivers.
# Each configuration option enables a list of files.
obj-$(CONFIG_ISDN_I4L) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
我到处搜索 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");
}
这里有 init_module 和 cleanup_module 函数,据我所知,这些函数包含在内核初始化和清理时要执行的内容。 有通过添加 obj-m += 你好-1.c 到生成文件。
但我不想要这个。我想添加一个内置程序,而不是驱动程序,基本上是一种服务,以促进从内核级别云上传一些数据。在编译内核时,我根本不想要程序的模块选项。
我知道对于程序我应该使用 obj-y 而不是 obj-m。但是没有编写此类程序的手册。为什么?我错过了什么吗?这些程序是否也具有 init_module 和 cleanup_module 功能,即使它们不是模块?
例如,假设您的源代码位于 linux 内核源代码树中的 driver/new
下。
您需要修改 drivers
和 new
下的 Makefile's
以将您的模块静态构建到 linux 内核中。
在 drivers/Makefile
下,在末尾添加以下行。
obj-y += new/
在 drivers/new/Makefile
下,在末尾添加以下行。
obj-y += hello.o
构建 linux 内核后。并加载以查看您的模块已使用 dmesg
命令打印了 printk
消息。
注意:静态构建模块时进入linux,更改
int init_module(void)
至
int __init init_module(void)
并更改
void cleanup_module(void)
到
void __exit cleanup_module(void)
参考:
” --- 3.2 内置对象目标——obj-y
The kbuild Makefile specifies object files for vmlinux
in the $(obj-y) lists. These lists depend on the kernel
configuration.
Kbuild compiles all the $(obj-y) files. It then calls
"$(LD) -r" to merge these files into one built-in.o file.
built-in.o is later linked into vmlinux by the parent Makefile.
The order of files in $(obj-y) is significant. Duplicates in
the lists are allowed: the first instance will be linked into
built-in.o and succeeding instances will be ignored.
Link order is significant, because certain functions
(module_init() / __initcall) will be called during boot in the
order they appear. So keep in mind that changing the link
order may e.g. change the order in which your SCSI
controllers are detected, and thus your disks are renumbered.
Example:
#drivers/isdn/i4l/Makefile
# Makefile for the kernel ISDN subsystem and device drivers.
# Each configuration option enables a list of files.
obj-$(CONFIG_ISDN_I4L) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o