2019-2020-1 20199302仕事の6週での「Linuxカーネルの原理と分析」

ユニバーサル機能

1、抽象化の工程
(1)インターフェース:など何をすべきかのモジュールを指定し、識別子/種類、機能は、.H、関数呼び出し元が
(2)を実現:インタフェースモジュールを指定する方法は、複数のインターフェイス(可能)を完成します
。 C、関数の実装
(3)署名関数:関数名、パラメータ、パラメータ・タイプのその数は、戻り値は注意を含んでいません。異なる人物を識別するために使用される署名と同様に、異なる機能を識別するための関数のシグネチャ。キーは、パラメータの数と種類です
2、シングルスレッド
の同時実行:並行プログラムレベル-同時プロセス機能の部門-スレッド

第二に、実験

1、[表示]メニュー

このシステムは、Ubuntuの私の元の画像の下のユーザーのHadoop Linuxカーネルにダウンロード良いメニューをダウンロードし、メニューに入り、test.cのを見ています

コンパイルするとき、問題が発生します:

情報へのアクセスを通じ、それが理由で、十分なメモリであってもよい:

メモリーを変更します。

、rootfsのを作るの成功を実施します:

2つのコマンドを実行します。

2、GDBブラックボックス関数呼び出しSYS_TIMEを使用して追跡システム

カーネルを起動します。

コマンド-S -s GDBデバッグのための

gdbデバッガへ:リモートターゲット:1234 MenuOSをデバッグする必要に接続するために
、なぜそれが1234ですか?-sは、ポート1234上のgdb-サーバーを作成することであるため

図赤のボックスに示すようにGDB、セットブレークポイントを入力した後、なぜ、特定のファイルの行に設定されていません。

:ダウン続行

ブレークポイントカードは
、リストを使用し、将来的に続け、エラー、解決策はありません

SYSTEM_CALL実行を続行するためにcキーを使用して、ブレークポイントを設定するには、命令が実行された時刻を見ることができます。

time_asmを実行すると、応答がありません。

カーネルコードの呼び出しでは第三に、システムプロセス

図1に示すように、システム初期化呼び出し機構

\ INIT \ main.cのstart_kernel trap_initがあります()
\ ARC \ X86 \カーネルの\ traps.c

IFDEF CONFIG_X86_32

     set_system_trap_gate(SYSCALL_VECTOR,&system_call); //系统调用的中断向量,system_call代表汇编代码入口,set_system_trap_gate用来绑定中断向量0x86和system_call中断服务程序入口。
     set_bit(SYSCALL_VECTOR,used_vectors)

ENDIF

システムコールは、中断の特別ポイント(またはいわゆるソフト割り込み)システムコールを処理するコードのSYSTEM_CALLこのセクションでは、コードのこの作品は、サイトSAVE_ALLサイトrestore_allの保存と復元のプロセスです。一方、system_call_tableテーブルがシステムコールである、システムコール番号は、EAXレジスタを送信し、それは、EAXレジスタに応じて対応するシステムコールカーネル・ハンドラを起動するときに、ユーザを呼び出します。

ENTRYは(SYSTEM_CALL)
RING0_INT_FRAME
ASM_CLAC
pushl_cfi%eaxに#システムコール番号保存
SAVE_ALL#シーンを保存し、スタックにすべてのCPUレジスタを保存するために使用される
構造thread_info現在のプロセスのアドレスを格納するために使用さGET_THREAD_INFO(%EBP)#ebp
、testlする$ _TIF_WORK_SYSCALL_ENTRY TI_flags(場合%ebp)
JNZ syscall_trace_entry
CMPL $(NR_syscalls)、%eaxに#検査システムコール番号(システムコール数がNR_syscalls未満でなければならない)
、違法なジェジュンsyscall_badsys#例外処理にジャンプ
syscall_call:
コール* sys_call_table(、%eaxに、4) #など、多数のシステムを呼び出すことにより、システムコールテーブル内の適切なシステムコールコア処理機能を見つけるSYS_TIME
MOVL%eaxに、スタックにPT_EAX(%ESP)#戻り値
syscall_exit:
testlする$ _TIF_ALLWORK_MASK、タスクの%ECXの#チェック対処する必要があり
、ここで、syscall_exit_workを入力する必要があり、最も一般的なプロセスのスケジューリング機会のあるJNE syscall_exit_work#
RESTORE_ALL:
TRACE_IRQS_TRET#復旧サイトの
irq_returnを:
INTERRUPT_RETURNの#iret

int型のX80(トリガ・システム・コールは)すぐにシステムコール番号、最も一般的なsyscall_exit_workプロセスのスケジューリング時間による位置SYSTEM_CALL(玄関システムコール)がsys_call_tableテーブル(システム・コール・テーブル)を見て、エントリにジャンプします。SYSCALL_VECTORは、ベクター0x80のシステムコールを中断します。

IVの概要

今週は、インターネット上で解決策を見つけるために、この問題を少し実験を行いましたが、あまりの関連情報は、彼らは解決策を知りませんでした。今週の研究では、カーネルのシステムコールの学習プロセス。

おすすめ

転載: www.cnblogs.com/eosmomo/p/11744182.html