John Lee上午给我推荐了一个帖子what is linux-gate.so.1,下午才看完,觉得解释得很清楚,帖子较多的评论也说明了这点。
之前也曾有过关于linux-gate.so.1的疑惑,其表象就是linux-gate.so.1为什么找不到,却不知道什么原因,自己也没有去想办法解答这个疑惑。
看完后,和John Lee聊天,说到要不我就我能理解的,尝试翻译一下,他觉得可以,至少没有坏处。
遂开始着手,翻译到一半,突然想起,是不是已经有人已经做过的工作了呢,如果是,那我直接拿来主义就好了。
Google一把,·果然如此,同时在IBM-DEV上也找到了一篇与此相关的文章,当然它是从快速系统调用这个角度来写的。
综合这三篇帖子,基本搞清楚了linux-gate.so.1已经系统调用的一个发展。
linux-gate.so.1是一个虚拟的动态加载库(VDSO),它在每一个进程的存储空间,对于X86系统,就是在
0xffffe000-0xfffff000这段4k地址中。你可以使用dd if=/proc/self/mem of=linux-gate.dso bs=4096 kip=1048574 count=1的方式copy出来。lnux-gate.so.1的意义在于gate:充当了用户和内核空间的大门,因此它与系统调用有关。
我们熟知的系统调用采取软中断方式,MSDOS时代使用
int 0x21h,而Linux采取int 0x80h以前的中断因为需要判断其权限,导致耗时较多,因此现代CPU采取了sysenter/sysexit中断方式,称为新系统调用,加快了进程速度。
不是所有的CPU都支持新系统调用,对于Intel CPU而言,只有
Fmail>=6且Model>=3且Stepping>=3(可以从/proc/cpuinfo获得)才会支持。Linux kernel同时保留上述两种系统调用。只有在内核载入的时候,他会根据CPU的类型来决定采取那种模式
并不一定每个系统调用都需要通过快速系统调用来实现。比如,对于复杂的系统调用例如 fork,两种系统调用方式的时间差和系统调用本身运行消耗的时间来比,可以忽略不计,此处采取快速系统调用方式没有什么必要。而真正应该使用快速系统调用方式的,是那些本身运行时间很短,对时间精确性要求高的系统调用,例如 getuid、gettimeofday 等等。因此,采取灵活的手段,针对不同的系统调用采取不同的方式,才能得到最优化的性能和实现最完美的功能。