【问题标题】:Linux kernel function Doesn't return correct value?Linux内核函数不返回正确的值?
【发布时间】: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


【解决方案1】:

当您致电syscallyou are passing through ... 时。您通过... 传递int,但该函数需要long

我不确定为什么在调用需要 long 时让 set_weight 接受 int,但是在传递之前您没有将其转换为 long 的原型。

【讨论】:

  • 请注意 linux 中的 long 在 c 中是 int
  • ABI 是否保证它们是兼容的类型?
  • 请注意 linux 中的 long 在 c 中是 int 你在 64 位机器上,所以这是不正确的。大卫的分析是正确的。你想要int set_weight(long weight)syscall(334,(long) weight)
猜你喜欢
  • 2022-08-07
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多