Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのシャットダウンと再起動のプロセス分析

Linuxのシャットダウンと再起動のプロセス分析

  

Linuxのシャットダウンと再起動のプロセスは、一般的なデスクトップアプリケーションやネットワークサーバーでは重要ではありませんが、ユーザー定義の組み込みシステムではカーネルは理解を通してある程度の研究的意義を持ちますLinuxのシャットダウンと再起動の過程で、私たちはそれを修正しカスタマイズすることができ、さらにこれに基づいて新しい機能を開発することもできます。
1.概要で
シャットダウンおよびLinuxで再起動は、1つのシステム自体によって生成されたメッセージであり、一方がユーザによりプログラムされる二つの行為によって引き起こされ得ます。ユーザーがシステムと対話する方法は2つあり、1つはシステムコール:sys_reboot、もう1つはapmまたはacpiのデバイスファイルで、操作することでシステムをシャットダウンまたは再起動することもできます。

2. sys_rebootは、このシステムコールはMAGIC_NUMBERのセットを定義し、最初のチェックMAGIC_NUMBERのみ続行する前に、右を下に実行するために、通話の開始時に正しいか、システムの再起動

を通じて呼び出します。ステアリング再始動分岐で
ケースLINUX_REBOOT_CMD_RESTART場合:

再起動の他の部分に送信された最初のメッセージnotifier_call_chain使用し、その後、機能machine_restartリブートを呼び出します。いくつかのSMPに関連付けられた機能コードの

machine_restart開始は、他のCPUの後、メインCPUの再起動が完了すると、複数のCPUが待機状態です。その後、システムは変数reboot_thru_biosの内容に従って再起動モードを判断し、reboot_setupを読むことで、システム起動時にこのパラメータの内容が指定されていることを知ることができ、biosを使うかどうかを決定します。そのアドレスのプログラムが再起動されます。 BIOSなしで再起動する場合、システムは最初に再起動フラグを設定し、次にポート0xfeに数値0x64を書き込みますこの再起動の具体的な原理は明らかではない、それはリセットボタンを押すのをシミュレートするようです。みんなと話し合ってください。 BIOSを介して再起動する場合、システムは最初に再起動モードを設定し、次にリアルモードに切り替え、ljmp $ 0xffff、$ 0x0を介して再起動します。

3. sys_rebootが分岐システムコールを処理する上で

をシャットダウンするようにシステムを介して呼び出しを、私たちは同じで
場合にLINUX_REBOOT_CMD_POWER_OFFそして、MAGIC_NUMBERを最初にチェックされていることがわかります。で
実行は、内部の流れ、および送信されたメッセージは、直ちに実行machine_power_off機能notifier_call_chainコンピュータの電源をオフするために使用されます。 pm_power_off関数ポインタが空でない場合は、machine_power_off関数で確認できます。その後、システムはこの関数を呼び出してシャットダウンします。 apmがロードされている場合(SMPを除く)、pm_power_off関数は実際にはapm.c内のapm_power_offを指します。この関数では、システムはapm_info構造体の値を使用してリアルモードシャットダウンに切り替えるか、またはapm_bios_call_simple関数を使用します。 2つの方法をシャットダウンするために保護モードのapmインターフェイスを呼び出して下さい。で
シャットダウン処理do_ioctlのapm.c関数でIOCTLインターフェースAPM完了操作を使用して4.apm

APM登録装置駆動自体が分岐処理に見ることができます。サスペンドコードとスタンバイコードしかないので、ioctl経由でapm shutdownを使用することはできません。 APMモジュールがある場合、ユーザが電源スイッチを押す

は、シャットダウンプロセスはAPMに処理されます。 apmドライバは、初期化時にapmカーネルスレッドを起動します。apm_mainloop。システムはPOWEROFFボタンメッセージを検出し、APM_SYS_SUSPENDという名前を付けてapm -sで設定されたAPM_USER_SUSPENDモードを識別します。次に、処理関数に対応するcase分岐で、apm_event_handler関数を入力し、apm_event_handler関数からcheck_events関数を入力します。システムはサスペンド機能を使用してシャットダウンすることもできますが、他のパラメータのために、サスペンドは最後にシャットダウンプロセスを呼び出します。問題で
5例。1)

特定のマザーボードのクラッシュの調査の結果、この場合には、POWERキー駆動負荷によってのみ、一定時間後に表示されます、シャットダウンシステムを使用してsys_rebootを呼び出すときにも、そのような問題はありません。ドライバがシャットダウン前にapmによって送信された照会メッセージを正しく処理しなかったことが疑われるapmの処理フローを分析します。一部のドライバはソースコードを持っていないので、apm.cのシャットダウン部分をハックし、2つの方法で同じプロセスをシャットダウンさせることにしました。;
IF(RET){
のprintk(


RET = exec_usermodehelper(poweroff_helper_path、ARGV、envpを):こうしてcheck_eventsのapm.cの機能は、以下のコードセクションのように書き換えるAPM_SYS_SUSPEND KERN_ERR
"apm.c:Nのerrno =%D \\\\、%Sをexecしに失敗しました"、
のpoweroff_helper_path、errnoに);高速再起動を

;
は}破る
static unsigned charをサポートfast_reboot_switch [] = 0x66、0x0f、0x20、0xc0、/* movl%cr0、%eax * /
0x66、0x10、0x11、0x11、0x11 、/* andl $ 0x11111110、%eax * /
0x66、0x0f、0x22、0xc0、/* movl%eax、%cr0 * /
0xea、0x00、0x00、0x00、0x70 /* ljmp $ 0x7000、 $ 0000 * /

};


システムがリアルモードに切り替え、その後、7000Hにジャンプすることができます:0位置を始めます。

6.ACPI

はACPI 2.4.20カーネルモジュールに概説し、テストが完了していないとして、実現される機能の一部が存在しない可能性が注目されます。 APMモジュールとAPCIモジュールの両方が同時にカーネルにコンパイルされると、APMはACPIの前にロードされ、APMはACPIを終了させるように動作します。システムの電源、電源のサポート(主にノートブックで役に立ちます)は、acpidデーモンプログラムに頼ります。

は状態、ACPIプログラムのACPI状態で完了したばかりのお問い合わせを切り替えAPMアプリケーションに似た機能を持っていません。ユーザは、/proc /acpi /sleepファイルに直接番号を書き込むことによってS0-S4の機能を実装できます。内容を読む(catする)ことで、システムがどのモードをサポートしているかを知ることができます。 linux /ドライバ/ACPI /driver.cのメインプログラムの

ACPIモジュールのソースコードは、Linux /ドライバ/ACPI /OSPM /システム/sm_osl.cファイルに移動し、ファイルをスリープ状態に何かを書く場合sm_osl_proc_write_sleep関数では、この関数は後でsm_osl_suspend関数を呼び出します。この機能には、さまざまな状態の保護など、さまざまな機能が組み込まれています。この関数はlinux /drivers /acpi /hardware /hwsleep.cファイルにあり、acpiレジスタはシステムをスリープ状態にするために書き込まれます。レジスタを書くための指示はこのディレクトリの下のhwregs.cにあります。

7.要約

この記事は、ACPIを記述するには、実際には、ACPIは、将来のLinuxカーネルの電源管理モードのための最初の選択肢になるだろう、非常に簡単です。公式コードのACPIバージョンが低いため、詳細な議論はありません。将来カーネルが変わることを願っています。

Copyright © Windowsの知識 All Rights Reserved