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内核模块?相关推荐

  1. uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解

    关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...

  2. 向linux内核增加新的系统调用,为linux内核添加新的系统调用

    为linux内核添加新的系统调用 作者:李志勇 更多精彩: 更多精彩: 开发平台:x86 ubuntu 目标平台:S3C6410 linux3.4.4 一.    打开内核源码目录下arch/arm/ ...

  3. linux内核添加系统调用(详细)

    linux内核添加系统调用(详细) 说在前面: 这是我第五次编译内核,分别踩了很多坑.中途问过wz佬,佬让我用qemu.我还是最后换ubuntu虚拟机跑了.现在已经有点emo了. 这篇博客是我第五次的 ...

  4. linux内核添加模块,linux中添加内核模块

    1.  内核模块简介 Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢? 方 法 一 : 把 所有的 组 件都 编译 进 内 ...

  5. 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. Linux内核移植漫谈——你不是第一个想移植Linux内核的人

    Jack:在读大学的时候我想过移植Linux操作系统. 我:现在呢? Jack:我还是想移植Linux操作系统.你教我移植吧. 我:你知道什么是"Linux内核移植"吗? Jack ...

  7. 在Ubuntu下使用QEMU搭建arm开发环境(三)使用u-boot加载Linux内核

    嵌入式启动概述 嵌入式boot loader 功能类似于PC的BIOS.硬件检测是否正常 加载操作系统镜像到RAM 设置不同的启动方式 常见的启动方式 NOR/NAND flash启动 从SD卡启动 ...

  8. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录 参考文章: (1)如何解决编译linux内核(解决声卡问题),遭遇fata ...

  9. Linux内核设计与实现(1)第一章:Linux内核简介

    Linux内核设计与实现(1)第一章:Linux内核简介 1. linux历史及与Unix关系 2. 内核组成 3. 用户空间和内核空间 4. 系统调用 5. 中断 6. Unix强大的原因 7. L ...

  10. 嵌入式(iMX6Q)TFTP加载 Linux 内核与设备树NFS挂载根文件系统

    配置实现过程: 嵌入式(iMX6Q)TFTP加载 Linux 内核与设备树 注:bootm对应启动uImage,bootz对应启动zImage setenv bootcmd "tftp 0x ...

最新文章

  1. python装饰器学习
  2. python下载不了-python3下载不了
  3. hdu4266(三维凸包模板题)
  4. Hash Length Extension Attacks
  5. 远程桌面时提示凭证不工作问题的终极解决办法
  6. Java SimpleTimeZone setEndRule()方法与示例
  7. springboot中日志配置
  8. canvas需要gpu_【前端冷知识】你了解Canvas的渲染上下文吗?
  9. python中set函数_python中set()函数简介及实例解析
  10. SQL的Join使用图解教程
  11. 猜数游戏--MOOC中习题
  12. 台式电脑打开计算机只有c盘是咋回事,电脑只有C盘是怎么回事
  13. Chorme 模拟分辨率设置
  14. 多点生活的分布式服务框架DSF
  15. CSS基础语法和盒模型
  16. html 图片摆动效果,CSS摆动/摇动效果
  17. 只有你能听见(Calling you)2
  18. 论文笔记 Stochastic Gradient Hamiltonian Monte Carlo (SGHMC)
  19. 这些大文件传输工具总结,建议外贸人士收藏
  20. OAI——单虚拟机多basic核心网部署

热门文章

  1. 操作系统常用词典(二)
  2. 2021年大数据Spark(六):环境搭建集群模式 Standalone
  3. Windows系统下安装Thrift的方法
  4. Swoole入门介绍
  5. C++ 判断字符串是否为空
  6. getCacheDir() 和 getFilesDir() 的区别
  7. Scala函数式编程(三) scala集合和函数
  8. 知识图谱学习笔记(1)
  9. oracle数据库 export,转:Oracle数据库的备份方法——使用export作为备份
  10. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)