内核是如何运行ko文件的--insmod命令

这篇具有很好参考价值的文章主要介绍了内核是如何运行ko文件的--insmod命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内核是如何运行ko文件的–insmod命令



insmod详细分析

insmod命令将文件加载到Linux系统中运行。那Linux系统是如何加载的文件呢?加载ko文件使用的是insmod命令,insmod命令做了哪些事情呢?实际上,命令本质上是一个可执行程序,也是有源码的。我们来看下insmod命令的源码。

打开busybox源码busybox/modutils/insmod.c文件,找到以下代码。

int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int insmod_main(int argc UNUSED_PARAM, char **argv)
{
    char *filename;
    int rc;

    /* Compat note:
     * 2.6 style insmod has no options and required filename
     * (not module name - .ko can't be omitted).
     * 2.4 style insmod can take module name without .o
     * and performs module search in default directories
     * or in $MODPATH.
     */

    IF_FEATURE_2_4_MODULES(
        getopt32(argv, INSMOD_OPTS INSMOD_ARGS);
        argv += optind - 1;
    );

    filename = *++argv;
    if (!filename)
        bb_show_usage();

    rc = bb_init_module(filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
    if (rc)
        bb_error_msg("can't insert '%s': %s", filename, moderror(rc));

    return rc;
}
int FAST_FUNC bb_init_module(const char *filename, const char *options)
{
    size_t image_size;
    char *image;
    int rc;
    bool mmaped;

    if (!options)
        options = "";

//TODO: audit bb_init_module_24 to match error code convention
#if ENABLE_FEATURE_2_4_MODULES
    if (get_linux_version_code() < KERNEL_VERSION(2,6,0))
        return bb_init_module_24(filename, options);
#endif

    /*
     * First we try finit_module if available.  Some kernels are configured
     * to only allow loading of modules off of secure storage (like a read-
     * only rootfs) which needs the finit_module call.  If it fails, we fall
     * back to normal module loading to support compressed modules.
     */
# ifdef __NR_finit_module
    {
        int fd = open(filename, O_RDONLY | O_CLOEXEC);
        if (fd >= 0) {
            rc = finit_module(fd, options, 0) != 0;
            close(fd);
            if (rc == 0)
                return rc;
        }
    }
# endif

    image_size = INT_MAX - 4095;
    mmaped = 0;
    image = try_to_mmap_module(filename, &image_size);
    if (image) {
        mmaped = 1;
    } else {
        errno = ENOMEM; /* may be changed by e.g. open errors below */
        image = xmalloc_open_zipped_read_close(filename, &image_size);
        if (!image)
            return -errno;
    }

    errno = 0;
    init_module(image, image_size, options);
    rc = errno;
    if (mmaped)
        munmap(image, image_size);
    else
        free(image);
    return rc;
}
init_module与finit_module均为系统调用
#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
#if defined(__NR_finit_module)
# define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags)
#endif

在正点原子阿尔法开发板中查看insmod使用什么方法:

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




static int hello_init(void){
#ifndef DEBUG

    printk("no def DEBUG\n");
#else
    printk(" def DEBUG\n");
#endif
    dump_stack();
    return 0;

}


static void hello_exit(void){

    printk("hello exit!!!\n");
    

}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Paranoid");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");

dump_stack()
;函数打印调用关系

内核是如何运行ko文件的--insmod命令

所以可知使用的是finit_module
insmod命令流程

insmod_main->bb_init_module->finit_module

使用finit_module写一个自己的命令

myinsmod.c

#include <stdio.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>

# define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags)
int main(int argc,char *argv[]){
    int fd;
    int ret;
    int fd = open(argv[1], O_RDONLY | O_CLOEXEC);
        if (fd < 0) {
            printf("open error\n");
            return -1;
        }
        ret = finit_module(fd, "", 0) ;

        return ret;
}

交叉编译器编译

arm-linux-gnueabihf-gcc myinsmod.c -o myinsmod

使用自己的命令来安装驱动

./myinsmod a.ko

内核是如何运行ko文件的--insmod命令

结果与insmod相同

使用init_module来实现自己的命令

init_insmod.c

#include <stdio.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>

#define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags)

int main(int argc,char *argv[]){
    int fd;
    int ret;
    size_t image_size;
    char *image;
    struct stat statbuf;
    fd = open(argv[1], O_RDONLY | O_CLOEXEC);
        if (fd < 0) {
            printf("open error\n");
            return -1;
        }

    fstat(fd,&statbuf);

    image_size = statbuf.st_size;

    image = malloc(image_size);
    read(fd,image,image_size);

    ret = init_module(image, image_size, "");
    if(ret <0){
        printf("init_module errno\n");
    }else{
        printf("init_module success\n");
    }
    free(image);
    return ret;
}
arm-linux-gnueabihf-gcc init_insmod.c -o initinsmod

内核是如何运行ko文件的--insmod命令文章来源地址https://www.toymoban.com/news/detail-493698.html

到了这里,关于内核是如何运行ko文件的--insmod命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 命令行如何运行 JAR 文件

    ​ 最近有位老哥问了一个问题,说如果将java的jar文件在Android中执行?这个其实很简单的一个问题,直接写个App放里面不就可以了么?但是人家说没有App,直接使用命令行去运行。说明这个需求的时候,把我给整懵了,没有很好的思路去想这个问题,所幸查了查资料,发现其

    2024年02月12日
    浏览(55)
  • linux: 配置ko文件开机自动

    在CentOS 7中,要配置一个 .ko (内核模块)文件以便在开机时自动加载,可以按照以下步骤操作: 确认模块兼容性 :确保您的 .ko 文件与正在运行的内核版本兼容。可以使用 uname -r 命令来查看您的内核版本。 手动加载模块 :在自动加载之前,应该先手动加载模块以确保它能

    2024年02月19日
    浏览(48)
  • 如何编译linux驱动ko

    本文描述了liunx驱动ko的编译方法,其中单编驱动ko是本文的重点。 什么是ko? 在Linux中一个.ko文件就是一个模块文件。 linux提供了一种称为模块(Module)的机制,模块具有以下特点: 1、模块自身不被编译到内核映像中,从而不影响内核映像的大小 2、一旦模块被加载,模块和

    2024年02月03日
    浏览(23)
  • 如何解决 “node --max-old-space-size=10240“ 不是内部或外部命令,也不是可运行的程序或批处理文件。报错问题

      一、FATAL ERROR: Zone Allocation failed - process out of memory      今天早上起来打包vue项目时发现一直打包不了,还报了一个 数据错误:区域分配失败-进程内存不足; 排查之后发现是: node内存溢出的问题。 为了解决这个问题,我运行了2个命令之后就可以打包了 1、首先全局下载

    2024年02月16日
    浏览(38)
  • 驱动程序开发:Buildroot根文件系统构建并加载驱动文件xxx.ko测试

      buildroot 构建的根文件系统相对比较齐全,很多东西需要它会自行添加,比如 lib 库文件。并且,如果单纯使用busybox的话,在后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐,而buildroot可以为

    2024年02月13日
    浏览(36)
  • 关于vscode连接服务器后运行ipynb文件select kernel找不到内核的解决方法

    在vscode中连接服务器后,运行ipynb文件,要求选择\\\"…ipynb\\\"的内核时,找不到任何可用的内核,如下图所示。 原因: 本地安装的jupyter版本太低,更新一下 即可。 没有更新前,jupyter的图标是暗的,更新后才变亮。此时再选择kernel时: 出现了多个可选择的选项。 主要参考:h

    2024年02月16日
    浏览(51)
  • 如何解决’telent’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。正在连接127.0.0.1无法打开到主机的连接。 在端口 23: 连接失败

    今天使用Telnet远程连接服务时遇到关于Telnet的两个问题, 一、 首先是“elent’ 不是内部或外部命令,也不是可运行的程序 或批处理文件”,这个问题比较好解决,就是电脑上没有开启这个功能,导致命令不可用,解决办法是首先在win10控制面板中的程序和功能,开启了teln

    2024年02月06日
    浏览(104)
  • RK3568驱动指南|驱动基础进阶篇-进阶1 编译进内核的驱动系统是如何运行的?

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网

    2024年02月01日
    浏览(53)
  • (Python)Jupyter Notebook无法运行代码,且提示error和自动保存失败时如何操作?无法链接内核?

    目录 一、报错情形 1、运行代码时跳转下一行,无法执行代码。 2、在修改文件名是提示失败,出现“error”字样。 二、深层原因 三、解决方案 四.建议使用原环境 Anaconda的Jupyter Notebook作为优秀的网页编辑器,非常适用于编写Python程序,但往往可能因安装版本不兼容等原因而

    2024年02月07日
    浏览(49)
  • 【Python】运行其他程序、命令和文件

    有时候我们需要通过Python来运行某些程序、命令或者打开文件。这里将介绍一些常见的方法。 2.10.1 os.startfile(文件、程序) 这个函数可以直接打开一个文件或者程序,就像双击一样。非阻塞。 2.10.2 os.system(文件、程序、命令) 使用os.system()函数可以执行一个系统命令,并返回一

    2024年02月07日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包