1

これらの関連する質問に対する一般的な回答を読みました。

しかし、それでも私自身の質問が残っています。たとえばint 0x80、カーネルサービスではシステムコールがありますが、コールを「サービス」するとはどういう意味ですか?たとえば、getuidに対してサービス呼び出しが行われた場合

#define __NR_getuid (__NR_SYSCALL_BASE+ 24)

その後、int 0x80発生すると、カーネルが呼び出しを処理します。では、getuidを実装するためにカーネルは正確に何をしなければならないのでしょうか?どこかに、の後に実行されるコードが必要int 0x80です。Linuxカーネルソースをダウンロードしたと仮定すると、どこ(たとえば、どのパス)のソースコード実装を見つけることができます__NR_getuidか?

4

2 に答える 2

3

のハンドラーgetuid(2)はにありkernel/timer.cますが、そこにはまったく啓蒙されない1行の関数があります。

make tagsカーネルソースディレクトリのトップレベルで言ってから、と言ってそのファイルを見つけましたvi -t sys_getuidsys_*()カーネルでsyscallエントリポイントに名前を付ける方法です。これを行うと、find0xDenによって指定されたコマンドが機能する理由がわかります。実際、私のシステムでは機能します。ただし、タグの使用はより速く簡単です。

そのため、カーネルがどのように機能するかを理解したい人には、カーネルに関する本を読むことをお勧めします。これらの本は、すべてのsyscallがどのように実装されているかを文字通り説明していません。これは、基本的にすべてのコードを1行ずつ説明する必要があるためです。カーネルには何百万ものSLOCがあります。印刷した場合、両面に小さなテキストで印刷したとしても、文字通りすべてを収納するための本棚が必要になります。

ドライバー、奇妙なファイルシステム、あまり人気のないCPUタイプなど、コア以外の部分をすべて無視して、これを合計サイズの1%に削減できたとしても、耕すための10万のSLOC。それは、多くの解説の余地を残さずに、それだけで大きな本を埋めます。

ですから、カーネルに関する本がやろうとしていることは、そこで何が起こっているのかを全体的に理解することであり、物事がどこに住んでいて、それらがどのように自分で活性化されるかを知ることができます。すべてを結び付けるデータ構造について学習するので、コールチェーンなどをたどることができます。

于 2013-01-25T00:38:05.740 に答える
0

find -name "* .c" | xargs grep -n -E "SYSCALL_DEFINE" | grep getuid

于 2013-01-24T11:28:51.600 に答える