创建简单的内核模块

4

我是一名有用的助手,专门负责翻译文本。

我刚开始学习Linux内核模块,并尝试编写简单的“Hello World”程序。

因此,我的mod.c文件如下:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author");
MODULE_DESCRIPTION("\"Hello, world!\" minimal module");
MODULE_VERSION("printk");

int init_module(void)
{
    printk("<1>Hello world 1.\n");
    return 0;
} 

void cleanup_module(void)
{
    printk(KERN_ALERT "Goodbye world 1.\n");
}

Makefile:

obj-m += mymod.o 
all:
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

生成输出:

make -C /lib/modules/3.2.0-23-generic-pae/build M=/root modules
make[1]: Entering directory `/usr/src/linux-3.2.42'

  WARNING: Symbol version dump /usr/src/linux-3.2.42/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-3.2.42'

所以它创建了我需要的文件,但当我试图安装时,出现了以下问题:
insmod mymod.ko

我收到了如下输出:
insmod: error inserting 'mymod.ko': -1 Invalid module format

我想知道问题出在哪里?

附注:操作系统 - Ubuntu Server 12.04。内核 - linux 3.2.0-23 pae

更新:

我从kernel.org下载了3.2.42内核文件并放到了/usr/src目录下,然后运行了'make defconfig && make prepare'和'make modules_prepare'命令。同时,我还在/lib/modules/3.2.0-23-generic-pae/build目录下创建了一个链接。


dmesg 中有报告任何错误吗? - Mat
你在那个源代码树中实际编译过内核吗? - CodeClown42
@Sukminder,module_init(function)init_module()等之间没有区别。我也尝试过module_init,结果相同。 - Viktor K
Ubuntu 16.04上的最小可运行示例:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/d45ceace5d6ea114d9fab0dca1e66d08b64661ba/host - Ciro Santilli OurBigBook.com
3个回答

3

这是正在运行的内核源代码树吗?如果不是,它会失败。

为您的发行版安装kernel-devel(或类似命名的)软件包,它将添加足够的机制来构建针对其的模块。


在编译内核时,我遇到了错误“安装ncurses(ncurses-devel)并重试”。在某些论坛上,我发现需要安装libncurses5。因此,我已经安装了它,并且编译完成后的输出与我的问题相同。 - Viktor K
kernel-devel是Fedora的软件包。对于Ubuntu,我已经安装了module-assistant。 - Viktor K

1
你错过了module_initmodule_cleanup的声明,
module_init (module_init);
module_exit (cleanup_module);

否则它将没有定义的入口点,也不会加载。

0
由于此任务需要协调许多细节和小文件,最好使用UML(用户模式Linux),以便kprintf(内核printf)始终输出到终端,即使在图形环境中也是如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接