我闻到了linux新内核的坏味道

晨曦之光 发布于 2012/04/10 15:03
阅读 89
收藏 0

最近翻出了linux2.6.27的邮件列表,发现大牛们在讨论一个问题,就是说该如何扩展系统调用,是对每个需要扩展的系统调用都封装一个新的系统调用,还是添加仅仅一个系统调用来封装所有的需要扩展的系统调用。
起初,我觉得这个讨论蛮有意义,涉及到了设计模式什么的,可是总觉得哪里不对劲,有一种很不好的味道飘了过来,说不清什么味道,总之不是什么好味道。举个例子吧,linux很多系统调用可以返回文件描述符,而liuux中有个很重要的术语就是close-on-exec,就是fork过后会继承一些父进程 的文件描述符,但是带有close-on-exec标志的描述符在exec调用的时候要关闭掉,用fcntl可以设置close-on-exec标志,而 dup,传统的open都可以产生文件描述符却不能将close-on-exec一起设置,这就带来一个问题,就是open/dup和fcntl之间有一 个时间差,万一有一个子进程在这个时间差内调用了exec,那么它继承的父进程的文件描述符就没有被关闭,从而导致安全问题或者别的问题。
于是linux内核的开发人员就想出了一个招数,怎么办呢?很简单,规定新的系统调用在open或者dup的时候可以带有close-on-exec标志,这样不就大事化了了吗?是的,这样就解决了,glic需要改不说,你能保证用户一定记得在open和dup的时候加上那个标志吗?你不能,道理正如你 不能保证每一个程序员写出的代码都能编译通过一样简单。之前的那个例子完全可以用锁避免,而且什么时候forc,什么时候fcntl,以及什么时候 exec是应用程序员的事情,如果出错了,那也不管内核什么事,如果说内核确实在sys_fcntl和sys_exec之间没有控制好锁从而可能会导致竞 态,那就只改相关的部分就可以了,又何必改变应用程序的根基--系统调用呢?
     linux内核只提供机制而不提供策略是众所周知的真理,如果随意增加了新系统调用,而且需要通过参数来控制不同的功能,这和windows的api不就 一样了吗?十分怀疑有微软的人捣鬼。win32 api的特点就是参数丰富,功能强大,但是缺点有很明显,冗余,扩展性差,罗嗦,提供了策略等等,而linux的系统调用则干净,整洁,十分小巧,你可以 随意组合。linux正在偏离自己的原则。
     linux每一个系统调用的目的都很明确,做一件事并且只做一件事而且把它做好,这就是linux,如果linux的系统调用将来附加了很多参数,估计 man手册就没有用了,就要出一个类似于msdn的社区性质的东西了。附加参数并不是什么坏事,但是这不是linux的风格。
     linux的内核和用户空间的界限非常明确,就是系统调用接口,这个界面之上和之下应该只通过系统调用通信才对,因此系统调用本身必须稳定,不能变来变去的,再一个,之上和之下的部分必须明确哪些是自己该操心的哪些不是,现在发现linux内核中越来越多的加入了一些策略性的东西,而这些并不是linux 内核的事,它们是应用软件的事,连库甚至都不会去介入的事情,内核管它做甚?
不要学人家windows,人家本来内核和用户空间界限就不是很明显,要不是硬件必须规定区分0环和3环,你信不信微软敢自己实现一套机制,问题是人家是 大公司,有钱,玩得起,虽然很拙劣但是人家有的是客户,微软的成功有很多商业的因素在其中,内核和应用软件都是它一家公司在做,过分区分内核和应用干吗!因此windows就不会有那么多类似发行版的东西,而且也会经常出现一个应用软件错误挂掉整个系统的事情。linux的处境和windows的不同,可 以说截然相反,linux内核是该好好反思一下了。
我在linux的新内核中越来越多的发现很多花架子特性,好看不好用,别的就不说了,仅仅希望这个系统调用的扩展计划赶快停止吧,内核有问题的内核改,用户程序有问题的内核不要介入,也不要为了应用程序设计的简单而额外加入一些内核特性,这是很违反unix哲学的,当然可能对商业竞争有利。
我发现linux内核越来越乱,特性越来越杂,个人认为linux内核发展到2.6.10就是一个顶峰,之后就是花架子更新了,再往后呢,真是担心啊...


原文链接:http://blog.csdn.net/dog250/article/details/5303266
加载中
返回顶部
顶部