埋め込みLinuxでのreboot/poweroff動作のカスタマイズ


一般的にLinux SDKを手に入れると、Poweroff/rebootコマンドを実行するための実用的なbusyboxがシナリオメーカーに内蔵されています.ただし、組み込み開発では、reboot/poweroffを実行した後の動作をカスタマイズする必要がある場合があります.本稿では、修正方法をわかりやすく説明します.
本住所:https://segmentfault.com/a/1190000006216529
Reference
LinuxとBusyboxのRebootコマンドフロー分析に基づくこの文章は分かりやすい.ここでは転載しないで、全文のリンクを提供します.次は大綱を引きます.
Busyboxのreboot/poweroffの基本原理
busyboxでは、reboot/poweroffが他のコマンドのように独立した機能であると勘違いしがちです.実際には正確ではありません.
busyboxではLinuxベースのinitプロセスが実現されている.そのため、powerf/reboot機能のコードは実際にbusyboxのinit.cにあることが参考になります(ええ、「powerfoff.c」や「reboot.c」はありません).
原理的には、rebootコマンドとpoweroffコマンドが実行されると、busyboxはinitにsignalを送信します.rebootコマンドに対応するsignalはSIGTERMであり(したがってshellで直接「pkill init」を実行する効果はrebootを実行するのと同じ)、powerfはSIGUSR2に対応していることがわかります.
対応する信号処理関数において、init.cの処理ロジックは、まず、すべてのネットワーク接続をオフにし、次いで、すべてのプロセスにSIGTERMおよびSIGKILLの信号を送信する.最後にreboot()システム呼び出しを実行
Linux Kernelのreboot/poweroffの基本原理reboot()システム呼び出しがkernelに到達した後、kernelはまず、これがどのような命令であるかを判断し、その後、対応するコールバック関数を実行する.reboot/powerfoffコールバック関数はkernel起動後、チップ初期化コードに割り当てられます.
カスタムreboot/poweroffの作成方法
この文章は操作性に重点を置いて、私はシステム全体の呼び出しの流れを話さないで、直接「どのように変更するか」の問題を話します.
  • チップ初期化コードがどこにあるか知っていれば、一番いいです.Kernelのコールバックの宣言はreset.hファイルにあり、reset.cに定義されています.私の場合、MIPSチップを使っています.それではlinux-a.b.c.d/arch/mips/kernel/reset.cです.しかし、これは重要ではありません.重要なのは、特定のチップのコールバック登録関数を見つけることです.私のSDKはコールバックをlinux-a.b.c.d/arch/mips/ /reset.cに定義します.resetと呼ばれていますが.cですが、2つのファイルの内容は全く違います.対応するPoweroff/rebootコールバックを見つけて、あなたが望むソフトウェアの動作に変更すればいいです.
  • 手元のLinuxが呼び出したコールバックを知らない場合は?ああ、じゃ、私を勉強して、チップマニュアルをめくってください.チップマニュアルには8割のレジスタがあり、すべてのモジュールのreset操作を管理していますが、このレジスタには「reset all」のビットがあります.Source InsightのSearch in Projectを使用して、レジスタのオフセット値に基づいて、このレジスタのマクロを見つけて、それからこのマクロに基づいて、呼び出された場所を見つけます!十中八九、blahblah_resetまたはblahblah_rebootの関数が見えます.Bingo!