linux内核添加c代码,如何从C代码加载Linux内核模块?
Ciro Santill..
19
最小的可运行示例
使用这个简单的参数打印机模块在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试.
我们使用init_module/ finit_module和remove_module Linux系统调用.
Linux内核为模块插入提供了两个系统调用:
init_module
finit_module
和:
man init_module
文件:
finit_module()系统调用类似于init_module(),但是从文件描述符fd读取要加载的模块.当内核模块的真实性可以从它在文件系统中的位置确定时,它是有用的; 在可能的情况下,可以避免使用加密签名的模块来确定模块的真实性的开销.param_values参数与init_module()相同.
glibc似乎没有为它们提供C包装器,所以我们只创建自己的包装器syscall.
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#define init_module(module_image, len, param_values) syscall(__NR_init_module, module_image, len, param_values)
#define finit_module(fd, param_values, flags) syscall(__NR_finit_module, fd, param_values, flags)
int main(int argc, char **argv) {
const char *params;
int fd, use_finit;
size_t image_size;
struct stat st;
void *image;
/* CLI handling. */
if (argc < 2) {
puts("Usage ./prog mymodule.ko [args="" [use_finit=0]");
return EXIT_FAILURE;
}
if (argc < 3) {
params = "";
} else {
params = argv[2];
}
if (argc < 4) {
use_finit = 0;
} else {
use_finit = (argv[3][0] != '0');
}
/* Action. */
fd = open(argv[1], O_RDONLY);
if (use_finit) {
puts("finit");
if (finit_module(fd, params, 0) != 0) {
perror("finit_module");
return EXIT_FAILURE;
}
close(fd);
} else {
puts("init");
fstat(fd, &st);
image_size = st.st_size;
image = malloc(image_size);
read(fd, image, image_size);
close(fd);
if (init_module(image, image_size, params) != 0) {
perror("init_module");
return EXIT_FAILURE;
}
free(image);
}
return EXIT_SUCCESS;
}
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#define delete_module(name, flags) syscall(__NR_delete_module, name, flags)
int main(int argc, char **argv) {
if (argc != 2) {
puts("Usage ./prog mymodule");
return EXIT_FAILURE;
}
if (delete_module(argv[1], O_NONBLOCK) != 0) {
perror("delete_module");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Busybox源解释
Busybox提供insmod_main,因为它是为极简主义而设计的,我们可以尝试从那里推断它是如何完成的.
在版本1.24.2上,入口点是IF_FEATURE_2_4_MODULES功能modutils.c.
它bb_init_module是对较旧的Linux内核2.4模块的可选支持,因此我们暂时可以忽略它.
那只是转发bb_init_module功能mmap.
try_to_mmap_module 尝试两件事:
image_size文件到内存通过.ko.
这总是设置malloc为xmalloc_open_zipped_read_close文件的大小作为副作用.
如果失败,try_to_mmap_module 将文件存入内存image.
如果文件是zip文件,则此函数可选择首先解压缩文件,否则只对其进行malloc.
我不明白为什么这个拉链业务已经完成,因为我们甚至不能依赖它,因为""它似乎并没有解压缩.
终于来了电话:
init_module(image, image_size, options);
insmod file.elf放在内存中的可执行文件在哪里,init_module如果我们调用ulibc没有进一步的参数,则选项就是这样.
init_module 以上提供:
#ifdef __UCLIBC__
extern int init_module(void *module, unsigned long len, const char *options);
extern int delete_module(const char *module, unsigned int flags);
#else
# include
# define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
#endif
man init_module是一个嵌入式libc实现,它似乎提供syscall.
如果它不存在,我认为glibc是假定的,但正如init_module所说:
glibc不支持init_module()系统调用.glibc头文件中没有提供声明,但是,通过历史的怪癖,glibc会为此系统调用导出ABI.因此,为了使用这个系统调用,在代码中手动声明接口就足够了; 或者,您可以使用syscall(2)调用系统调用.
BusyBox明智地遵循finit_moduleglibc提供的建议和用法,并提供用于系统调用的C API.
linux内核添加c代码,如何从C代码加载Linux内核模块?相关推荐
- uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解
关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...
- 向linux内核增加新的系统调用,为linux内核添加新的系统调用
为linux内核添加新的系统调用 作者:李志勇 更多精彩: 更多精彩: 开发平台:x86 ubuntu 目标平台:S3C6410 linux3.4.4 一. 打开内核源码目录下arch/arm/ ...
- linux内核添加系统调用(详细)
linux内核添加系统调用(详细) 说在前面: 这是我第五次编译内核,分别踩了很多坑.中途问过wz佬,佬让我用qemu.我还是最后换ubuntu虚拟机跑了.现在已经有点emo了. 这篇博客是我第五次的 ...
- linux内核添加模块,linux中添加内核模块
1. 内核模块简介 Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢? 方 法 一 : 把 所有的 组 件都 编译 进 内 ...
- 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- Linux内核移植漫谈——你不是第一个想移植Linux内核的人
Jack:在读大学的时候我想过移植Linux操作系统. 我:现在呢? Jack:我还是想移植Linux操作系统.你教我移植吧. 我:你知道什么是"Linux内核移植"吗? Jack ...
- 在Ubuntu下使用QEMU搭建arm开发环境(三)使用u-boot加载Linux内核
嵌入式启动概述 嵌入式boot loader 功能类似于PC的BIOS.硬件检测是否正常 加载操作系统镜像到RAM 设置不同的启动方式 常见的启动方式 NOR/NAND flash启动 从SD卡启动 ...
- 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录 参考文章: (1)如何解决编译linux内核(解决声卡问题),遭遇fata ...
- Linux内核设计与实现(1)第一章:Linux内核简介
Linux内核设计与实现(1)第一章:Linux内核简介 1. linux历史及与Unix关系 2. 内核组成 3. 用户空间和内核空间 4. 系统调用 5. 中断 6. Unix强大的原因 7. L ...
- 嵌入式(iMX6Q)TFTP加载 Linux 内核与设备树NFS挂载根文件系统
配置实现过程: 嵌入式(iMX6Q)TFTP加载 Linux 内核与设备树 注:bootm对应启动uImage,bootz对应启动zImage setenv bootcmd "tftp 0x ...
最新文章
- python装饰器学习
- python下载不了-python3下载不了
- hdu4266(三维凸包模板题)
- Hash Length Extension Attacks
- 远程桌面时提示凭证不工作问题的终极解决办法
- Java SimpleTimeZone setEndRule()方法与示例
- springboot中日志配置
- canvas需要gpu_【前端冷知识】你了解Canvas的渲染上下文吗?
- python中set函数_python中set()函数简介及实例解析
- SQL的Join使用图解教程
- 猜数游戏--MOOC中习题
- 台式电脑打开计算机只有c盘是咋回事,电脑只有C盘是怎么回事
- Chorme 模拟分辨率设置
- 多点生活的分布式服务框架DSF
- CSS基础语法和盒模型
- html 图片摆动效果,CSS摆动/摇动效果
- 只有你能听见(Calling you)2
- 论文笔记 Stochastic Gradient Hamiltonian Monte Carlo (SGHMC)
- 这些大文件传输工具总结,建议外贸人士收藏
- OAI——单虚拟机多basic核心网部署
热门文章
- 操作系统常用词典(二)
- 2021年大数据Spark(六):环境搭建集群模式 Standalone
- Windows系统下安装Thrift的方法
- Swoole入门介绍
- C++ 判断字符串是否为空
- getCacheDir() 和 getFilesDir() 的区别
- Scala函数式编程(三) scala集合和函数
- 知识图谱学习笔记(1)
- oracle数据库 export,转:Oracle数据库的备份方法——使用export作为备份
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)