Linux カーネル Register_chdev 戻り値

Linux カーネル Register_chdev 戻り値

この動画新しいキャラクターデバイスを生成するRaspberry Pi Linuxカーネルモジュールの例を示します。カーネルAPIを使用してくださいregister_chdev。動画のコメント(直接リンクを生成できません)での戻り値に関して、作成者register_chdevは次のように言います。

戻り値がゼロでない場合、そのデバイス番号はすでに使用されています。戻り値の上位12ビットはプライマリデバイス番号、下位20ビットはマイナーデバイス番号です。

「デバイス番号が既に使用中です」とは、「カーネルモジュールでランダムに選択されたゼロ以外の主要なデバイス番号が既に使用中です」という意味です。

この問題に対処するいくつかのWebページがあります(公式、その後これそしてこれ)、戻り値の内部分析に関する情報が見つかりませんでした。

カーネルモジュールを使用して、メジャー番号がすでに使用されているデバイスを作成することを選択した場合、カーネルはそれを承認せず、デバイスの登録を拒否します。これは、ブロックデバイスと同じメジャー番号を選択した場合と、文字デバイスと同じメジャー番号を選択した場合に発生します。register_chdev常に負の値を返します。代わりに、後者の場合、ゼロ以外の正の戻り値を期待します。ここで、上位12ビットはメジャー番号を表し、下位20ビットはマイナー番号を表します(メジャー番号がすでに存在する場合は0より大きい場合があります)。システムを使用することもできます。すでに少なくとも1つのデバイスが接続されており、セカンダリデバイス番号は0です。

YouTubeのコメント内容は本当ですか?これに関する文書はどこにありますか?


Raspbian 10を実行しており、uname -a次のように表示されます。

Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux

答え1

register_chrdevそれ自体はカーネルに文書化されていませんが、定義が短い:

static inline int register_chrdev(unsigned int major, const char *name,
                  const struct file_operations *fops)
{
    return __register_chrdev(major, 0, 256, name, fops);
}

これは基本的に呼び出しを意味します。__register_chrdev全範囲の未成年者(ゼロから始まる256の未成年者)で専攻を登録し、この関数の結果を返します。後者は以下のように記録される。

もしmajor== 0この関数は専攻を動的に割り当て、その番号を返します。

もしmajor> 0この関数は、指定されたキー番号でデバイスを予約しようとし、成功すると0を返します。

失敗した場合は-ve errnoを返します。

未成年者、暗号化、その他の返品に関する規定はありません。これらの機能の目的は、いずれにせよ、専攻として登録し、未成年者として登録することです。

これコーディングopenこれは、デバイスドライバがコールを処理するとき、または特定のデバイスがどのセカンダリデバイスに対応するか(または複数のプライマリデバイスを処理する場合はプライマリデバイス)を決定する必要がある場合に機能します。ドライバには、処理が必要なインデックスノードが用意されています。デバイスノードには、デバイス番号、メジャー、マイナーエンコーディングが含まれます。これMAJORそしてMINORマクロまたはinodeから開始imajorそしてiminor値を抽出するために使用する必要がある関数。

いくつかのキャラクタデバイスは、上述した基本的な登録メカニズムに加えて多重化を提供する。他の1つのドライバがこれらすべてのハードウェアをどのように制御しますか?例えば。

関連情報