Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
vdso和vsyscall是什么?_C_Linux_Linux Kernel_Kernel_Vdso - Fatal编程技术网

vdso和vsyscall是什么?

vdso和vsyscall是什么?,c,linux,linux-kernel,kernel,vdso,C,Linux,Linux Kernel,Kernel,Vdso,我做了sudo cat/proc/1/maps-vv 我正在尝试理解输出。我可以看到许多共享库按照预期映射到内存映射段 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /li

我做了
sudo cat/proc/1/maps-vv

我正在尝试理解输出。我可以看到许多共享库按照预期映射到内存映射段

7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923                   /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216                   /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220                   /lib/x86_64-linux-gnu/libnih.so.1.0.0
在接近尾声时,有一种类似

7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0                          [heap]
7fff97863000-7fff97884000 rw-p 00000000 00:00 0                          [stack]
7fff97945000-7fff97946000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
vdso
vsyscall
是什么意思?vsyscall是内存的内核部分吗?如果有人能解释一下这个问题,那就太好了。

vsyscall和vDSO段是两种用于加速Linux中某些系统调用的机制。例如,
gettimeofday
通常通过此机制调用。引入的第一种机制是vsyscall,它是作为执行特定系统调用的一种方式添加的,为了减少系统调用开销,这些系统调用不需要任何实际级别的权限来运行。在前面的示例之后,需要做的全部工作是读取内核的当前时间。有些应用程序经常调用
gettimeofday
(例如,生成时间戳),甚至需要一点点开销。为了解决这个问题,内核将一个页面映射到用户空间,该页面包含当前时间和一个fast
gettimeofday
实现(即,一个只读取保存到vsyscall中的时间的函数)。使用这个虚拟系统调用,C库可以提供一个快速的
gettimeofday
,它没有内核空间和用户空间之间的上下文切换所带来的开销,这通常是由经典的系统调用模型
INT 0x80
SYSCALL
引入的

但是,这种vsyscall机制有一些限制:分配的内存很小,只允许4次系统调用,更重要和更严重的是,vsyscall页在每个进程中静态分配到相同的地址,因为vsyscall页的位置固定在内核ABI中。vsyscall的这种静态分配损害了Linux常用的内存空间随机化带来的好处。攻击者在利用堆栈溢出破坏应用程序后,可以使用任意参数从vsyscall页面调用系统调用。他所需要的只是系统调用的地址,这是很容易预测的,因为它是静态分配的(如果您尝试在不同的应用程序中再次运行命令,您会注意到vsyscall的地址不会更改)。 最好删除或至少随机化vsyscall页面的位置,以阻止这种类型的攻击。不幸的是,应用程序依赖于该页面的存在和确切地址,因此无法执行任何操作

通过使用特殊的陷阱指令替换固定地址上的所有系统调用指令,解决了此安全问题。试图调用vsyscall页面的应用程序将陷入内核,内核随后将在内核空间模拟所需的虚拟系统调用。结果是内核系统调用模拟虚拟系统调用,虚拟系统调用放在那里是为了避免内核系统调用。结果是执行vsyscall需要更长的时间,但至关重要的是,不会破坏现有的ABI。在任何情况下,只有当应用程序尝试使用vsyscall页面而不是vDSO时,才会看到减速

vDSO提供了与vsyscall相同的功能,同时克服了其局限性。vDSO(虚拟动态链接共享对象)是分配在用户空间中的内存区域,它以安全的方式在用户空间公开一些内核功能。 这是为了解决由
vsyscall
引起的安全威胁而引入的。 vDSO是动态分配的,解决了安全问题,可以有4个以上的系统调用。vDSO链接通过glibc库提供。链接器将链接glibc vDSO功能,前提是这样一个例程有一个附带的vDSO版本,例如
gettimeofday
。当程序执行时,如果内核不支持vDSO,将进行传统的系统调用

学分和有用的链接:


我只想补充一点,现在在新内核中,
vDSO
不仅用于“安全”系统调用,还用于确定哪个系统调用机制是在系统上调用系统调用的首选方法。

Google for vDSO提供了这个wikipage(有更多参考)。,查看此文件的内核版本以了解系统的详细信息。我认为需要更好地解释此主题需要在wiki或procfs文档中找到的内容。为什么vsyscall只能有4个系统调用?为系统调用保留了8兆字节,只使用了1页(实际上是3个函数,由1024个take 1页组成)。