【Linux】insmod module

    科技2022-07-16  105

    insmod module_name.ko

    问题描述求解过程总结

    问题描述

    写好了hellomod.c和Makefile文件,使用make命令运行Makefile文件,生成模块hellomod.ko,下图可以看到生成了对应的文件。 使用命令insmod hellomod.ko插入模块时,出现如下错误:

    求解过程

    刚开始按照自己的理解,对于“操作不被允许”的错误很大概率是权限问题,所以切换成管理员模式执行命令[直接在命令前加sudo或者使用su进入管理员模式],但是仍然提示错误。

    然后上网搜索了问题的解决办法,主要问题集中在文件内容有误、权限不足和内核版本不匹配。排除了前两者,但由于指向后者的证明不多,所以一直在网上搜索其他办法,仍然不奏效。后来在同学的帮助下,看到了stackoverflow上的一个帖子。 use the first answer in this link: 这里我使用了它提出的第一个方法,进入电脑的BIOS界面,将Secure Boot选项改成Disabled,然后再输入命令sudo insmod hellomod.ko。修改之后,我仍然没有成功。这时的错误提示变成了: insmod: ERROR: could not insert module hellomod.ko: Invalid module format

    然后我大概知道哪里出问题了,使用dmesg验证了我的想法,编译模块时使用的内核版本与当前运行系统的内核版本不对应!找到问题所在,接下来就很好解决了。

    这个时候可以进入目录/lib/modules,使用ls查看自己是否有需要的内核版本。再使用uname -r查看当前运行系统的内核版本。这里我的内核版本已经是编译模块时需要的,所以问题解决啦!

    如果此时内核版本不对应,可以直接在Makefile里把 LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) 修改成自己的需要的版本 LINUX_KERNEL_PATH := /usr/src/linux-headers-5.4.0-48-generic

    可以看到,hellomod模块成功插入了。

    总结

    上网搜索时,已经将具体问题定位到文件内容、权限和内核版本上,在排除了前两者的前提下,应该往内核版本方向找问题,可能能减少求解问题的时间。

    Processed: 0.013, SQL: 8