我在Linus 系列的上一篇文章中提到了系统调用,有读者问,System Call(系统调用)和 Library Function(库函数)到底有什么区别呢?我在这简单回答一下。
操作系统的进程空间分为内核空间和用户空间,不同的空间需要不同的执行权限。其中系统调用运行在内核空间,库函数运行在用户空间。系统调用是通向操作系统本身的接口,面向设备驱动程序和硬件,属于底层调用,一般不具备可移植性。库函数是更高层次的接口,面向应用开发,通过执行系统调用满足应用软件的需求,并降低系统开销。
为了更好的理解这个问题,大家可以想象一个场景:你和你的小伙伴被空投到敌占区,抵达目标后,你通过对讲机呼叫小伙伴:
「土豆土豆,我是地瓜,请掩护我!」
「土豆收到,土豆收到,可我特么种你前头了,怎么掩护你啊?」
这种类型的通信,可以看作是库函数调用。
等摸清楚了敌人的军火库坐标,想干掉它得申请硬件资源,这时候就要呼叫总部:
「洞拐洞拐,我是地瓜,请向我开炮」
「洞拐明白,洞拐明白,你小子就等着一起飞上天吧」
这是系统调用。
之所以这么设计,主要是为了: 1、分层架构;2、避免把系统调用直接暴露在敌人面前;3、提高性能;4、增加应用层的可移植性。
大致如此。这个系列中会涉及一些技术话题,但大都浅显易懂,高手不屑一阅。有不明白的初学者或非 IT 朋友想弄明白的,Google 一下大致也能七七八八,实在不明白,提出来,我再用类似的方式给大家说说。
讲了 Linus,有读者说,给介绍介绍自由软件和开源协议吧,今天就讲讲这个。不过为了防止 Linus 系列成坑,我会继续写下去的,直到完成这个系列,请组织监督,请群众放心。
什么是自由软件呢?根据自由软件基金会的定义,自由软件(Free Software)是一种可以不受限制地自由使用、复制、研究、修改和分发的软件。不受限制正是自由软件最重要的本质。注意:其定义与是否收取费用无关,自由软件不一定是免费软件(整理自维基百科)。
自由软件运动的创始人是理查德·斯托曼,他的成就绝不输于李纳斯。这位奇才出生于1953年,那是个计算机大师扎堆出生的年代。20年后他正式成长为一个理想主义者和自由软件斗士,并开始了伟大的、光荣的、作死也不会死的战斗人生,他以个人对抗整个业界,他的对手不是人或公司,而是所有封闭的软件公司,比如苹果、微软、Oracle、IBM等等。他到目前为止的成就有三,个个牛逼二五:
1、开发了Emacs编辑器。Emacs不用介绍了,号称神的编辑器。 2、GNU通用公共许可证(GPL),这是世界上采用最为广泛的自由软件许可证。 3、Copyleft,所有的GNU程序都应遵循“Copyleft”原则,你可以复制、修改、出售自由软件,但是源代码相关的改动都必须公开,所有用户都可以获得改动后的源码。Copyleft保证了自由软件传播的延续性。
这些成就保障了自由软件世界的繁荣昌盛和长治久安,同时催生了一系列优秀的工具软件和函数库,比如文本编辑器、编译器、调试工具、Web 服务器等等,但 GNU 唯独没有开发出操作系统内核,可能是天意使然,就在这个节骨眼上,李纳斯开发的 Linux 内核横空出世了,并最终采用了GPL 协议,以完全自由、免费的方式发布,从此,GNU 算是功德圆满了,自由、开源和共享的精神一直延续到了今天。自由软件服务了千家万户,在这样一个信息共享的时代,我们每个人都或多或少的受益于斯托曼、李纳斯和自由软件的贡献。
随着自由软件的蓬勃发展,GPL 也根据开发者的需求和软件技术的发展衍生出诸多版本,目前世界上有上百种开源协议,常用的就有GPL、LGPL、Apache、MIT、BSD 等,如何搞明白这些协议对开发者来说十分困难,我根据网络资料画了一张关系图,大致解释了这几个流行的开源协议的关系和区别,感兴趣的看看今天的题图即可。
自由软件除了自由开放之外,还隐含着公民的隐私不受侵犯的含义。随着社会的发展,网络信息监控和审查越来越严重,伟大防火墙、实名制、审查制度等等,无一不包含着控制和垄断的意味。这就更加凸显处自由软件的意义。斯托曼说,「我们的社会正越来越依赖计算机,我们使用的软件对保证未来社会的自由至关重要。自由软件使我们能够控制我们使用的技术,让技术造福个人和社会,而不是让技术被商业公司或政府控制,用来限制或监视我们。」
很多软件人员使用自由软件更容易从经济角度关注免费的问题,事实上另一个Free与我们更加息息相关!
这个世界很多人觉得从未去争取过什么,活的也还不错。但真实的原因是,有很多类似理查德·斯托曼这样的人一直在风口飞翔,他们是一群特立独行的猪……
题图是用Omni Graffle制作而成,其中使用了 Flex Ding 提供的插件。