【问题标题】:How to create own sysctl parameter如何创建自己的 sysctl 参数
【发布时间】:2018-09-02 17:01:20
【问题描述】:

在 4.10.0-38-generic 版本中,ctl_table 结构中没有 ctl_name 字段 我找到了教程https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwie4Zz_5ZrdAhVKiaYKHRqsDiwQFjABegQICRAC&url=https%3A%2F%2Fsar.informatik.hu-berlin.de%2Fteaching%2F2012-s%2F2012-s%2520Operating%2520Systems%2520Principles%2Flab%2Flab-1%2Fsysctl_.pdf&usg=AOvVaw0mJdbT9E3lP2k3AQOGgzQz

但是有这个字段的用法

能否给我一个 ctl_table 在版本 4.10.0-38-generic 的使用示例

我尝试实现:

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

#define SUCCESS (0)


MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kasparyants George");
MODULE_DESCRIPTION("A simple Linux driver");
MODULE_VERSION("0.1");


static int global_var1 = 1;
static int global_var2 = 1;
static int min_val = 0;
static int max_val = 5;
static struct ctl_table_header* header;


static struct ctl_table child_ctl_table[] = {
  {
    .procname = "sample_value1",
    .data = &global_var1,
    .maxlen = sizeof(int),
    .mode = 0644,
    .proc_handler = &proc_dointvec_minmax,
    .extra1 = &min_val,
    .extra2 = &max_val
  }, 
  {
    .procname = "sample_value2",
    .data = &global_var2,
    .maxlen = sizeof(int),
    .mode = 0644,
    .proc_handler = &proc_dointvec_minmax,
    .extra1 = &min_val,
    .extra2 = &max_val
  },
  {}
};


static struct ctl_table parent_ctl_table[] = {
  {
    .procname = "mykernel",
    .mode = 0555,
    .child = child_ctl_table
  }, 
  {}
};


static int __init sysctl_module_init(void) {
  if (!(header = register_sysctl_table(parent_ctl_table))) {
    printk(KERN_ALERT "Error: Failed to register parent_ctl_table\n");
    return -EFAULT;
  }
  printk(KERN_INFO "Start global_var1 = %d, global_var2 = %d\n", global_var1, global_var2);
  return SUCCESS;
}


static void __exit sysctl_module_exit(void) {
  printk(KERN_INFO "End global_var1 = %d, global_var2 = %d\n", global_var1, global_var2);
}


module_init(sysctl_module_init);
module_exit(sysctl_module_exit);

但时不时会出现故障。

另外,我还有一个问题: 在内核源代码中,有评论指出不推荐使用此参数...为什么?
如果没有此字段,如何使用参数层次结构? 请帮忙!

【问题讨论】:

  • 在 Stack Overflow 上,我们希望代码在问题帖子中。指向外部资源的链接不足。请edit您发布并将代码添加到其中。您可以使用Ctrl+K{} 按钮格式化代码。

标签: c linux-kernel


【解决方案1】:

修复了我的错误
我们应该在退出函数中取消注册ctl_table 但是还有一个关于“child”字段的问题...

【讨论】:

  • 由于此帖包含问题,最好将其添加到问题帖中。在 Stack Overflow 上的回答旨在提出解决方案,而不是提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2018-08-19
  • 2023-04-03
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多