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

1.問題の説明

前の記事、Linuxカーネルのいくつかの知識と接触を持っていて、これはさらに、OracleのVM VirtualBoxのLinux環境でシンプルなオペレーティングシステムのMenuOSを構築するために、Linuxカーネルのソースコードのディレクトリ構造からカーネルコードのバージョン3.18を起動します。 GDBを介して、オペレーティングシステムの起動を追跡しながら、問題を解決する6は、実験室の建物とは異なる見えました。

2.決済処理

2.1 Linuxカーネルのソースディレクトリ

アーチ:CPUアーキテクチャを格納するための関連するコード。
ブロック:デバイス管理上のコードのブロックを記憶するLinuxのストレージシステム。
暗号:保存されたC言語コードの一般的な暗号化アルゴリズム。
ドキュメント:いくつかのドキュメントを格納。
ドライバは:ドライブのディレクトリ、サブカテゴリーは、Linuxカーネルがサポートするすべてのハードウェアデバイス用のドライバのソースコードを格納します。
ファームウェア:ファームウェア。
FS:ファイルシステム、Linuxがサポートされるさまざまなストレージファイルシステムの実装。
含まれます:公共のヘッダファイルを格納したヘッダファイルディレクトリを。
INIT:保存する初期化コードを、Linuxカーネル。
libに:Linuxのライブラリファイルを共有置きます。
MM:ストレージメモリ管理。
ネット:関連するコードLinuxネットワークを格納します。
README:ドキュメントを読んでカーネルファイル。

2.2システム構成MenuOS

2.2.1ソースのダウンロード

cd 20199310            #进入20199310目录
mkdir LinuxKernel            #创建LinuxKernel目录            
cd LinuxKernel            #进入Linux目录
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz            #在官网下载内核源码,版本未3.18.6
xz -d linux-3.18.6.tar.xz            #解压压缩包得到linux-3.18.6.tar
tar -xvf linux-3.18.6.tar            #解压压缩包得到linux-3.18.6
cd linux-3.18.6            #进入linux-3.18.6目录
make i386_defconfig            #开始编译源码
make

次のエラーがコンパイル時に発生する可能性があります。

fatal error: linux/compiler-gcc6.h:没有那个文件或目录

理由は、システムのGCCコンパイラのバージョンは、高すぎるカーネルのソースコードと互換性がないということです、あなたは、インターネットから含める/ linuxディレクトリ下に置かれたコンパイラ-gcc6.hをダウンロードする必要があるので、コンパイラgcc6.hとコンパイラgcc5.h一般的に類似した理由また、その後のコンパイルプロセスが同じように解決することができる同様のエラーメッセージが発生する可能性があり、コンパイラgcc5.hリネームコンパイラgcc6.hをコピーすることができます。
次のように図の変更は、次のとおり

2.2.2ルートファイルシステムの生産

戻るLinuxカーネルのディレクトリに移動し、次のコマンドを入力します。

mkdir rootfs           #创建rootfs目录            
git clone https://github.com/mengning/menu.git            #从GitHub上克隆menu
cd menu            #进入menu目录
gcc -pthread -o init linktable.c menu.c test.c -m32 -static           #编译
cd ../rootfs           #进入rootfs目录
cp ../menu/init ./            #把init复制到rootfs下
find . | cpio -o -Hnewc |grip -9 > ../rootfs.img            #把当前rootfs下的所用文件打包成一个镜像文件

gccのコマンドを実行すると、間違いがあります。

設置環境を知るためのオンライン検索は、gccの完璧インストールされていない、環境改善するためのgcc-multilibのgccがインストールインストールapt-getをsudoをしようとし
た画像ファイルのパッケージを成功さ:

追跡するために、2.2.3カーネルのデバッグ

以下のように、それはデバッグ情報を運ぶ作るために、Linuxカーネルをコンパイルし再構成します。

sudo apt-get install libncurses5-dev            #安装libncurses5-dev
make menuconfig           #配置Linux内核,依次选择kernel hacking -> Conpile-time checks and compiler options -> [*]compile the kernel with debug info         
make            #开始编译

最初のステップを実行してもエラーとして表示された後

、端末のウィンドウを示す全画面の非存在下で行わメークmenuconfigのが、小さすぎるので、動作ウィンドウまたは全画面を大きくする必要があります。
:照会することにより、自動的にページの解像度を調整し、仮想マシンの機能をインストールすることによって拡張するだけでなく、以下の6つの機能を有することができる学習した
(1)ホストと仮想マシンの円滑な移動の間にマウスの実現
(2)は、仮想マシンホストを実現しますファイルの共有
(3)は、シームレスなパターンをサポートしています
(4)との交換データへの仮想マシンホスト、クライアントは、クライアントでプログラムを起動することができ監視
ホストとの時刻同期のために(5)
(6)仮想マシンとホストホストとの間で直接コピーすることができ、共有クリップボードの内容は、クライアントは、貼り付ける
デバイス上のウィンドウバーのクリックを実行している仮想マシンを-後>インストールの機能強化は、あなたがズームウィンドウを変更することにより、解像度に適応自動的に再起動することができます。
カーネル構成の中にウィンドウのサイズを調整した後、以下の手順に従って:




長い時間をコンパイル最後にメイク、翻訳が完了した後に、デバッグプロセスを開始し、Linuxカーネルを追跡することができます。

2.3 Linuxカーネルのブートプロセスをデバッグトレース

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s            #开启内核

このとき、エラーメッセージQEMUコマンドの突然の出現は、更新プログラムをインストールした後にQEMUをインストールapt-getをsudoを使用して、見つけることができないデータを照会することにより見つけ、問題はまだ解決されていないことが判明し、QEMUは、apt-getをQEMU-システムのインストール設定インストール手順はsudoコマンド 、 に関連していますさらにコマンドQEMUシステムアーム開始エミュレーションチップアーム、アーム(ボード)をサポートするプラットフォームを表示QEMUシステムアーム-M、QEMUシステムアーム-cpu表示支持アームを備えたCPU、QEMU-IMG形式仮想クライアントマッピング画像のQEMUでその一方のみがストレージ・ネットワーク等では、追加のストレージデバイス、 。
:それは以下のように凍結-Sパラメータであるため、コアに

ポート上のgdbサーバを作成する別のパラメータ-s手段。
CTRL +シフトで+ T別のターミナルウィンドウを開き、LinuxカーネルのGDBで、次のコードを入力します。

gdb            #进入gdb
file linux-3.18.6/vmlinux            #选择调试文件
target remote:1234            #用1234这个端口进行链接
break start_kernel            #在start_kernel()设置断点
c            #运行至第一个断点
break rest_init           #在rest_init ()设置断点
c            #运行至第二个断点
c            #运行剩余启动代码

結果は以下の通りである:



カーネルを実行して開始されるメインコードは、一般main.cの主な機能に対応するカーネルアーチ/ main.cの、請求start_init()によって実行され、task_structにシステム初期化プロセス0 init_taskを実行するためのハードウェアタイプ、プロセス記述、rest_init()および使用される新しいkernel_init kthreaddカーネルスレッド。

3.まとめ

本論文では、Linuxカーネルのソースコードのディレクトリ構造を研究し、その過程で多くの問題を解決するために、Linux環境での単純なオペレーティングシステムのOracle VM VirtualBoxのMenuOSを構築します。あなたは、設定と異なる実験環境は、多くの場合、コマンドファイルまたはインストールされていないの欠如であるのために、Linuxカーネルをコンパイルすると、メイクに直面した問題は、長い時間のために見つけるmenuconfigを、フルスクリーンモード、モードとのシームレスなスケールモードを切り替えるには、ショートカットキーで始まります、実際の解像度を変更し、コマンドを介して設定ファイルを変更し、再起動が成功しなかった後、最終的にはインストールの機能強化に変更するための解像度を見つけるために、このような強力な方法を見つけていないことがわかりました。要するに、この実験はまだ私に多くなります。

おすすめ

転載: www.cnblogs.com/louhao-20199310/p/11620795.html