【问题标题】:Developing SYSCALL in linux to access the /proc/loadavg在linux中开发SYSCALL来访问/proc/loadavg
【发布时间】:2022-01-25 05:19:59
【问题描述】:

我想在 Linux 中开发一个 SYSCALL 来读取 /proc/loadavg 的输出并打印第一列。

这个想法是从 cat /proc/loadavg 打印 CPU 负载的第一个值,即 0.01 0.50 0.10 1/25 1800 使用系统调用

例如:

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

 int main() {
 printf("SYSCALL OUTPUT: %s\t", syscall(223, 1));  //(223) - syscall number (1) - for first cpu load

 return 0;
 } 

OUTPUT - SYSCALL OUTPUT: 0.01

到现在为止,利用网上的资料,我做了一个简单的Hello World 类的SYSCALL:

 #include <linux/kernel.h>    
 #include <linux/syscalls.h>   

 SYSCALL_DEFINE0(newprint)
 {
 printk("SYSCALL: Hello World!\n");

 return 0;
 }

但是,我不知道如何构建一个复杂的系统调用来做我想做的事情。因此,我正在寻找一些帮助,包括 -

  1. 如何在 linux 中创建复杂的系统调用?
  2. 如何从~/kernel/sched/loadavg.c 导入函数以在我的SYSCALL 程序中使用?
  3. 在能够执行上述步骤后,如何编译 syscall 程序以获得像普通 c 程序一样的输出。

【问题讨论】:

  • (1) 获取有关设备驱动程序编写的书籍/教程和/或查看Documentation/ 和现有设备驱动程序的源代码以用作模型。 (2) 如果没有一些链接器技巧,你想要的符号需要有EXPORT_SYMBOL,所以你不能,除非你修改 loadavg.c 添加它们并重建内核。然后,您必须启动那个 custom 内核。或者,您可以将系统调用设为内置而不是模块。 (3) 见 (1)
  • proc 虚拟文件系统使内核值可用于用户空间。您无法在内核中读取 proc,也没有理由读取这些值,因为这些值是直接可用的。

标签: c linux linux-kernel system-calls


【解决方案1】:

你需要区分两个区域:

  • 内核空间和
  • 用户空间。

新的系统调用将在内核空间中实现。一旦实现了新的系统调用,就可以从用户空间程序发出系统调用请求。

让您开始:

  • 您需要设置内核环境
  • 添加一个新的系统调用。为此,您需要在网上阅读,有 关于如何实现这一目标的好文章。 For instance。 你不能使用完全相同的代码,但它应该让你知道如何开始。在设计新的系统调用时,您需要确定需要哪些参数和数据类型。
  • 创建一个用户空间程序以使用 syscall 调用新的系统调用。 您需要指定您在上一点添加的新系统调用号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2023-03-28
    • 2013-01-14
    相关资源
    最近更新 更多