カーネル2.6.24.6
私はsyscallインターポーザーを書いています。mmapを挿入したいのですが、実際のシステムコールであるmethinksまでコードをコピーして貼り付ける必要があります。貼り付けるコードが見つかりませんか?これはどこにありますか?
ありがとう
カーネル2.6.24.6
私はsyscallインターポーザーを書いています。mmapを挿入したいのですが、実際のシステムコールであるmethinksまでコードをコピーして貼り付ける必要があります。貼り付けるコードが見つかりませんか?これはどこにありますか?
ありがとう
mmap(2) C関数は、システムコールを実行しているだけです。MUSL Libcコードは、syscallをラップするmmap.cファイル(おそらくを使用)で読みやすくなっていることに気付くかもしれませんmmap2
。システムコールの実際の処理はカーネル内で行われます。
Linux Assembly Howtoは、syscallが実際にどのように行われるかを説明しています。x86-64ABI仕様も参照してください。
カーネルは実際にプログラムで関数を提供できないため、アプリケーションVDSOへの呼び出しは、使用しているlibc実装に含まれています。最もありがたいことに、GNU libcを使用しています。これについては、ここでソースを見つけることができます。
カーネルソースをダウンロードして、(カーネルソース)/drivers/char/mem.cを確認できます。
そこで、プロトタイプを使用したmmapの簡単な実装を見つけることができます。
static int mmap_mem(struct file *file, struct vm_area_struct *vma)
ある時点で、mmap()はremap_pfn_range()を呼び出して、カーネルメモリをユーザースペースに再マップする必要があります。
これはドライバーのmmap()の最も単純な実装だと思いますが、他のドライバーコードを調べて、mmap()の実装について調べることもできます。ドライバーコードで次の構造を探す必要があります。
static const struct file_operations mem_fops = {
.llseek = memory_lseek,
.read = read_mem,
.write = write_mem,
.mmap = mmap_mem, // Function implementing mmap
.open = open_mem,
.get_unmapped_area = get_unmapped_area_mem,
};