Error handling linux内核内部的系统调用错误处理

Error handling linux内核内部的系统调用错误处理,error-handling,linux-kernel,errno,Error Handling,Linux Kernel,Errno,我正在linux内核中编写一个新的系统调用。我想实现一个错误处理系统,返回给使用sycall的用户一个描述错误类型的代码。我想知道这是如何在内核中完成的,因为我想遵循标准。我想让用户读取errno变量或类似的内容,以了解发生的错误。 多谢各位 另外,我正在使用linux的最新版本 我发现,通过在sycall中返回代码本身,我可以简单地返回我希望errno设置为的代码编号。其余的都是由linux内核自动完成的 您有两种选择:使用现有错误代码,或定义自己的错误代码。大多数时候,我发现现有的错误代码与

我正在linux内核中编写一个新的系统调用。我想实现一个错误处理系统,返回给使用sycall的用户一个描述错误类型的代码。我想知道这是如何在内核中完成的,因为我想遵循标准。我想让用户读取errno变量或类似的内容,以了解发生的错误。 多谢各位


另外,我正在使用linux的最新版本

我发现,通过在sycall中返回代码本身,我可以简单地返回我希望errno设置为的代码编号。其余的都是由linux内核自动完成的

您有两种选择:使用现有错误代码,或定义自己的错误代码。大多数时候,我发现现有的错误代码与我想要的意思非常接近

基本错误号见:

include/asm generic/errno base.h

包括/asm generic/errno.h

在系统调用中,可以将现有errno值的负值返回给用户。例如:

return -ENOMEM;

大部分任务由libc和低级内核syscall处理程序(用汇编编写的部分)自动完成。处理错误代码的内核约定是返回一个负错误常量,类似于
-ENOMEM
。零或正数表示成功。这在整个内核中使用

如果您已经定义了新的sycall入口点
静态链接my_new_syscall(int param){…}
,它只需要返回
-ENOMEM
(或类似)。如果您使用libc的
syscall(nr,param)
调用系统调用,则在出现错误时,它将返回-1,并且
ENOMEM
(正值)将位于
errno

您可以使用
include/asm generic/{errno,errno base}.h
中定义的许多错误代码(如
ENOMEM
)。如果这些都不符合您的目的,您可以将自己的错误号添加到这些文件中,但请注意,您还需要修改用户空间可见的内核头以显示相同的错误号,因此设置系统以使用您的修改会更加困难。如果没有必要,就不要这样做