Linuxカーネル内に新しいsyscallを書いています。エラー処理システムを実装して、sycall を使用するユーザーにエラーの種類を説明するコードを返したいと考えています。標準に従いたいので、これがカーネル内でどのように行われるか知りたいです。発生したエラーを理解するために、ユーザーが errno 変数または同等のものを読み取れるようにしたいと考えています。ありがとうございました。
PS 利用可能な最新バージョンの Linux を使用しています。
Linuxカーネル内に新しいsyscallを書いています。エラー処理システムを実装して、sycall を使用するユーザーにエラーの種類を説明するコードを返したいと考えています。標準に従いたいので、これがカーネル内でどのように行われるか知りたいです。発生したエラーを理解するために、ユーザーが errno 変数または同等のものを読み取れるようにしたいと考えています。ありがとうございました。
PS 利用可能な最新バージョンの Linux を使用しています。
タスクの多くは、libc と低レベルのカーネル syscall ハンドラ (アセンブリで記述された部分) によって自動的に処理されます。エラー コードを処理するためのカーネルの規則は、 のような負のエラー定数を返すことです-ENOMEM
。ゼロまたは正の数は成功を示します。これはカーネル全体で使用されます。
新しい sycall エントリ ポイントを定義した場合はstatic asmlinkage long my_new_syscall (int param) {...}
、単に戻る必要があります-ENOMEM
(など)。libc の を使用してシステム コールを呼び出した場合syscall(nr, param)
、エラーが発生すると -1 が返さENOMEM
れ、(正の場合) in になりますerrno
。
で使用できる多くのエラー コードが定義されinclude/asm-generic/{errno,errno-base}.h
ています ( などENOMEM
)。それらのどれも目的に合わない場合は、それらのファイルに独自のエラー番号を追加できますが、同じ番号を表示するようにユーザー空間に表示されるカーネル ヘッダーも変更する必要があることに注意してください。変更を使用するためのシステムをセットアップします。必要がない場合は、これを行わないでください。
sycallでコード自体を返すことで、errnoに設定したいコードの番号を簡単に返すことができることがわかりました。残りはすべてLinuxカーネルによって自動的に作成されます。
2 つのオプションがあります。既存のエラー コードを使用するか、独自のエラー コードを定義します。ほとんどの場合、既存のエラー コードが、私が望む意味に十分近いものであることがわかりました。
基本的なエラー番号は次の場所にあります。
include/asm-generic/errno-base.h
と
include/asm-generic/errno.h
.
システム コールでは、既存の errno 値の負の値をユーザーに返すことができます。例えば:
return -ENOMEM;