init_module 和 finit_module 使用方法

glibc好像只实现了init_module的接口,没有实现finit_module的接口,故这里用syscall函数+对应的syscall id来模拟这两个函数

/* 函数原型
int init_module(void *module_image, unsigned long len,const char *param_values);int finit_module(int fd, const char *param_values,int flags);ps:从Debian的man文档中找到的
链接:https://manpages.debian.org/buster/manpages-dev/finit_module.2.en.html
*/
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>#include <sys/syscall.h>
/* 用syscall来定义init_module和finit_module */
#define init_module(image,size,args) syscall(__NR_init_module,image,size,args)
#define finit_module(fd,args,flags)  syscall(__NR_finit_module,fd,args,flags)/* 定义两个函数的调用函数 */
int call_init_module(int fd);
int call_finit_module(int fd);int call_init_module(int fd)
{void *image;int ret = 0,f_size;struct stat stbuf;if((fstat(fd,&stbuf) != 0) || (!S_ISREF(stbuf.st_mode))){perror("fstat error");return ret;}f_size = stbuf.st_size;// open的文文件的长度image = mmap(NULL,f_size,7,1,fd,0); // 7 = PORT_READ|PORT_WRITE|PORT_EXEC   1 = MAP_SHAREDif(image < 0 ){perror("mmap");return 1;}ret = init_module(image,6000,"");munmap(image,f_size);if(ret < 0){perror("init_module");}else{printf("init_module success\n");}return ret;
}int call_finit_module(int fd)
{int ret;ret = finit_module(fd,"",0);if(ret < 0){perror("finit_nodule");}else{printf("finit_module success\n");}return ret;
}int main(void)
{int fd,ret,buf;printf("请选择操作:1.init_module 2.finit_module\n");scanf("%d",&buf);while(getchar() != '\n');fd = open("./hello.ko",O_RDWR);if( fd < 0){perror("open");ret = 1;return ret;}if(buf == 1){ret = call_init_module(fd);}else if(buf == 2){ret = call_finit_module(fd);}else{ret = -1;printf("输入错误:%d 没有这个选项\n",buf);}close(fd);return ret;
}

这里附上测试用内核模块的代码和Makefile

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>MODULE_LICENSE("GPL");static int __init hello_init(void)
{printk(KERN_INFO "start hello\n");return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "exit hello\n");
}module_init(hello_init);
module_exit(hello_exit);
obj-m += hello.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

模块编译前需要安装相应的内核开发包,具体可以百度。

ps:init_module应该也可以通过匿名内存映射的方式去加载模块,推测可以将内存映射出来后,读取ko文件的流,然后复制到映射的内存,再init_module去加载。

finit_module的fd,在某些情况(推测是高版本的内核)下对打开的权限有要求,需要添加 O_CLOEXEC 的标志位,
如:fd = open("./hello.ko",O_RDONLY|O_CLOEXEC);  否则,将无法加载到内核空间

init_modue和finit_module相关推荐

  1. 加载 linux 内核模块卡在 finit_module 系统调用处的问题

    问题描述 在学习内核中 notifier_chain 的过程中,需要编写内核模块测试注册的 die notifier_handler 是否生效,就编写了一个非常简单的内核模块,在内核模块初始化函数中向 ...

  2. linux内核添加c代码,如何从C代码加载Linux内核模块?

    Ciro Santill.. 19 最小的可运行示例 使用这个简单的参数打印机模块在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试. 我们使用init_module/ ...

  3. linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...

    环境:Ubuntu 12.10     学号:SA****199 1.更新内核: 直接安装的系统内核版本一般不是最新,用 uname -a 查看一下 自己的版本,OK,我的是: Linux chenh ...

  4. docker strace ptrace 报错 Operation not permitted 解决方法

    docker中gdb在进行进程debug时,会报错: (gdb) attach 30721 Attaching to process 30721 ptrace: Operation not permi ...

  5. docker 安全性_未来的Docker安全性

    docker 安全性 当我开始在Opensource.com上撰写有关Docker安全性的系列文章时,我说" 容器不包含" . Red Hat和Docker的主要目标之一就是使这一 ...

  6. Linux系统调用表:x86和x86_64

    <Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...

  7. Linux系统调用表(system call table)

    <Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...

  8. strace实现原理:ptrace系统调用

    <GDB调试之ptrace实现原理> <C语言程序调用栈:backtrace+backtrace_symbols+backtrace_symbols_fd> 目录 strace ...

  9. 小谈android/Linux rootkit(基于LKM)

    最近又学习了一下,感觉还有好多东西不知道,以后积累多一点再从新写一个. 在android上捣鼓了一下linux的内核rootkit,虽然中途遇到了无数坑,至今也没有完全写完,打算先好好啃一段时间lin ...

最新文章

  1. 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
  2. js——全选框 checkbox
  3. python中ret是什么意思_数据结构图在python中的应用
  4. 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
  5. c语言rtu crc16,Modbus-RTU-crc16校验方法C语言实现
  6. 纪中A组模拟赛总结(2021.7.12)
  7. 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
  8. scrapy使用(无头)浏览器爬取动态网页
  9. 数据结构之红黑树(三)——删除操作
  10. 第二十四章:页面导航(六) 1
  11. java分形树_java画分形树实例
  12. android快牙原理,快牙的使用原理是什么_快牙怎么使用_3DM手游
  13. 微信数据解密-dat查看
  14. 基于Labview开发TestStand用户界面时ConnectCommand List
  15. 衣米魔兽世界怀旧服:相关网友和测试玩家的提问,王乾亨以及衣米魔兽官方的解释与回答内容精选
  16. Android读取手机存储文件,android 手机存储文件夹学习
  17. 用FFmpeg保存JPEG图片
  18. 全球与中国量身定制生产线市场深度研究分析报告
  19. 高级软件程序员养成记
  20. keil startup_stm32f10x_hd.s编译报错

热门文章

  1. 2021.3.2版本idea配置maven出现org.codehaus.plexus.component.repository.exception.ComponentLookupException
  2. 增加打字音效让码字变成一种享受
  3. 曾经连过的WiFi密码查询
  4. Oracle中游标Cursor介绍
  5. Python3 --- Tornado之模板
  6. 什么鬼,Kubelet 重启之后容器也跟着重启了?
  7. java 控制台实现文本查看,行数可调,回车翻页
  8. BUUCTF:很好的色彩呃?
  9. 《林超:给年轻人的跨学科通识课》导图 06:复杂性科学模型
  10. 新一代超高精度双回路张力控制器