実験分析:https://www.zhihu.com/column/c_142990858
Linuxはオープンソースのオペレーティングシステムです。ユーザーは、より適切な機能とより高い動作効率を備えたシステムをカスタマイズするために、独自のシステムに従ってカーネルを調整および変更できます。したがって、Linuxカーネルをコンパイルすることは、カーネル開発に必要な基本的なスキルです。
システムに必要に応じて新しいシステム呼び出しを追加することは、カーネルを変更する一般的な方法です。この実験を通じて、読者はLinuxシステム処理システム呼び出しのプロセスとシステムコールを追加する方法を理解する必要があります。
(1)指定されたプロセスの優れた値の変更または読み取り関数を実装するためのシステム呼び出しを追加し、プロセスの最新の素敵な値と優先度のPrioを返します。プロトタイプを次のように呼ぶことをお勧めします。
int mysetnice(pid_t pid、int flag、int nicevalue、void __user * prio、void __user * nice);
パラメーターの意味:PID:プロセスID。
フラグ:値が0の場合、それは素晴らしい値を読むことを意味します。値が1の場合、それは素晴らしい値を変更することを意味します。
Prio、Nice:プロセスの現在の優先順位と素晴らしい価値。戻り値:システムコールが成功したら0を返し、システムコールが失敗したときにエラーコードEFAULTを返します。
(2)(1)に追加された簡単なアプリケーションテストを作成します。
(3)Linuxのカーネル関数がプログラムで呼び出された場合、関連する関数のソースコードを詳細に読み取る必要があります。
Linuxによって提供されるモジュールメカニズムは、カーネルを再コンパイルすることなくLinux関数を動的に拡張でき、Linuxカーネルの多くの機能の実装に広く使用されています。この実験では、モジュールの基本概念、原則、および実装手法を学び、カーネルモジュールを使用してプロセスの基本情報をプログラムおよびアクセスし、プロセスの概念の理解とモジュールプログラミング技術のマスタリングを深めます。
(1)システム内のすべてのカーネルスレッドのプログラム名、PID番号、プロセスステータス、プロセスの優先順位をリストする必要があるモジュールを設計します。
(2)パラメーターがプロセスのPID数であるパラメーターを持つモジュールを設計します。このモジュールの機能は、プログラム名と親プロセスのPID番号、兄弟プロセス、子プロセスなど、プロセスの家族情報をリストすることです。
(3)あなた自身の状況に基づいて、プログラムで使用される関連するカーネル関数のソースコードの実装をさらに読んでください。
(1)Linuxのコマンドインターフェイスに精通している。
(2)Linuxプロセス制御のための関連システム呼び出しのプログラミングアプリケーションを通じて、プロセスの概念の理解をさらに深め、プロセスとプログラムの接続と違いを明確にし、プロセスの同時実行の特定の意味を理解します。
(3)Linuxパイプライン通信メカニズム、メッセージキュー通信メカニズム、および共有メモリ通信メカニズムの使用により、さまざまな種類のプロセス通信方法の理解を深めます。
(4)LinuxでのPOSIXセマフォを適用することにより、セマフォ同期メカニズムの理解を深めます。 (5)あなた自身の状況に基づいて、関連システム呼び出しのカーネルソースコードの実装をさらに読み、分析してください。
(1)一般的なLinuxコマンドに精通している:PWD、userAdd、passwd、who、ps、pstree、kill、top、ls、cd、mkdir、rmdir、cp、rm、mv、cat、more、grepなど。
(2)シミュレートされたシェルを実装します。
3つの異なるプログラムCMD1.C、CMD2.C、およびCMD3.Cを作成します。各プログラムの機能はカスタマイズされ、実行可能ファイルCMD1、CMD2、およびCMD3にそれぞれコンパイルされます。次に、シェルプログラムの関数をシミュレートするプログラムを作成します。ユーザーが入力した文字列(対応するコマンド名を表す)に基づいて、対応するコマンドの子プロセスを作成し、対応するプログラムを実行させます。親のプロセスは、子プロセスが終了するのを待ち、次のコマンドが受信されるのを待ちます。受信コマンドが終了した場合、親プロセスは終了します。受信コマンドが無効なコマンドである場合、「コマンドが見つかっていない」が表示され、待ち続けます。
(3)パイプライン通信プログラムを実装してください。
パイプラインは親プロセスによって作成され、3つの子プロセスが作成され、これら3つの子プロセスがパイプラインを使用して親プロセスと通信します。子プロセスは情報を送信し、親プロセスと他の3つの子プロセスは、すべてのメッセージを送信した後に情報を受け取ります。コミュニケーションの特定の内容は、独自のニーズに応じて意志で設計できます。ブロッキングの読み取りプロセスでさまざまな状況をテストし、パイプラインのデフォルトサイズをテストし、POSIXセマフォメカニズムを使用してプロセス間のパイプラインへの相互に排他的なアクセスを実現する必要があります。プログラムを実行して、さまざまな状況下でプロセスとプロセスのブロックとウェイクアップによる読み取りと書き込みの実際のバイト数を観察します。
(4)Linuxのメッセージキュー通信メカニズムを使用して、2つのスレッド間の通信を実現します。
2つのスレッドを作成するプログラムを作成します:送信者スレッドとスレッドを受信します。ここで、送信者スレッドはメッセージsender()を実行し、メッセージキューを作成し、ユーザーが端末を介して文字列を入力するのを待機し、ユーザーがエンサーが「exit」になるまでメッセージキューにレシーバースレッドに文字列を送信します。最後に、メッセージ「終了」を受信者スレッドに送信し、受信者の返信を待ちます。返信メッセージの後、ターミナル画面に受信した返信情報を表示し、関連するメッセージキューを削除し、プログラムの実行を終了します。レシーバースレッドはreceive()を実行します。これは、メッセージキューを介して送信者からメッセージを受信し、「end」のメッセージを受信するまで端子画面にメッセージを表示します。この時点で、それは送信者メッセージを送信者に送信し、プログラムの実行を終了します。名前のないセマフォを使用して、2つのスレッド間の同期と相互除外を実現します。
(5)Linuxの共有メモリ通信メカニズムを使用して、2つのプロセス間の通信を実現します。
共有メモリを作成するプログラム送信者を作成し、ユーザーが端末を介して文字列を入力するのを待ち、共有メモリを介してレシーバーに一連の文字列を送信します。最後に、受信者の返信を待ちます。返信メッセージを受信した後、ターミナル画面に受信した返信情報が表示され、共有メモリが削除され、プログラムの実行が終了します。共有メモリを介して送信者からメッセージを受信するレシーバープログラムを作成し、端末画面にメッセージを表示し、共有メモリを介して回答メッセージを送信者に送信し、プログラムの実行を終了します。名前付きセマフォまたはシステムvセマフォを使用して、2つのプロセスによる共有メモリの相互に排他的かつ同期して使用します。
特定のファイルストレージスペースの管理、ファイルの物理構造、ディレクトリ構造、ファイル操作を通じて、ファイルシステムの内部データ構造、機能、および実装プロセスの理解を深めます。
(1)ファイルストレージパーティションとしてメモリ内に仮想ディスクスペースを開き、マルチレベルのディレクトリに基づいた単一のユーザー単一タスクシステムにシンプルなファイルシステムを実装します。ファイルシステムを終了するときは、仮想ファイルシステムをファイルとしてディスクに保存して、次回メモリの仮想ディスクスペースに復元できるようにする必要があります。
(2)ファイルストレージスペースの割り当ては、明示的なリンク割り当てまたはその他の方法によって実行できます。
(3)無料のディスクスペースを管理するために、ビット図またはその他の方法を選択できます。ビットマップがファイルストレージスペースの管理に使用され、明示的なリンク割り当てを使用すると、ビットマップを脂肪に統合できます。
(4)ファイルディレクトリ構造は、マルチレベルのディレクトリ構造を採用しています。簡単にするために、インデックスノードを使用することができ、各ディレクトリアイテムにはファイル名、物理アドレス、長さなどの情報を含める必要があり、読み取りおよび書き込みファイルもディレクトリアイテムを介して保護できます。
(5)次の操作コマンドが必要です。