Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

About linux-gate.so.1 and System Call

| Comments

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已经系统调用的一个发展。

  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出来。

  2. lnux-gate.so.1的意义在于gate:充当了用户和内核空间的大门,因此它与系统调用有关。

  3. 我们熟知的系统调用采取软中断方式,MSDOS时代使用int 0x21h,而Linux采取int 0x80h

  4. 以前的中断因为需要判断其权限,导致耗时较多,因此现代CPU采取了sysenter/sysexit中断方式,称为新系统调用,加快了进程速度。

  5. 不是所有的CPU都支持新系统调用,对于Intel CPU而言,只有Fmail>=6Model>=3Stepping>=3(可以从/proc/cpuinfo获得)才会支持。

  6. Linux kernel同时保留上述两种系统调用。只有在内核载入的时候,他会根据CPU的类型来决定采取那种模式

  7. 并不一定每个系统调用都需要通过快速系统调用来实现。比如,对于复杂的系统调用例如 fork,两种系统调用方式的时间差和系统调用本身运行消耗的时间来比,可以忽略不计,此处采取快速系统调用方式没有什么必要。而真正应该使用快速系统调用方式的,是那些本身运行时间很短,对时间精确性要求高的系统调用,例如 getuid、gettimeofday 等等。因此,采取灵活的手段,针对不同的系统调用采取不同的方式,才能得到最优化的性能和实现最完美的功能。

Comments