内核模块编程中的insmod错误

时间:2015-03-13 16:09:52

标签: c linux-kernel

我刚开始使用模块化编程。

以上是我的两个文件:

的hello.c

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

static int hello_init(void)
{
    printk(KERN_ALERT "TEST: Hello world\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "TEST: Good Bye");
}

module_init(hello_init);
module_exit(hello_exit);

生成文件

obj-m += hello.o

KDIR = /usr/src/linux-headers-3.13.0-46-generic

all:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
    rm -rf *.o *.ko *.mod.* *.symvers *.order

这是我的终端输出在insmod命令中显示错误,请帮助。

anubhav@anubhav-Inspiron-3421:~/Desktop/os$ make
make -C /usr/src/linux-headers-3.13.0-46-generic  SUBDIRS=/home/anubhav/Desktop/os modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-46-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-46-generic'
anubhav@anubhav-Inspiron-3421:~/Desktop/os$ insmod hello.ko
insmod: ERROR: could not insert module hello.ko: Operation not permitted

3 个答案:

答案 0 :(得分:1)

如上所述,只有root可以加载或卸载模块。

当您执行hello_init()时,您会在insmod hello中看到打印件,并且当您hello_exit()时看到rmmod hello中的打印件。

答案 1 :(得分:0)

如果启用了安全启动,则较新的内核将不允许插入任意内核模块。因此,您可以在BIOS中禁用安全启动,或者需要对要安装的内核模块进行签名。

安全签名内核模块的步骤:

  1. 创建一个可以导入固件的 X509 证书
  2. 注册刚刚创建的公钥
  3. 签署要安装的模块
  4. 安装模块

您必须是root用户才能执行步骤2和4。详细的过程在漂亮的Ubuntu blog中进行了描述。

答案 2 :(得分:0)

执行cat /proc/sys/kernel/modules_disabled,如果看到结果 1,然后执行echo 'kernel.modules_disabled=1' >> /etc/sysctl.d/99-custom.conf,然后重新启动,然后重试。 ;)BR nu11secur1ty