コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2022年2月2日 >>> 2022年2月2日
link もっと後

2022年2月2日

AArch64向けLinuxデバッグ環境の構築

目次: GCC

Linuxをデバッグするにはkgdbを使うと思いますが、QEMU + GDBでよりお手軽にデバッグができます。お手軽とは書いたものの、実際やったところQEMUでかなり苦戦したのでメモしておきます。

ツールチェーンの設定

対象のアーキテクチャはAArch64を選びました。お好きなアーキテクチャを使っていただいて構いませんが、Linuxのコンフィグをどうするべきかと、QEMUの動かし方を知っているアーキテクチャにしてください。せっかくLinuxをビルドしても動かせなくて詰みます。

ツールチェーンの構築の方法は昔の日記(2018年7月15日の日記参照)で構築手段をご紹介しています。crosstool-ngはデフォルトだとGDBがビルドされなかった気がするので、

crosstool-ngの設定
CT_DEBUG_GDB=y

Debug facilities  --->
  [*] gdb  --->

この変更が必要になると思います。

Linuxの設定

Linuxカーネルはlinux-nextを使いました。新し目のLTSカーネルなども十分動くはずです。コンフィグの変更点は下記のとおりです。

Linuxの設定
CONFIG_RANDOMIZE_BASE=n(gdbでデバッグするときは、アドレスをランダムに変えられると困るため)

Kernel Features  --->
  [ ] Randomize the address of the kernel image


CONFIG_DEBUG_INFO_REDUCED=n(yだとgdbで構造体などの情報が見えなくなるため)

Kernel hacking  --->
  Compile-time checks and compiler options  --->
    [*] Compile the kernel with debug info
      [ ]   Reduce debugging information


CONFIG_MODULES=n(モジュールのインストールが面倒なので)

[ ] Enable loadable module support  ----

デフォルトのコンフィグだと、やたらと色々なドライバをビルドするので時間がかかります。グラフィクス系のドライバなどの明らかに不要なドライバは外しても良いと思います。

QEMUの設定(失敗編)

QEMUは様々なハードウェアを模倣できます。そのなかにRaspberry Pi 3bがありましたのでこれを使います。initrdイメージはbuildrootで作りました。

QEMU Raspberry Pi 3bマシンでの起動例

qemu-system-aarch64 \
  -machine raspi3b \
  -kernel arch/arm64/boot/Image \
  -append "earlycon=pl011,0x3f201000 console=ttyAMA0" \
  -dtb arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dtb \
  -initrd ../buildroot/output/images/rootfs.cpio \
  -serial stdio \
  -s

起動してプロンプトまで表示されますが、キー入力を全く受け付けず操作不能になってしまいます。解決方法がわからなかったので諦めました。

ちなみに最近のlinux-nextを使う場合は、GPIOとpinctrlの初期化順を修正するパッチを当てないといけません。これを当てないとpinctrlが無効になってしまい、連鎖的にpinctrlに依存しているSDカードのドライバなども無効化され「rootfsがマウントできない!」とpanicになってしまいます。

この問題に気づくまでかなり時間がかかりました。バグだと思ってめっちゃ調べたのに、もうパッチがLKMLに投稿されていたという体験は、linux-nextを使っていると珍しくないですけどね。よりによってRaspberry Piだけで起きるバグをタイムリーに引くとは思わなかった……完全に油断してた。

QEMUの設定

Raspberry Piマシンの代わりにvirtマシンを使うことにしました。

今回はユーザーランドは動けばOKですから、Raspberry PiのディスクイメージRaspberry Pi OS Lite 64bit(公式ダウンロードサイト)を使用します。

QEMUで起動する場合virtioを使用します。QEMUのvirtマシンは残念ながらSDやmtdには対応していません。パラレルフラッシュはサイズが64MBまでのためにRaspberry Pi OSのイメージは大きすぎると言われ起動できません。

QEMU AArch64 virtマシンの起動例
qemu-system-aarch64 \
  -machine virt -cpu cortex-a53 -smp 1 \
  -kernel arch/arm64/boot/Image -append "rw root=/dev/vda2" \
  -drive file=2022-01-28-raspios-bullseye-arm64-lite_resize.img,format=raw,if=virtio \
  -serial stdio \
  -s

最後の -sオプションはGDBの接続をポート1234で待機するオプション -gdb tcp::1234の短縮形です。カーネルのブート部分などをデバッグする場合は、GDBを接続するまで停止していてほしいので -Sも一緒に付けると良いです。

デバッグしよう

前置きがだいぶ長くなりましたがこれでデバッグ環境が整いました。GDBをQEMUに接続するにはtarget remoteコマンドを使います。

QEMU + GDBによるLinuxカーネルデバッグ
$ aarch64-unknown-linux-gnu-gdb vmlinux

GNU gdb (crosstool-NG 1.24.0.501_5bf4485) 10.2
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-build_pc-linux-gnu --target=aarch64-unknown-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from vmlinux...


(gdb) b start_kernel

Breakpoint 1 at 0xffff800009e10c64: file init/main.c, line 931.


(gdb) target remote :1234

Remote debugging using :1234
0x0000000040000000 in ?? ()


(gdb) c

Continuing.

Breakpoint 1, start_kernel () at init/main.c:931
931     {

実行、ブレーク、ソースコードの表示もできています。良い感じですね!

編集者:すずき(2023/09/24 11:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2022年2月2日 >>> 2022年2月2日
link もっと後

管理用メニュー

link 記事を新規作成

<2022>
<<<02>>>
--12345
6789101112
13141516171819
20212223242526
2728-----

最近のコメント5件

  • link 24年4月22日
    hdkさん (04/24 08:36)
    「うちのHHFZ4310は15年突破しまし...」
  • link 24年4月22日
    すずきさん (04/24 00:37)
    「ちゃんと数えてないですけど蛍光管が10年...」
  • link 24年4月22日
    hdkさん (04/23 20:52)
    「おお... うちのHHFZ4310より後...」
  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」

最近の記事3件

  • link 24年4月25日
    すずき (04/29 10:08)
    「[AVIFの変換] AVIFが読めないアプリケーションがたまにあるので、AVIF(AV1 Image File Format)...」
  • link 24年2月7日
    すずき (04/24 02:52)
    「[複数の音声ファイルのラウドネスを統一したい] PCやデジタル音楽プレーヤーで音楽を聞いていると、曲によって音量の大小が激しく...」
  • link 24年4月22日
    すずき (04/23 20:13)
    「[仕事部屋の照明が壊れた] いきなり仕事部屋のシーリングライトが消えました。蛍光管の寿命にしては去年(2022年10月19日の...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/29 10:08