2019-2020-1 20199314仕事の7週目の「Linuxカーネルの原理と分析」

GDBトレースデバッグプロセスの説明と作成

まず、プロセスの説明-幅広い概要
1.1メモリ管理、ファイルシステム、プロセス間通信信号と列一緒概念およびコンテンツ。

  • プロセス制御ブロック-PCB。

  • プロセスの記述

1.2データ構造体structのtask_struct

サンプルコード:

構造は、このようなプロセス制御状態のプロセス状態、下のスタックスタック構造図などの各種書類の多くが含まれています。

1.3 Linuxのプロセスの状態
Linuxオペレーティングシステム、プロセスの状況とプロセスの状態は、両者の間の非常に異なっています。

  • Runnableを
  • レディ状態
  • 詰まった状態

3〜図関係:

両者が別の状態にあってもよいのLinux TASK_RUNNINGは、状態を実行する準備ができて、異なるオペレーティング・システムでは、この原則、およびそれが動作状態になるとの理由では、LinuxカーネルTASK_RUNNINGは、CPUの制御を得ることが可能であるということだけを述べているかもしれません、レディ状態が状態に予定されている取得できませんでした。

プロセス識別子:

pid_t pid;
pid-t tpid;

二重リンクリスト:

struct list_head tasks;
struct list_head{
    strcut list_head *next,*prev;
}

次のように図です。

父と息子の関係は1.4プロセスを作成します

親--real_parent、親
、子プロセスの子供がLIST_HEAD --struct
同胞プロセスを--struct LIST_HEAD兄弟

次のように図です。

実験

今週の実験だけでなく、創造のプロセスを理解しても、作成プロセスを分析する過程を追跡する必要があります。

実験手順の正式な開始に続き

次のコードを実行します。

ls
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu 
mv test_fork.c test.c
make rootfs  //主要功能在于编译增加了fork文件

実行ショット:

コンパイルプロセスを完了するためにしばらくの間QEMUウィンドウが実行された後:

呼び出しが成功するかどうかを確認するために、コマンドフォークを数回入力します。

プログラムの追跡を開始する準備ができて、カーネルをデバッグGDB:

カーネルとポートをロードします。

 file linux-3.18.6/vmlinux
 target remote:1234

Linuxカーネルにブレークポイントカーネル関数を設定します。

b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_fork

コードの行にCを入力して、カーネルを実行し続けるには、最初のブレークポイントdo_forkの設定があります。

入力NまたはSをステップ(ソースnを行う機能は、実行の実行を起動する、およびSではないことに留意されたいです)。

追跡するために、いくつかの残りのブレークポイントを見つけるために続けます。

要約:

最初に私は自分の実験と上の階と3.9.4カーネルが同じではありませんが、自分の仮想マシン上で実験するつもりはなく、基本的にはまだ問題はないはず、問題は、その前にカーネルを変更することができるも明らか。だから我々は毎ターンクラッシュ実験棟での環境を継続しなければなりませんでした。彼は捕まってしまったとき、最後のステップに実行するためにわずか数行のコードについてTucao。

ls
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu 
mv test_fork.c test.c
make rootfs
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

同時に彼のために開いた二つのコアのページそれにあまりにも多くの圧力かもしれません。すべての実験環境でのみ、コードの再ノックを削除することができ、私は多くの時間を費やしました。

おすすめ

転載: www.cnblogs.com/morvalhe/p/11780604.html