【发布时间】:2021-08-02 02:31:01
【问题描述】:
我已更改 linux 内核以添加此功能(在添加名为 my_field 的 long 类型的新失败后):
asmlinkage long sys_set_weight(long weight) {
if (weight < 0)
{
return -EINVAL; // -22
}
current->my_field = weight;
return 0;
}
在 syscall_64.tbl 我有:
334 common set_weight sys_set_weight
在 syscalls.h 我有:
asmlinkage long sys_set_weight(long weight);
我在 C 中写的:
int set_weight(int weight) {
long r = syscall(334, weight);
return r;
}
int main () {
int x = set_weight(-3);
cout << "set_weight returns: " << x << endl;
return 0;
}
但我看到打印了以下内容:
set_weight 返回:0
这是为什么呢?我正在重新调整 -EINVAL 而不是 0
【问题讨论】:
-
在 Linux 内核中定义系统调用函数的正确方法是使用来自
SYSCALL_DEFINE*系列的宏。由于您的系统调用只有一个参数,因此您需要使用SYSCALL_DEFINE1。使用此宏的示例:source/fs/file.c. -
您可以使用
pr_info("%s(%ld)\n", __func__, weight);将某些内容打印到内核日志中。
标签: c linux linux-kernel kernel system-calls