4

Linuxカーネル内に新しいsyscallを書いています。エラー処理システムを実装して、sycall を使用するユーザーにエラーの種類を説明するコードを返したいと考えています。標準に従いたいので、これがカーネル内でどのように行われるか知りたいです。発生したエラーを理解するために、ユーザーが errno 変数または同等のものを読み取れるようにしたいと考えています。ありがとうございました。

PS 利用可能な最新バージョンの Linux を使用しています。

4

3 に答える 3

11

タスクの多くは、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)。それらのどれも目的に合わない場合は、それらのファイルに独自のエラー番号を追加できますが、同じ番号を表示するようにユーザー空間に表示されるカーネル ヘッダーも変更する必要があることに注意してください。変更を使用するためのシステムをセットアップします。必要がない場合は、これを行わないでください。

于 2010-09-02T21:35:07.600 に答える
2

sycallでコード自体を返すことで、errnoに設定したいコードの番号を簡単に返すことができることがわかりました。残りはすべてLinuxカーネルによって自動的に作成されます。

于 2010-08-23T17:08:03.803 に答える
1

2 つのオプションがあります。既存のエラー コードを使用するか、独自のエラー コードを定義します。ほとんどの場合、既存のエラー コードが、私が望む意味に十分近いものであることがわかりました。

基本的なエラー番号は次の場所にあります。

include/asm-generic/errno-base.h

include/asm-generic/errno.h.

システム コールでは、既存の errno 値の負の値をユーザーに返すことができます。例えば:

return -ENOMEM;
于 2010-08-25T16:21:19.520 に答える