Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在哪里可以找到mmap的源代码?_Linux_Linux Kernel - Fatal编程技术网

Linux 在哪里可以找到mmap的源代码?

Linux 在哪里可以找到mmap的源代码?,linux,linux-kernel,Linux,Linux Kernel,内核2.6.24.6 我正在写一个系统调用插入器。我想插入mmap,但需要将代码复制并粘贴到实际的系统调用methinks。我找不到要粘贴的代码?这东西在哪里 谢谢因为内核实际上无法在程序中提供函数,所以对应用程序VDSO的调用包含在您正在使用的libc实现中。最有可能的是,您使用的是GNULIBC,您可以找到它的源代码。C函数只是在做一个简单的操作。您可能会发现代码更易于在其文件中读取,该文件封装了系统调用(可能使用mmap2)。系统调用的实际处理在内核中完成 这篇文章解释了系统调用实际上是如

内核2.6.24.6

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


谢谢

因为内核实际上无法在程序中提供函数,所以对应用程序VDSO的调用包含在您正在使用的libc实现中。最有可能的是,您使用的是GNULIBC,您可以找到它的源代码。

C函数只是在做一个简单的操作。您可能会发现代码更易于在其文件中读取,该文件封装了系统调用(可能使用
mmap2
)。系统调用的实际处理在内核中完成


这篇文章解释了系统调用实际上是如何完成的。另请参阅。

您可以下载内核源代码并查看(内核源代码)/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,
};

你查过适用的libc的来源了吗?啊哈!进去后发现了一个名为mmap.c的东西-但是我没有看到像我预期的那样的mmap(mmap_ag_struct*arg)的定义…你可能会发现一个存根实现,而不是特定于arch的真实实现。另外,从手册页来看:自内核2.4以来,这个系统调用已经被mmap2(2)取代。现在,glibc mmap()包装函数调用mmap2(2)时会适当调整偏移量值。为什么不调用
glibc
mmap()
?这里的前提并不十分准确。虽然使用libc包装器是习惯性的和可移植的,但是编码直接系统调用是完全可能的。因此,事实上,如果您使用内核的调用约定,内核实际上可以为程序提供函数。换一种说法,libc只是一个可重用的程序组件。@ChrisStratton:我理解。重要的是,如果你不链接到
libc
,你不能只说
mmap2(…)
。此外,您甚至不必知道确切的ABI——至少在x86和x86-64上是这样——请看一看带有系统调用代码的新Linux VDSO。除了在现代Linux上,mmap()系统调用已被弃用或丢失之外,在用户空间中使用更灵活的mmap2()系统调用模拟功能。