2016-06-18 21 views
2

カーネル領域のerrnoに相当するものは何ですか?より正確には、たとえばkmalloc()のような関数を使用するときにどのようなエラーが発生したかを確認するにはどうすればよいですか?カーネル領域のエラー処理/チェック

答えて

3

:あなたにはerrno変数を設定するエラーのリストを見つけることができます。 Cユーザー空間プログラムとは異なり、関数はエラーコードをグローバル変数に格納せず、直接値を返します。あなたは一般的に次のようにこれが行われていることがわかります。エラーコードから離れて何も値を返さない

  • 機能は、一般的に失敗したときに成功と-ESOMETHING0を返します。
  • 負でない数値(インデックス、ファイルディスクリプタ番号、バイト数など)を返す関数は似ています.0以上は成功を示し、負の値はエラーを示します。
  • ポインタを返す関数は、エラーを示すために特殊な範囲の値を返します。戻り値にIS_ERR()を呼び出すと、エラーが発生したかどうかを確認できます。 PTR_ERR()を使用すると、エラーコードを抽出して再度無効にすることができます。

残念ながら、kmalloc()関数はこれらのスタイルを使用しません。障害発生時に特定のエラーコードを表示せずにNULLを返します。

+0

Ed!ありがとう! – LiorGolan

+2

私は、 'kmalloc()'が与えられたサイズが0の場合に 'ZERO_SIZE_PTR'を返すこともできるということを付け加えておきます。' kmalloc() 'を呼び出す前にサイズを明示的にチェックして、' ZERO_SIZE_PTR 'また、 'PTR_RET()'(これは廃止予定)、 'IS_ERR()'、 'PTR_ERR()'の代わりに 'PTR_ERR_OR_ZERO()'を使うことを検討してください。 –

+0

サイズが0のときにmallocから返されるNULL以外のコードが表示されるのに驚くかもしれません!だから、コードで注意してください。 @SamProtsenkoはすでに詳細を教えてくれました。 – 0andriy

1

カーネル領域にerrnoがありません。あなただけのkmalloc()のために例えばif文でカーネル関数のリターンを確認することができます:あなたはその後、ユーザ空間だけで中errno値になるかを決定することができ、あなたのエラーを処理

struct dog *ptr; 

ptr = kmalloc(sizeof(struct dog), GFP_KERNEL); 
if (!ptr) 
    /* handle error ... */ 

return -ErrorName; 

Linuxカーネルは、この負の値をライブラリerrno.hで解釈します。 Linuxカーネルはエラー条件を処理するためのさまざまな方法をいくつか使用しています

include/asm-generic/errno.h 
include/asm-generic/errno-base.h 
+0

ありがとうございましたbtw、なぜ私たちはエラーの負の値を返す必要がありますか? (私は誰もが複数の例をオンラインで行っているのを見てきました) – LiorGolan

+0

@LiorGolanこれは、(ほとんどの場合)カーネルからの戻り値をerrnoの値に書き込むsyscallの実装に依存します。カーネルからの戻り値が負であれば、ほぼすべてのシステムコールがerrnoを設定していると言うことができます。対流である特定の理由はありません – mik1904

関連する問題