内核2.6.24.6
我正在写一个系统调用插入器。我想插入mmap,但是需要将代码复制并粘贴到实际的系统调用中。我找不到要粘贴的代码?这件事在哪里?
由于
答案 0 :(得分:2)
mmap(2) C函数正在执行syscall。您可能会发现MUSL Libc代码在其mmap.c文件中更容易阅读,该文件包含系统调用(可能使用mmap2
)。系统调用的实际处理是在内核中完成的。
Linux Assembly Howto正在解释系统调用是如何实际完成的。另请参阅x86-64 ABI spec。
答案 1 :(得分:1)
由于内核实际上无法在程序中提供函数,因此对应用程序VDSO的调用将包含在您正在使用的libc实现中。最有可能的是,你正在使用GNU libc,你可以找到源here。
答案 2 :(得分: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,
};