LKD 1のいくつかの段落を読みまし たが、以下の内容が理解できません。
ユーザー空間からのシステム コールへのアクセス
一般に、C ライブラリはシステム コールをサポートしています。ユーザー アプリケーションは、標準ヘッダーから関数プロトタイプを取得し、C ライブラリとリンクして、システム コール (または、syscall 呼び出しを使用するライブラリ ルーチン) を使用できます。ただし、システム コールを作成したばかりの場合、glibc が既にそれをサポートしているかどうかは疑わしいです。
ありがたいことに、Linux には、システム コールへのアクセスをラップするための一連のマクロが用意されています。レジスタの内容を設定し、トラップ命令を発行します。これらのマクロには という名前が付けられます。ここで、は 0 ~ 6 です。この数は、syscall に渡されるパラメーターの数に対応します。これは、マクロが期待するパラメーターの数を認識し、その結果、レジスターにプッシュする必要があるためです。たとえば、次のように定義されたシステム コールを考えてみましょう。
_syscalln()
n
open()
long open(const char *filename, int flags, int mode)
明示的なライブラリ サポートなしでこのシステム コールを使用する syscall マクロは、次のようになります。
#define __NR_open 5 _syscall3(long, open, const char *, filename, int, flags, int, mode)
次に、アプリケーションは単純に を呼び出すことができます
open()
。各マクロには、2+2×n 個のパラメーターがあります。最初のパラメーターは、syscall の戻り値の型に対応します。2 番目は、システム コールの名前です。次に、各パラメータの型と名前がシステム コールの順に続きます。
__NR_open
定義は<asm/unistd.h>
;にあります。システムコール番号です。マクロは、インライン アセンブリを使用_syscall3
して C 関数に展開されます。アセンブリは、前のセクションで説明した手順を実行して、システム コール番号とパラメーターを正しいレジスターにプッシュし、ソフトウェア割り込みを発行してカーネルにトラップします。このマクロをアプリケーションに配置するだけで、open()
システム コールを使用できます。素晴らしい新しい
foo()
システム コールを使用するマクロを作成し、テスト コードを作成して、私たちの努力を披露しましょう。#define __NR_foo 283 __syscall0(long, foo) int main () { long stack_size; stack_size = foo (); printf ("The kernel stack size is %ld\n", stack_size); return 0; }
アプリケーションは単に呼び出すことができます とはopen()
どういう意味ですか?
また、コードの最後の部分では、? の宣言はどこにありfoo()
ますか? このコードをコンパイル可能にして実行可能にするにはどうすればよいでしょうか? インクルードする必要があるヘッダー ファイルは何ですか?
__________
1 Linux カーネル開発、Robert Love 著。
wordpress.com の PDF ファイル(81 ページに移動)。Google ブックスの結果。