4章プロセスとスレッド
前章まででシンプルなカーネルモジュールの作り方を学びました。本章ではLinuxカーネルの内部について説明します。カーネルの最深部まで掘り下げることはしません。カーネルモジュール作成者やデバイスドライバ開発者が、プロセスやスレッドを管理する方法や、アーキテクチャを理解するために必要なことだけを説明します。これによって次章をよりよく理解できるでしょう。また、ユーザ空間、カーネル空間を問わずデバッグがやりやすくなるでしょう。
本章を読むにあたって、仮想記憶、ユーザモードプロセスの仮想アドレス空間、スタックなどについては知っているものと仮定しますが、後で少しだけおさらいをします。
4.1 プロセスコンテキストと割り込みコンテキスト
ここからは「3章 カーネルモジュールの作成」の「3.1 カーネルの構造を理解する」で説明したことを踏まえて説明します。
ほとんどの現代的なOSはモノリシックな設計です。モノリシックという言葉の意味は、文字通り「1つの大きな石の塊」です。詳しい意味は後で説明します。プロセスまたはスレッドがシステムコールを発行すると、特権のあるカーネルモードに切り替わり、自らカーネルコードを実行します。カーネル処理用の専用スレッドが実行するわけではありません。したがって、カーネルコードはユーザ空間のプロセスまたはスレッドのコンテキスト内で実行されると言えます。この実行コンテキストをプロセスコンテキストと呼びます。カーネルのほとんどのコードはプロセスコンテキストで実行します。例えばデバイスドライバのほとんどのコード、ページフォルトやシステムコールのようなプロセッサの例外処理やCPUスケジューリングなどです。
プロセスコンテキスト以外に割り込みコンテキストがあります。キーボード、ネットワークカード、ディスクなどの周辺機器からハードウェア割り込みが発生したとします。このときCPUの制御ユニットは現在のコンテキストを保存し、カーネルモードで割り込みハンドラのコードを実行します。このコードを割り込みサービスルーチン、ISRと呼びます。多くのデバイスドライバの割り込み処理用コードはこのように実行します。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access