创建简单的内核模块

时间:2013-03-30 12:40:02

标签: linux-kernel c

我刚刚开始学习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 Server 12.04。内核 - linux 3.2.0-23 pae

更新:

我已从kernel.org内核3.2.42下载并将其放入/ usr / src并执行'make defconfig&amp;&amp; make prepare','make modules_prepare'。我也在/lib/modules/3.2.0-23-generic-pae/build中创建了链接。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您错过了module_initmodule_cleanup声明,

module_init (module_init);
module_exit (cleanup_module);

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

答案 2 :(得分:0)

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