/**************************** * システムコール********************************/ (1)システムコールとは何か? システム コールは、カーネルとアプリケーション間のインターフェイスです。アプリケーションがハードウェア デバイスやその他のオペレーティング システム リソースにアクセスする場合は、システム コールを介してアクセスする必要があります。 Linux では、システム コールはユーザー空間がカーネルにアクセスするための唯一の手段です。例外と割り込みを除き、システム コールはカーネルへの唯一の正当なエントリ ポイントです。システムコールの数は少なく、i386 では約 300 個のみです。 (2)Cライブラリとシステムコールの関係 アプリケーション プログラマーは、システム コールを直接使用するのではなく、C ライブラリのアプリケーション プログラミング インターフェイス (API) を介してプログラミングを行います。 C ライブラリ内の関数は、システム コールを呼び出さないか、システム コールを単にカプセル化するか、複数のシステム コールを呼び出すことによって関数を実装する場合があります。 アプリケーション --> C ライブラリ --> カーネル システム コール プログラマーの観点から見ると、システム コールは無関係であり、API のみを処理すればよいのです。 カーネルの観点から見ると、カーネルはシステム コールのみを処理します。ライブラリ関数とアプリケーションがシステム コールをどのように使用するかはカーネルの関心事ではありません。 Unix システム コールは、特定の目的を達成するために使用される関数を抽象化します。これらの関数をどのように使用するかはユーザーの責任であり、カーネルは気にしません。 (3)カーネルに実装されたシステムコール機能 ユーザー空間でのシステムコールの使用例 #include <unistd.h> pid を取得します。 glibc ライブラリによってカプセル化された後、最終的にはカーネル内の kernel/timer.c の sys_getpid 関数が呼び出されます。この機能を参照してください。カーネル内のすべてのシステム コール関数は sys_ で始まります。
(4)システムコール番号 システム コールはユーザー空間からカーネル空間に入る必要があるため、単純な関数呼び出しでは完了できず、プロセッサによってサポートされているいくつかの特別なメカニズム (いわゆるソフト割り込み) を経由する必要があります。 x86 では、この特別なメカニズムはアセンブリ命令 int $0x80 であり、arm ではアセンブリ命令 SWI です。 この命令は、C ライブラリの関数にカプセル化されています。プログラムがこの命令を実行すると、CPU は特別な例外モード (またはソフト割り込みモード) に入り、プログラム ポインターを特定の位置 (ARM の割り込みベクター テーブルの 0x8 など) にジャンプします。 カーネルには多くのシステム コールが実装されています。これらのシステム コールのアドレスは、システム コール テーブルに順番に配置されます。このテーブルは sys_call_table と呼ばれる配列で、合計 NR_syscalls 個のエントリがあります。このテーブルを通じて、カーネルで定義されたすべてのsys_関数を呼び出すことができます。 アセンブリ命令 int $0x80 または SWI を呼び出すときは、同時にシステム コール番号を渡す必要があります。このシステム コール番号は、sys_call_table から対応するシステム コールを選択するためのインデックスとして使用されます。 int80 はシステムコール番号を eax レジスタに保存しますが、SWI はそれを命令に直接統合します (SWI 0x124 など)。 (5)システムコール実装機構 カーネル内のシステム コールを処理する関数は、arch/i386/kernel/entry.s の system_call で定義されていますが、arm システムは、arch/arm/kernel/entry-common.s の vector_swi で定義されています。 x86 システムのシステム コール テーブルは arch/i386/kernel/syscall_table.s (または直接 entry.s) で定義されていますが、arm システム コール テーブルは arch/arm/kernel/calls.s で定義されています。システム コール番号は include/asm/unistd.h で定義されています。 (6)システムコールを実装する際に注意すべき点 Linux にシステム コールを追加することは難しくありませんが、システム コールをどのように設計して実装するかが難しい点です。 Linux では、多目的システム コール (異なるパラメーターに基づいて異なる機能を提供する) の使用は推奨されていません。 システム コールは、受信パラメータ、特にユーザー指定のポインタの有効性を慎重にチェックし、次の点を確認する必要があります。
システム コールを実行する場合、カーネルはプロセス コンテキストにあり、スリープ状態になったり、プリエンプトされたりする可能性があるため、システム コールは再入可能でなければなりません。 (7)システムコールの例(カーネルの変更とユーザー空間プログラムの実装を含む) システムコールsys_fooを実装する a. システムコール番号を追加する
b. システムコールテーブルに追加 arch/i386/kernel/entry.s または syscall_table.s を変更し、以下を追加します。 c. システム コールは、コア カーネル イメージにコンパイルする必要があります。システム コールの定義は、kernel/sys.c など、その機能に最も関連のあるコードに配置し、次のコードを追加できます。 #include <asm/thread_info.h> /* * カーネルスタックのサイズを返す */ asmlinkage long sys_foo(void) { THREAD_SIZE を返します。 } d. ユーザー空間での呼び出し 通常、システムコールは C ライブラリによってサポートされており、glibc は独自のシステムコールをサポートできません。現時点では、システムコールに直接アクセスするには、Linux 自体が提供するマクロのセットを使用する必要があります。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: Reactドラッグフックを実装するための100行以上のコード
>>: MySQL の基本ステートメントを最適化するための 10 の原則の概要
コンポジション継承組み合わせ継承は、疑似古典的継承とも呼ばれます。これは、昨日説明したプロトタイプ ...
CSS における位置指定の概要position属性は英語で位置を意味し、 CSSでの主な機能は要素...
目次1. インラインスタイル2. インポート方法を使用する3.cssモジュールのエクスポート4. ス...
CentOS 7が正常にインストールされると、OpenJDKのJREがデフォルトでインストールされて...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
1 はじめにデータベース内のデータを操作するための SQL 文を記述するときに、いくつかの不快な問題...
コードをコピーコードは次のとおりです。 <前> <div> <sele...
[mysql] replace の使用方法 (フィールドの内容の一部を置き換える) [mysql]...
目次1. グローバル beforeEach 1. グローバル beforeEach 2. 実装2. ...
問題の原因:スレーブサーバーがクローンマスターサーバーである場合、server-uuidの値は同じで...
実際、Apacheクラスタを構築するのは難しくありません。私もインターネットで情報を見つけて自分で設...
目次序文導入JavaScript 履歴 API独自のネイティブJSルーティングを実装するHistor...
目次起源環境情報トラブルシューティングのプロセス要約する起源顧客は CentOS をベースにしたカス...
目次予備的注釈問題の再現データ削除の原則データの再利用どの操作がデータホールの原因になりますか?表領...
この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...