カーネルは理解する必要があります(6):kgdbを使用してカーネルをデバッグする

4445 ワード

カーネルは(一):システム呼び出しでHello,worldを印刷することを理解しなければなりません!
カーネルは理解しなければならない(二):ファイルシステムの初期プローブ
カーネルは理解する必要があります(3):Ubuntu 18.04 LTSカーネル4.15.0の再編成
カーネルは理解する必要があります(4):カーネルドライバの作成
カーネルは理解しなければならない(5):per-CPU変数
カーネルは理解する必要があります(6):kgdbを使用してカーネルをデバッグする
目次
  • 前言
  • 仮想マシンシリアルポート設定
  • 試験シリアルポート
  • ターゲットマシン
  • を構成する.
  • デバッグ
  • を開始
  • デバッグ駆動モジュール
  • 最後の
  • 前言
    カーネルをデバッグするのは決して楽なことではありません.ここではkgdbを使用してデバッグしています.あなたの理解は間違いありません.kernel版のgdbです.
    VMシリアルポートの設定
    まずカーネルを再コンパイルした仮想マシンをクローンしてから、両者のシリアルポートを設定します.ここではwinを使っていますが、mac側のシリアルポートはしばらくよくありませんので、不本意にwinを使いました.
  • 開発機
  • ターゲットマシン
  • テストシリアルポート
    ターゲット実行:
    sudo cat /dev/ttyS1
    

    開発機はrootユーザーに切り替え、実行:
    echo “Hello, world!”>/dev/ttyS1
    

    ターゲットマシンの構成
    grubファイルを開くには:
    sudo vim /etc/default/grub
    

    次のように追加します.
    GRUB_CMDLINE_LINUX="nokaslr rootdelay=90quiet splash text kgdboc=ttyS1,115200“
    

    更新grub:
    sudo update-grub
    

    Nokaslr、カーネルアドレスのランダム化は禁止されています.具体的な内容は自分でgoogleしてください.
    reboot
    

    そして再起動すると、nokaslrに関するヒントが表示されます.
    デバッグの開始
    次にkgdbのデバッグをテストし始め、ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡され、ターゲットマシンは偽死状態に入った.
    echo g > /proc/sysrq-trigger
    

    開発機がセルフコンパイルカーネルディレクトリにアクセス
    gdb ./vmlinux
    target remote /dev/ttyS1
    handle SIGSEGV noprint nostop pass
    break sys_clone
    c
    s
    

    ここでブレークポイントをsys_にcloneは、皆さんがよく知っているforkが呼び出すので、基本的にしばらく待って、システムは自分で呼び出して、それからデバッグに入りました.それからgdbを使うのと同じです.
    ドライバモジュールのデバッグ
    自分の書き込みドライバモジュールをデバッグするには、まず通常の挿入モジュールが必要です.多くは言いません.次に、シンボルパラメータを挿入するために使用されるshellスクリプトがあります.
    #!/bin/bash
    #
    # usage: gdbline.sh module_name module_path
    #
    # This script will outputs an add-symbol-file line suitable for pasting into gdb to examine
    # a loaded module.
    #
    cd /sys/module/$1/sections
    echo -n add-symbol-file $2 `/bin/cat .text`
    for section in .[a-z]* *; do
    	if [ $section != ".text" ]; then
    echo " \\"
    echo -n " -s" $section `/bin/cat $section` 
    	fi
    done
    echo
    

    まず、ターゲットマシンmakeで.koファイルを生成し、この.koファイルを開発機の同名ディレクトリにコピーする必要があります.次に、ターゲットマシンに.koファイルを挿入してshellスクリプトで.text,.data,.bssセグメントのアドレスを取得します.これらのことがよく分からない場合は、自分でgoogleしてください.展開すると、ページがコントロールできませんから.
    ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡し、ターゲットマシンは偽死状態に入る:
    echo g > /proc/sysrq-trigger
    

    開発機がセルフコンパイルカーネルディレクトリにアクセス
    gdb ./vmlinux
    target remote /dev/ttyS1
    handle SIGSEGV noprint nostop pass
    

    通常の操作は前にも言いましたが、新しい操作でadd-symbol-fileで記号情報を挿入し、y確認を入力します.
    次に、モジュール関数DriverWriteにブレークポイントを入力し、実行を開始します.
    ターゲットマシンを切断します.もう偽ではありません.ユーザーステータスプログラムを実行します.
    開発機はブレークポイントをトリガーします.
    次に、gdbデバッグを通常使用するのと同じです.
    最後に
    ドライバモジュールを書く場合は、カーネルをデバッグする必要がありますが、上記の方法は唯一の方法ではありません.次の記事では、似たようなデバッグを行うためのより実用的なツールを紹介します.
    転載先:https://juejin.im/post/5cb715bf6fb9a0686b472e1b