1

内核 2.6.24.6

我正在写一个系统调用插入器。我想插入 mmap,但需要将代码复制并粘贴到实际的系统调用中,我想。我找不到要粘贴的代码?这东西在哪里?

谢谢

4

3 回答 3

3

mmap(2) C 函数只是在做一个syscall。您可能会发现MUSL Libc代码在其mmap.c文件中更易于阅读,该文件包装了系统调用(可能使用mmap2)。系统调用的实际处理是在内核内部完成的。

Linux Assembly Howto解释了系统调用是如何实际完成的。另请参阅x86-64 ABI 规范

于 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 回答