动态库在不同操作系统中的不同意义-阿里云开发者社区

开发者社区> 科技小能手> 正文

动态库在不同操作系统中的不同意义

简介:
+关注继续查看
“Unix 至少设立了三层内部边界来防范恶意用户或有缺陷的程序。一层是内存管理:Unix 用硬件自身的内存管理单元(MMU)来保证各自的进程不会侵入到其它进程的内存地址空间。第二层是为多用户设置的真正权限组——普通用户(非 root用户)的进程未经允许,就不能更改或者读取其他用户的文件。第三层是把涉及关键安全性的功能限制在尽可能小的可信代码块上。在 Unix 中,即使是 shell(系统命令解释器)也不是什么特权程序。”----《Unix编程艺术》:小即是美,这个词有两个例子可以证实,一个是古希腊的城邦,另一个是unix的进程设计原则。小,对于协作,可以最大化最简易地排列组合(DNA/两仪-四象-八卦);对于故障,可以最小化的影响其它;对于恩惠,可以最小化聚集和最大化扩散...小,可以更容易地由简入繁,由繁化简,在功能强大之后更简单地寻求高效。
     unix/linux中的pam机制是通过动态库来实现的,之所以采用动态库是因为它的“可替换性”,然后同样的事情在windows却成了尽量要避免的了,很多windows上开发的软件都有认证功能,很多有经验的人都会建议说,不要用dll实现认证,因为恶意者会替换掉这个实现认证的dll,这种说法也不无道理,看起来动态库认证的可替换性在unix/linux和windows上的价值截然不同,一个因之使用它而另一个却因之避免使用它,这就不得不扯到两类系统的设计原则。unix/linux有着严格的用户/组-权限的映射,而windows要么不实现,要么实现得很弱,如果不谈用户群习惯的话,这里已经可以说明windows的设计弊端了,可是深入研究一下就会发现,windows如此实现还是有道理的,那就是用户体验简单。windows的用户主要个人用户,使用操作系统的人很多时候就是一个人,而微软在设计windows的时候并没有将网络考虑在内,最起码没有在网络上花太大的力气,因此windows中的用户当然就不包括那些通过网络连接进来的人们了,微软操作系统的用户的概念就是那个正在使用计算机的人的抽象,而unix中用户却只是一个抽象的执行者,想 建立文件,读文件,写文件,远程登录等都需要一个合法的用户,在这等意义上,windows当然就没有必要去完善用户-权限的映射了,如果说unix/linux是和网络绑定在一起的话,那么windows则是和不联网的单台计算机绑定在一起的,所以一般的人都会使用administrator来登录机器,甚至计算机主人的朋友也会得到这个用户的密码,甚至windows机器是可以不设置密码就可以登入的(linux则必须输入root密码)。因此在windows上工作,学习或者娱乐,如果你拔掉网线,然后查杀一下病毒和木马,接下来的经历将是美好的,如果你插上了网线,那几乎是噩梦的开始,任何东西都是不安全的,这是因为如此,实现认证的dll才会被轻易的替换掉,如此一来,可替换性反倒成了一个容易攻破的漏洞了。在unix/linux上工作时,由于这操作系统在设计和改良之初本身就集成了网络,因此使用计算机的用户可就不仅仅是机器前面的那个人了,早在unix设计之初,终端的意义非常之大,实现一个分时的操作系统目的就是让很多用户可以通过终端连接在一台处理机上,可见unix的用户概念的持久性和重要性,linux就更不必说了,后来者的优势在于省去了当初unix集成TCP/IP时的那些争论,在unix/linux上,用户,权限,进程间通信,套接字,网络这些概念是一体的,而不是分离的。既然unix/linux中有如此强大的用户-权限映射功能,那么“可替换性”也就是成了一种灵活性而不是一个漏洞了。

     在unix/linux中,如果你删除/修改一个文件失败,那么原因几乎就是一个“无权限”,而在windows中,答案就是“此文件正在被使用”了,被谁使用呢?哪个进程,当前是哪个用户使用了它?...总之,很多因素揉在了一起。同样一个机制,在设计原则不同的情况下,一个系统视此机制为祸,而另一个系统却视此机制为福...两类系统有时也会相互影响,比如用惯了windows的人总受不了linux的限制,于是他们总是使用root来登录系统。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271825

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 “lua: attempt to yield across metamethod/C-call boundary”的错误(据悉主线程中调用yield也会如此)。
898 0
LeetCode 62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
111 0
GCC同时使用静态库和动态库链接
一 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。
795 0
操作高速通道 配置健康检查,只需四步!
阿里云每两秒从健康检查IP地址向本地数据中心中的客户侧互联IP发送一个ping报文,如果某条物理专线上连续8个ping报文都无法得到回复,则将流量切换至另一条链路。
580 0
gcc中动态库和静态库的链接顺序
so文件:动态库a文件: 静态库exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关)经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:1,动态库中可以包含另一个静态库,通过参数 -lxxx 把静态库libxxx.a加入so文件中,这样so文件中   就包含了libxxx.a的所有实现。
1044 0
gcc/g++ 静态动态库 混链接.
我的环境: centos6 x64. gcc4.4.7     在使用gcc/g++ 编译程序时我们希望指向一些库是使用静态的链接方式. 另外的一些是动态的方式. 我以boost 为例. 如果我们要使用静态库则是这样的: # g++ main.
1014 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载