【问题标题】:Execute shell command in kernel module在内核模块中执行 shell 命令
【发布时间】:2012-06-25 16:50:41
【问题描述】:

是否可以在内核模块中执行 shell 命令。我知道我们可以在用户空间 C 代码中使用 system 子程序来实现。
我正在调试一个有内存泄漏问题的内核模块。在无限循环中执行 insmod 和 rmmod module.ko 后,系统会在几分钟内用 8G RAM 耗尽内存。
在调用负责释放内存的 API 之前和之后使用 free 命令了解内存状态会很有帮助,这样我就可以知道 API 是否正常工作。
这就是我调试的方式。如果有其他方法,请分享。

【问题讨论】:

    标签: c linux linux-kernel driver


    【解决方案1】:

    您可以使用call_usermodehelper 函数。在LXR#1LXR#2查看如何使用它的示例。

    更新:

    argv[0] = "/bin/bash";
    argv[1] = "-c";
    argv[2] = "/usr/bin/free";
    argv[3] = NULL;
    
    envp[0] = "HOME=/";
    envp[1] = "TERM=linux";
    envp[2] = "PATH=/sbin:/usr/sbin:/bin:/usr/bin";
    envp[3] = NULL;
    
    call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
    

    【讨论】:

      【解决方案2】:

      您不能内核模块中运行 shell 命令。内核模块中的代码可以使命令运行,但它会在普通用户进程中运行。

      free 对内核内存泄漏帮助不大。
      最好将所有分配和释放都封装在内核代码中,并维护分配内存的计数器。

      【讨论】:

      • 问题是关于从内核运行 shell 命令而不是关于如何检测内存泄漏 ;)
      • @IlyaMatveychikov,第一部分直接回答了这个问题。他确实提到他想运行free 来处理内存泄漏,所以我也解决了这个问题。
      【解决方案3】:

      无法从内核内部运行 shell 命令。您可以改为通过调用合适的 procfs API 来读取 /proc/meminfo 文件来读取 /proc/meminfo 文件。该虚拟文件包含有关系统内存的有用内存统计信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        相关资源
        最近更新 更多