【问题标题】:Using sysctl interface from kernel module从内核模块使用 sysctl 接口
【发布时间】:2018-01-08 12:18:21
【问题描述】:

我正在尝试从内核模块访问 tcp_input.c 中定义的 tcp_pacing_ss_ratio。可以在用户空间中使用 sysctl 命令修改该变量。 但是它不会被导出,也不能直接从模块中引用。

从内核模块访问 sysctl 条目的最简单方法是什么?

【问题讨论】:

    标签: c linux linux-kernel kernel


    【解决方案1】:

    来自sysctl(2) manpage

    使用这个系统调用有 早已灰心丧气,如此不受欢迎,很可能 在未来的内核版本中消失。从 Linux 2.6.24 开始,使用 此系统调用会导致内核日志中出现警告。去掉它 现在从您的程序中; 改用 /proc/sys 接口

    在您的情况下,这将是 /proc/sys/net/ipv4/tcp_pacing_ss_ratio,您可以使用 kernel_write 编写。查看sysctl(2)'s implementation for example usage

    【讨论】:

    • 我试过 filp_open + kernel_write 和 vfs_write。两者都会导致内核恐慌。我的理解是该变量是位于 init_net.sysctls 的红黑树的一部分。我似乎找不到任何用于查找的功能。 #include 对我有何帮助?
    • sysctl(2) 系统调用本身使用kernel_write,所以你可能做错了什么......如果你包含标题,你应该能够直接获取/设置init_net.ipv4.sysctl_tcp_pacing_ss_ratio。我倾向于认为那会是“好的”,因为 procfs 助手似乎就是这样做的。我认为正确的方法是kernel_write
    • 我可能做错了什么,我稍后再看看。能否请您指出设置 init_net.ipv4.sysctl_tcp_pacing_ss_ratio 的函数,我似乎找不到它们。
    • 这是一个普通的int。您可以像使用任何普通变量 (init_net.ipv4.sysctl_tcp_pacing_ss_ratio = 200) 一样使用它。
    • 我终于通过使用 file_open_root 打开 "sys/net/ipv4/tcp_pacing_ss_ratio" 并使用 vfs_write 编写来让它工作。感谢您建议直接写入文件。
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多