1

カーネル2.6.24.6

私はsyscallインターポーザーを書いています。mmapを挿入したいのですが、実際のシステムコールであるmethinksまでコードをコピーして貼り付ける必要があります。貼り付けるコードが見つかりませんか?これはどこにありますか?

ありがとう

4

3 に答える 3

3

mmap(2) C関数は、システムコールを実行しているだけですMUSL Libcコードは、syscallをラップするmmap.cファイル(おそらくを使用)で読みやすくなっていることに気付くかもしれませんmmap2。システムコールの実際の処理はカーネル内で行われます。

Linux Assembly Howtoは、syscallが実際にどのように行われるかを説明しています。x86-64ABI仕様も参照してください。

于 2012-10-27T03:47:43.847 に答える
1

カーネルは実際にプログラムで関数を提供できないため、アプリケーションVDSOへの呼び出しは、使用しているlibc実装に含まれています。最もありがたいことに、GNU libcを使用しています。これについては、ここでソースを見つけることができます。

于 2012-10-27T02:08:07.960 に答える
0

カーネルソースをダウンロードして、(カーネルソース)/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,
};
于 2015-04-09T09:58:16.617 に答える