【发布时间】: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;
}
但是,我不知道如何构建一个复杂的系统调用来做我想做的事情。因此,我正在寻找一些帮助,包括 -
- 如何在 linux 中创建复杂的系统调用?
- 如何从
~/kernel/sched/loadavg.c导入函数以在我的SYSCALL 程序中使用? - 在能够执行上述步骤后,如何编译 syscall 程序以获得像普通 c 程序一样的输出。
【问题讨论】:
-
(1) 获取有关设备驱动程序编写的书籍/教程和/或查看
Documentation/和现有设备驱动程序的源代码以用作模型。 (2) 如果没有一些链接器技巧,你想要的符号需要有EXPORT_SYMBOL,所以你不能,除非你修改loadavg.c添加它们并重建内核。然后,您必须启动那个 custom 内核。或者,您可以将系统调用设为内置而不是模块。 (3) 见 (1) -
proc 虚拟文件系统使内核值可用于用户空间。您无法在内核中读取 proc,也没有理由读取这些值,因为这些值是直接可用的。
标签: c linux linux-kernel system-calls