c - 如何确保函数在内核模块中运行?

标签 c linux-kernel kernel-module

我正在尝试修改this项目包含对 dd 的调用以删除磁盘的 LUK header 。

这是我所拥有的:

static void panic_time(struct usb_device *usb)
{
    int i;
    struct device *dev;
    char *dd_argv[] = {
        "/bin/bash",
        "-c",
        "/bin/dd if=/dev/urandom of=/dev/sda5 bs=512 count=4096",
        NULL
    };

    pr_info("shredding...\n");
    for (i = 0; remove_files[i] != NULL; ++i) {
        char *shred_argv[] = {
            "/usr/bin/shred",
            "-f", "-u", "-n",
            shredIterations,
            remove_files[i],
            NULL,
        };
        call_usermodehelper(shred_argv[0], shred_argv,
                    NULL, UMH_WAIT_EXEC);
    }

    pr_info("...done.\n");

    pr_info("deleting LUKs header...\n");

    call_usermodehelper(dd_argv[0], dd_argv, NULL, UMH_WAIT_PROC);

    pr_info("...done.\n");

    pr_info("Syncing & powering off.\n");
    for (dev = &usb->dev; dev; dev = dev->parent)
        mutex_unlock(&dev->mutex);
    kernel_power_off();
}

但是这不起作用。系统要么无法运行dd命令,要么在调用完成之前关闭。

我知道为 call_usermodehelper 提供的其他选项,即 UMH_WAIT_EXEC - 但我已经使用了所有 4 个选项。

  1. 如何确保内核模块有权运行 dd 命令?
  2. 如何延迟关闭以等待 dd 命令完成?

最佳答案

我不明白你是如何在 dd run 完成之前结束系统关闭的。调用后有 0 次错误检查,因此您无法判断最初发生了什么。

整个模块看起来很奇怪

如果无论如何都要废弃存储,我怀疑有一种很好的方法来创建一次性 key 并将其存储在内存中(从而使废弃 header 的意义变得毫无意义)。

另请注意,尽管它声称该模块不会报废内存。

关于c - 如何确保函数在内核模块中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788096/

相关文章:

c - C 中的 Break 命令无法正常工作?

c-copy_to_user : how to read a struct type value of kernel space in the user space?

c - 哪个系统调用号的头文件是正确的?

c - "Attach"来自 Linux 内核/内核模块的用户空间进程

c - 为什么我必须使用 gnu99 而不是 c99 来编译内核模块?

php - php中的c中有没有像clock()这样的函数?

c++ - 如何在 C 函数中使用 std::vector

c - 将用户空间代码移植到内核空间

call_usermodehelper 无法正常工作

c - 使用switch语句调用函数不起作用