2011-09-13 10 views
12

以内に私は、現在のオペレーティングシステムについては、Linuxカーネル内のシステムコールを容易にするために、トラップを使用することを学んでいます。私はtraps.cにトラップのテーブルを配置し、entry.S内の多くのトラップを実装しました。実装は、Linuxカーネルソース

しかし、私は、システムコールを実装するためにトラップを利用Linuxカーネル内の2つのシステムコールの実装を見つけるように指示しています。私はトラップそのものの定義を見つけることができますが、私はカーネル内のこれらのトラップのいずれかへの "呼び出し"がどのように見えるか分かりません。したがって、私はこの動作の例を見つけるのに苦労しています。

誰もが尋ねる前に、はい、これは宿題です。注意点としては

、私はkernel.orgがダウンしていることから、カーネルソースを参照するにはGitHubのを使用しています: https://github.com/torvalds/linux/

+2

良い宿題の質問:) – James

+6

http://lxr.linux.no/を使用して、Linuxのソースを参照してください。 )あなたは時間のトンを節約します;) – rumpel

+0

@rumpel:聞いたことがない..非常に平凡に見えます。 vim + 'ctags'では利用できない特別なものがありますか? –

答えて

0

私はLinuxのカーネルに2つのシステムコールの実装を見つけるように指示していますこれはすべてのシステムコールシステムコール

を実装するためにトラップを利用してトラップを利用して(私が正しくリコール場合は0x80を中断)ので、「カーネル」ビットは、PSWにオンになり、特権操作プロセッサに利用できるようになります。

あなたは、システムコールがsys_call_table:下entry.Sに指定され、それらはすべてが「SYS」接頭辞で開始されて言及したように。

あなたがシステムコール機能ヘッダーを見つけることができます/ Linuxの/ syscalls.hが含まれ、あなたがそれをここに見つけることができます:一般的に http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

使用LXR(上記のコメントは、すでに述べてきたように)に順にソースコードを参照してください。あなたは、実際のシステムコールを探しているなら

とにかく、関数がSYSCALL_DEFINE1やマクロのパーソナルプラグインのバージョンを使用して実装され、 http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

+1

割り込みを必要としないファストコールもあります。私はそれらが実装されている方法についてはわからないので、あなたはそれのためにgoogleする必要があります、私は申し訳ありません。 – RedX

+0

@RedXあなたは一般的ですが、システムがEntry.Sを呼び出すのはかなり確信しています。 'sys_call_table'以下は割り込みで実装されています。 –

+2

@RedX x86ではSYSENTER/SYSEXIT命令がありますこれはおそらくあなたが考えているものです:http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

を参照して、システムコールの実装ではなく、多分あなたがしたいですいくつかのCライブラリを確認してください。カーネルにシステムコールが含まれているのはなぜですか? (私はシステムコールの実装の話ではない、私は、例えば例えば実際のchdirコールについて話している。ディレクトリの変更要求があるchdirシステムコールは、ありとchdirあり実際にそれを変更し、どこかにカーネル内でなければならないシステムコール実装)。私はあなたの質問の権利を取得する場合[OK]を、おそらくいくつかのカーネルがあまりにもいくつかのシステムコールが含まれませんが、それはまた別の話だ:)とにかく

、あなたは、実装が、実際の呼び出しを探していません。 GNU libcは私にとっては複雑すぎますが、ダイエットライブラリのソースをブラウズすることができます。いくつかの例:x86アーキテクチャについて

chdir.S

syscalls.h

7

はSYCALL_VECTOR(0x80の)割り込みのみ32ビットカーネルためを用いています。割り込みベクトルのレイアウトはarch/x86/include/asm/irq_vectors.hにあります。(AMD)intructionsがある64ビットのカーネルについては

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

、新しいSYSENTER(インテル)またはSYSCALL:traps.cからtrap_init()機能がentry_32.Sで定義されたトラップハンドラを設定し、1でありますパフォーマンス上の理由から使用されます。 syscall_init()関数のarch/x86/kernel/cpu/common.cは、entry_64.Sで定義され、同じ名前(system_call)で定義された "ハンドラ"を設定します。

ユーザースペースのぺぺぺーブについては、this page(関数/ファイル名のために古いもの)を見てみるとよいでしょう。

関連する問題