携帯電話用のカスタムブートローダーを開発した後、デスクトップLinuxディストリビューションでできるように、ディスプレイに核ログの表示を実装したいと考えました。 個人的には、携帯電話を起動するとき、最初にブートローダーのロゴを見てからAndroidシステムの起動アニメーションを見るよりも、点滅しているkmsgログを見るほうがはるかに興味深いからです。 2年間、「退屈な壁紙」は退屈になりました。
次に、ディスプレイへのkmsgログの低レベル出力を実装するAndroidカーネル用のLLCONモジュールについて簡単に説明します。
Linuxカーネルには、核ログを画面に表示するモジュールがあります。 このカーネルメカニズムは、FRAMEBUFFER_CONSOLEオプションを指定することで有効になります。 ただし、このメカニズムは、通常最後のターン(late_initステージ)で初期化されるディスプレイドライバーを介してのみ機能します。 この機能により、ブートローダーのプライマリロゴがしばらく表示されます。
「低レベルの結論」という言葉は私が普段使っているものではありません LLCONモジュールはビデオメモリと直接連動し(MS-DOSの若い工芸品をすぐに思い出します)、同時に内部Linuxカーネルドライバー(early_init)を初期化する前に作業を開始します。 これらの機能により、LLCONはできるだけ早く画面にカーネルログの表示を開始できます。
LLCONモジュールを追加した後、次のオプションをカーネル構成に追加する必要があります。
CONFIG_VT=y CONFIG_LLCON=y CONFIG_FONTS=y CONFIG_FONT_6x11=y CONFIG_FONT_8x16=y CONFIG_FONT_SUN12x22=y
この場合、3つの異なるフォントを指定しました。 私が使用するブートローダーでは、任意のフォントを選択できます。 ただし、カーネルイメージの最小サイズを確認する必要がある場合は、1つのフォントのみを指定する必要があります。
変更されたカーネルのアセンブリを開始する前に、最初にBoardConfigに新しいカーネルオプションを追加することを忘れないでください。
androidboot.llcon=<mode>,<delay>,<textwrap>,<fb_addr>,<fb_bpp>,<fb_height>,<fb_width>,<fb_stride>,<font_size>,<font_color>
パラメータのデコード- モード:
0 = LLCONは無効です
1 =同期ログ出力(ページング)
2 =非同期ログ出力(行ごとのスクロール) - 遅延:
ミリ秒単位の遅延(画面にグラフィックを表示するストリームで使用。推奨値は100) - textwrap:
0 =行の折り返しは許可されません
1 =テキストの折り返しを許可 - fb_addr:
FrameBufferの物理アドレス - fb_bpp:
表示ピクセル形式(現在は無視されます) - fb_height:
ピクセル単位の表示の高さ - fb_width:
ピクセル単位の表示幅 - fb_stride:
ピクセルまたはバイト単位の1行のサイズ - font_size:
フォントサイズ(サポートされる値:6、8、10、12) - font_color:
HEX形式の文字色
例:
androidboot.llcon=2,100,0,0x03200000,24,1280,720,720,8,0xFFFFFF
fb_addrパラメーターの値を見つける方法FrameBufferの物理アドレスは、アセンブルされたカーネルのDeviceTreeでスパイできます。 これを行うには、ブランチ「qcom、mdss_fb_primary」でパラメーター「qcom、memblock-reserve」を探します。 また、非常に頻繁に、FrameBufferのアドレスがカーネルのkmsgログに表示されます。
ここではLLCONモジュールのソースコードを完全にはコピーしません。対応するパッチへのリンクのみを示します。
また、initサブシステム(ramdiskにある)をファイナライズせずに、Androidサブシステムを初期化するときに、ブートアニメーションの再生が開始されることにも注意してください。 したがって、LLCONを使用する場合、この
パッチを実行するブートアニメーションの無効化を自動化する必要があります。
LLCONモジュールの動作のデモ:
- LLCON 1-ページネーション、フォント6x11
- LLCON 2-行ごと、フォント8x16
LLCONモジュールには、次の用途に役立つ追加機能もあります。
- 緊急のSoC再起動の場合にkmsgログを受信する(last_kmsgでも使用できない場合)。
- 初期化のごく初期の段階でのカーネルデバッグ(JTAGおよびUARTが利用できない場合)。
しかし、次回LLCONのこれらの可能性についてお話します。