Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 調整のLinuxのカーネルドライバの初期化シーケンス

調整のLinuxのカーネルドライバの初期化シーケンス

  
 それぞれがdo_basic_setup __init .STATIC空間を行うには()関数のINIT /main.cの(無効){/*ドライバは* /init_workqueues(ホットプラグイベントを送信します)で、ドライバの初期化ファイルをdo_basic_setup作業しているとき、

カーネルが起動します。 usermodehelper_init(); DRIVER_INIT();

CONFIG_SYSCTLsysctl_initの#ifdef();#endifの

/*ネットワークの初期化は)(* /sock_initプロセスのコンテキストを必要とする。

do_initcalls( );}ここでDRIVER_INIT()コードを見て、適切なドライバがdo_initcalls;. INTカウント= preempt_countに.STATICボイド__initのdo_initcalls(ボイド){initcall_t *()の呼び出しを行い理解するであろう、いくつかのコアの初期化を行う初期化します();

(= __initcall_startを呼び出す++呼び出し; LT&呼び出す; __initcall_end)用{チャー*のMSG;

IF(initcall_debug){のprintk(KERN_DEBUG" INITCALL 0X%P"を呼び出します; *コール); print_fn_descriptor_symbol("%S()"(unsigned long型)*コール)のprintk(" \\ n");}

(*コール)();

MSG = NULL; IF((!preempt_count()=カウント){;プリエンプション不均衡"; preempt_count()=カウントMSG ="}もしirqs_disabled()){MSG ="無効割り込み"; local_irq_enable();}(MSG){のprintk(KERN_WARNING"場合、0X%PでINITCALLにおけるエラー:;""は%Sが\\で返さN" *コール、MSG);}}

/* INITCALLシーケンス* /flush_scheduled_work()からの保留中のものがないことを確認してくださいは;}これは、(ファイル__initcall_startアーチ/XXX /カーネル/vmlinux.lds.Sですxxxは理解するために見て、様々なsectioinをLDを定義するときに、このファイルは、カーネルで使用されている)の例のi386用、お使いのアーキテクチャの名前です。次のように本書で.initcall.initあり、コードは:. __ initcall_start =; initcall.init:.. {*(Initcall1.init。)*(Initcall2.init。)*(Initcall3.init。)*(initcall4。 INIT)*(。initcall5.init)*(。initcall6.init)*(。initcall7.init)}

初期化7つの優先順位があり、ローディングのこの優先順位に従ってカーネル。静的initcall_t \\ ..

に#define __define_initcall(レベル、FN):これらの優先順位は、ファイルが含ま/linuxの/マクロの実現に注意を払うinit.h次のように関連するコードがあることを理解__define_initcallで定義されています__initcall _ ## FN __attribute_used__ \\属性__ __((__部__(" .initcall"レベル" .INIT")))= FN

の#define core_initcall(FN)__define_initcall(" 1", FN)の#define postcore_initcall(FN)__define_initcall(" 2", FN)の#define arch_initcall(FN)__define_initcall(" 3", FN)の#define subsys_initcall(FN)__define_initcall(" 4", FN)の#define fs_initcall(FN)__define_initcall (" 5", FN)の#define device_initcall(FN)__define_initcall(" 6", FN)の#define late_initcall(FN)__define_initcall("私たちが見ることができる7", FN)

、デバイスドライバは、私たちはしばしば、実際に共通module_initで書い優先に対応6ます。#define __initcall(FN)device_initcall(FN)

に#define module_init(x)は__initcall(x)は、

____________

が、どのように私はあなたの質問を感じていますかロードシーケンスによるものではない原因?私はタッチスクリーンと、もう少しセリオを感じ、また、I2Cに有用である。私も駆動タッチスクリーンを書いた、と思います。あなたはこれらの構造は行くために彼らのドライブ、input_devを構造に形成シールする必要がありますセリオ(またはi2c_driverで)で、その後、.module_initがattach_adapter時間にi2c_driver、その後、登録input_devを登録する必要がありますロード順序を制御する。



今日別のドライブ(I2C)カーネルの初期化中に発生した依存関係の問題により提供されるAPIを使用するための時間を作るためにドライブインチ
は、

私が運転し、I2Cの初期化前に実行した後、I2CのAPIも使用できない状態で提供されるでしょう。多くの情報を確認し、インターネットはmodule_initドライバマクロを使用して、すべてのこの順序は、(私は信頼できる情報を見つけていない)不確実であることを言って始めました。

.initcall.initまたこれらの関数ポインタで__init関数ポインタを呼び出し、全体の初期化が完了した後に初期化カーネルでは、関数ポインタを保存したセクションのすべての__init機能、 (.init.text、.initcall.initなどを含む)全体INITセクションを解放します。

カーネル関数のみ本明細書に関連する初期化シーケンスと関数ポインタ間コール、およびこれらの機能1順序)自体が.init.textセクションの順序とは無関係であることに留意されたいです。また、注文に関連関数ポインタやリンクの順序で2.4カーネルでは、不確実です。 2.6カーネル、initcall.init部7は、サブセクション、即ち

・デ・GTに分割されている。.initcall1.init .initcall2.init .initcall3.init .initcall4.init .initcall5.init .initcall6。 INIT .initcall7.initde>場合

これは文限り、関数fnの.initcall1.init部を配置することが望まれる場合

デ> core_initcall(FN);デ>

それはすることができます。各セグメントを定義するため

他の方法は、次のとおり

デ> core_initcall(FN)---> .initcall1.init postcore_initcall(FN)---> .initcall2。 INIT arch_initcall(FN)---> .initcall3.init subsys_initcall(FN)---> .initcall4.init fs_initcall(FN)---> .initcall5.init device_initcall(FN)--->。 initcall6.init late_initcall(FN)---> .initcall7.initde>

2.4 INITCALL(FN)と互換性のあるdevice_initcallと等価(FN)です。各サブセクションの間に順番は、関数ポインタ.initcall1.initの、すなわち最初の呼び出し、次に関数ポインタ.initcall2.initを呼び出し、等を決定します。各サブセクションとリンクが関連付けられているシーケンスで順次関数ポインタは、不明です。

Copyright © Windowsの知識 All Rights Reserved