Linuxのカーネルregister_chrdev詳細ドライブをマウント

  xxx.koコンパイルドライバダウンロードSDカードを取得するには、カーネルのソースツリー、ドライバをインストールxxx.ko insmodの持つシステム・カーネルへのブート、コマンドの呼び出しによって

module_init(chrdev_init)指定されたchrdev_init機能、私たちが登録するために呼び出すregister_chrdev機能、登録は、以下の3つの構造のために適用されます

ドライバの対応する一つにchar_device_struct、ドライバ記述子CDEV、プローブ構造

1 char_device_struct:

     ドライバは、デバイス番号の範囲を有する、デバイスファイルのデバイス番号の範囲内にドライバを使用なり、char_device_structプログラムを駆動します

     ハッシュ値は、我々が小さいほど、そのデバイス番号の範囲の大きさに応じて、リストの横の挿入過程において、長手方向に挿入された配列chrdevsメジャー番号に挿入されています

     挿入後グレート、フロントCDEVを指しているドライバCDEV構造記述子

2ドライバ記述子CDEV

    私たちが入ってくるfile_operations構造を指すOPSでCDEV、

3つのプローブ構造(デバイス番号をCDEV見つけるために使用)

    、カーネルメモリが再び記憶されるポインタcdev_mapプローブ構造は、記憶char_device_structと同じでした

    データ・ポイント・プローブCDEV

  経由の/ proc / devicesディレクトリとはlsmodコマンドは、登録された例を表示します。

登録が完了すると、デバイスファイルを作成します。

    mknod / DEV / testchar C長い数値の範囲に対応するデバイスドライバのデバイス数の変化として駆動と呼ばれるように250°

以下の分析はmknod / DEV / testchar C 250 0

  システムコールはvfs_mknod(nd.path.dentry-> d_inode、dentryは、モード、new_decode_dev(DEV))を呼び出します。最初のパラメータは、devディレクトリのinodeであります

  2番目のパラメータは新しいtestcharディレクトリエントリで、機能はramfs_mknodへの道を見つけるために道のinodeのmknod devディレクトリを呼び出します

  デバイスファイルのinodeを取得し、inode-> i_fop =&def_chr_fops;  inode-> i_rdev = RDEVは、我々は、デバイスファイルを作成しなければならなかったので、

デバイスファイルを開くには、以下のオープン(「は/ dev / testchar」、O_RDWR)分析プロセス:

  SYSCALL_DEFINE3(オープン、constのchar型の__user *、ファイル名、int型、フラグ、int型、モード)

  ---- do_sys_open(AT_FDCWD、ファイル名、フラグ、モード)。

       ----構造体ファイル* F = do_filp_open(DFD、TMP、フラグ、モード、0);

          ---- do_last

              ---- finish_open

                  ---- nameidata_to_filp

                      ----__ dentry_open

      ---- fd_install

では、我々はノード装置ファイルのファイル構造に割り当てられi_fop f_opとそのopenメソッドを実行します__dentry_open、私たちは知っているあなたは、デバイスファイルを作成するときに

inode-デバイスファイル> i_fop =&def_chr_fops、すなわち機能によれば、オープンchrdev_openを行う我々inode-> i_rdevすなわち機器番号cdev_map

対応するデバイスドライバを検索し、記述子CDEV inode-> i_cdevに割り当てられ、OPSが割り当てられfilp-> f_opをCDEVとそのopenメソッドを実行します

ファイルディスクリプタファイル構造をfd_installと結合、動作には、ドライバを呼び出すIOファイルになりますそのあと

 

 

 

 

おすすめ

転載: www.cnblogs.com/genshu123/p/11834634.html