3

我刚刚开始学习 linux 内核模块并尝试编写简单的 Hello world 程序。

所以 mymod.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");
}

生成文件:

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

所以我想知道是什么问题?

PS。操作系统 - Ubuntu 服务器 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 中创建了链接。

4

3 回答 3

2

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

为您的发行版安装 kernel-devel(或类似名称)包,它添加了足够的机制来构建模块。

于 2013-03-30T13:02:48.413 回答
1

你错过了module_initandmodule_cleanup声明,

module_init (module_init);
module_exit (cleanup_module);

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

于 2013-03-31T00:58:01.713 回答
0

因为这个任务需要很多细节,并且需要协调小文件,所以最好使用 UML(用户模式 ​​linux),这样 kprintf(内核 printf)即使在图形环境中也始终输出到终端。

于 2015-03-22T17:28:54.263 回答