收藏 分享(赏)

关于LINUX和WINDOWS.doc

上传人:精品资料 文档编号:11039959 上传时间:2020-02-05 格式:DOC 页数:7 大小:20.64KB
下载 相关 举报
关于LINUX和WINDOWS.doc_第1页
第1页 / 共7页
关于LINUX和WINDOWS.doc_第2页
第2页 / 共7页
关于LINUX和WINDOWS.doc_第3页
第3页 / 共7页
关于LINUX和WINDOWS.doc_第4页
第4页 / 共7页
关于LINUX和WINDOWS.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、关于 LINUX 和 WINDOWS 的口水站已经很多了。本文企图从技术角度来比较下 2 个主流操作系统的异同。偏重于内核部分。一、二者区别:我觉得二者最大的区别在于 WINDOWS 是个商业软件,而 LINUX 是开源软件。商业软件的好处是可以集中一大批人力物力做一件事情。容易统一,兼容(因为客户需求)。而开源的好处在于灵活,开放。在下面的比较中,我一般先介绍下 WINDOWS 的,然后再介绍 LINUX 的。1、观念:商业 VS 开源WINDOWS 是个商业软件,它的源码是保密的. 当然,其他非 MS 的人也还是有机会看到源码的. 如果你和 MS 签订一个 NDA(NON DISCLOSU

2、RE AGREEMENT),那么你也有可能拿到 WINDOWS 代码.言规正传,我觉得商业也还是有好处的。比如兼容性好,我以前用 WDM 写一个驱动,最多改下编译选项就可以在 WIN 98, WIN 2K, WIN XP 下运行。十分方便。而如果换成 LINUX,那么你只好祈祷不同的内核版本之间没改那些你用到的头文件,函数接口。否则就要改代码了。同时,开源的好处是适合学习,十分灵活。我觉得 LINUX 十分适合学校,学生。因为开源,当你发现不明白的地方的时候,可以直接去看源码(还记得 RTFS? )。看不懂还可以到论坛上问。而对于 WINDOWS,你想了解它的内部机制就只好 GOOGLE,然后

3、祈祷了。比较好的一个资源是 MSDN 下面的一个杂志,其中有一个主题叫 UNDER THE HOOD, 或者搜搜BUGSLAYER 也可以。这 2 个专题的作者 Matt Pietrek 和 John Robbins 都是大牛级的人物。顺便说下 UNDER THE HOOD 这个名字本身。以前一直不太理解,因为查字典的话,HOOD 的意思也就是个盖子。那么盖子下面有啥呢?为啥要看盖子下面呢?来到美国之后,我渐渐明白了。HOOD 在这里应该理解为汽车的引擎盖。在美国,汽车是很普遍的。如果你开车,但是从来没打开过引擎盖,那么说明你只会用,而不了解汽车内部。那么如果你打开盖子看看呢?就可以看到很多内

4、部细节,比如发动机啥的了。在美国这个汽车王国,很多软件术语和汽车有关,因为人们日常生活中对汽车也很了解。比如“引擎”这个词,以前玩 3D 游戏的时候,常会看到介绍说,本游戏采用了最新的 3D引擎。啥意思呢?就是游戏最核心的部分(汽车引擎)已经升级了。不是只把外面的人物形象改了下而已。另外,开源软件也经常用汽车来类比。开源意外着你买了车(软件)后,可以随便拿到一个修理厂去修。也就是什么人都可以改,只要他懂。而 COPY RIGHT 软件呢,就是你买了车,但是引擎盖子是锁着的,坏了只能去生产厂家修,其他人修不了。如果万一生产厂家不想修或者不会修呢?那你就只能认命了。扯得有点远了,打住。1.1、发布

5、:2 进制 VS 源码这里主要讨论下 WINDOWS 和 LINUX 在发布程序采用的不同的形式和观念,这些和前面的商业还是开源的基本观念是联系在一起的。在 WINDOWS 世界,安装程序几乎全部都是以二进制形式发布的。也就是说,用户下载了一个程序,然后双击,一路 NEXT,NEXT,NEXT 就可以了。这个方法很适合初学者。在 LINUX 世界也有类似的机制,比如 YUM, APT-GET 等。不过 YUM 和 APT-GET 都是比较晚才出现的,在那之前,在 LINUX 世界安装程序要更麻烦些。有的时候,LINUX 的 YUM, APT-GET 还不够用。比如有的人写的一个小软件,没有放到

6、这些大的公共的库里面。这时,你就会发现他们一般提供一个或者一堆源文件,然后需要使用者自己下载,“编译”,安装。这也就是 LINUX 世界常见的源代码发布的形式。一开始的时候,十分不习惯 LINUX 的这种发布形式。用惯了 WINDOWS 的双击安装,总觉得LINUX 的安装很麻烦,又要自己./CONFIGURE, MAKE, MAKE INSTALL. 万一这个软件又依赖于其他的库,那么又要自己去找那些库,万一那些库又依赖其他的库 另外,各种库的版本也是一个问题,万一不兼容,那么又要找一个兼容的。为什么 LINUX 世界这么多源代码发布呢?为什么 WINDOWS 世界流行 2 进制文件发布,而

7、不是源代码呢?关于后者,很好解释,因为 WINDOWS 那边很多源代码都是商业秘密,是不公开的。同时,WINDOWS 的程序用到的那些库在一般的系统里都装好了。所以 2 进制发布可行,也十分方便。关于前一个问题,我觉得源代码发布的一个好处是可以在编译的时候进行一些优化和设置。比如同样的代码,在 32 或 64 位平台下编译的时候可以进行适当的优化。另外,用户也可以在编译的时候设置一些开关,这样在编译期间的优化一般要好于运行时间的优化。不过源代码发布的一个坏处就是对使用者要求较高。如果运行 configue,make 命令顺利的话还好。如果万一不顺利,要自己改下头文件啥的,无疑是一般的使用者无法

8、做到的。另外库之间的依赖关系如果是人手工处理的话也十分麻烦。好在 LINUX 世界后来有了 YUM APT-GET 之类的包管理系统。大多数软件都可以很方便的安装了。2、进程及其创建 CreateProcess VS forkexecv在 WINDOWS 世界,创建进程最常用的 WIN 32 API 是 CreateProcess 以及相关函数。这个函数需要一堆参数(WINDOWS API 的特点),不过很多参数可以简单的用 NULL, TRUE OR FALSE 来表示。另外,你直接告诉它要执行的是哪个文件。到了 LINUX 世界,我模糊的知道 fork 是用来创建一个新进程的。但是当我看

9、fork 的函数说明的时候,呆住了。因为 fork 不需要任何参数。习惯了 CreateProcess 的 10 来个参数,突然换成一个不要任何参数的函数,感觉很奇妙。一方面觉得似乎事情简单了很多,不用去把 10 来个参数的每个意思都搞明白。另外一方面又很疑惑,我怎么告诉它我要执行某个文件呢?后来才知道,LINUX 中的进程的含义和 WINDOWS 中是不一样的。LINUX 中的进程本身是可以执行的。而 WINDOWS 中,进程只是表示一个资源的拥有体,是不能执行的。要执行的话,一定需要一个线程。这也部分解释了为什么 CreateProcess 中为啥一定要传入要执行的文件的名字。而 fork

10、 的含义是把进程本身 CLONE 一个新的出来。也就是说,FORK 之后,父进程和子进程都执行同样的一段代码。如果想区分的话,可以根据 FORK 的返回值来区分。引用一段fork 的说明:On success, the PID of the child process is returned in the parents thread of execution, and a 0 is returned in the childs thread of execution.同时在 LINUX 程序中,常见的写法如下:int pid;pid = fork();switch (pid)case 0:

11、/I am the child;case -1: /failed.;default: /I am the parent为什么要这样设计呢?因为 LINUX 的设计目标之一就是应用于服务器。这种情况下,一个SERVICE 可能会启动很多进程(线程)来服务不同的 CLIENT. 所以 FORK 设计成快速复制父进程。子进程直接使用父亲的地址空间,只有子进程加载一个新的可执行文件的时候才创建自己的地址空间。这样节省了创建地址空间这个庞大的开销,使得 LINUX 的进程创建十分快。不过实际上,这里的进程相对于 WINDOWS 中的线程,所以同 WINDOWS 中的线程创建相比,二者的开销应该差不多。那

12、么如何才能让新的进程加载一个可执行文件呢,这时就要用 execv 以及相关函数了。所以 LINUX 中,代替 CreateProcess()的函数是 forkexecv3、文件格式 PE VS ELFWINDOWS 中的可执行文件格式是 PE。到了 LINUX 就变成了 ELF。2 者有相似的地方,比如都分成几个 SECTION,包含代码段,数据段等。但是 2 个又不一样。使得从一个转到另外一个的人不得不重新学习下。有点象在国内开惯了车的人,到了香港或者英国开车,虽然也是 4 个轮子一个方向盘,但是一个靠左行驶,一个靠右。总是需要些时间来习惯。那么为啥 LINUX 不能和 WINDOWS 用同

13、样的文件格式呢?我觉得可能的原因有几个。首先可能是 2 个差不多同时在设计的,彼此不知道对方的存在。所以也没法一方压倒一方。另外一个可能的原因是 PE 格式最开始还是保密的(后来 MS 公开了 PE 的 SPEC),所以即使LINUX 想直接用 PE 都不行。顺便说下,MS OFFICE 的文档格式以前也是保密的,直到最近(好像是 2008 年)才公开。希望这可以使得 OPEN OFFICE 的开发顺利很多。4、内核 API:固定 VS 非固定WINDOWS 内核有一套固定的 API,而且向后兼容。这使得 WINDOWS 驱动的开发人员在不同版本之间移植时变得很容易。比如我用 WDM (WIN

14、DOWS DEVICE MODEL) 开发一个驱动,最多改下编译选项就可以在 WIN 98, 2K, XP, 2003 下使用。VISTA 我觉得也许都可以。而 LINUX 没有固定的内核 API。2.4 版本的内核模块在 2.6 几乎很大可能是不能兼容的。要移植的话,不只是改个编译选项,而是要改一堆的头文件和实现文件等。而麻烦的是,即使都是 2.6 内核,不同的小版本之间也有些不同。如果你的内核模块刚好用到了变化的部分,那么也只好重新学习,然后改自己的头文件或者实现文件了。固定内核 API 的好处是兼容性好,坏处是包袱比较大,不得不随时支持老的,也许是过时的接口。比如 WINDOWS 内核里

15、有 WDM 一套 API, 但是又有网卡专用的 NDIS 一套 API. 实际上 2 套 API 的很多设计目标是重合的。那么为什么有 2 个呢?因为 NDIS 是先出来的,为了兼容性,一定要支持。而 NDIS 又只针对网卡,所以又出来了 WDM。不固定 API 的坏处是升级很麻烦,外围的内核模块维护者很辛苦。好处是可以随时采用更新的设计。5. WINDOWS 与 LINUX 中的中断处理比较5.1 不同之处:在 WINDOWS 中,有一个 IRQL (注意不是 IRQ)的概念。最早的时候,我以为是 CPU 设计里就包括了这个东东。后来看 INTEL CPU 手册,发现似乎没有。最近又看了一遍

16、 WINDOWS INTERALS 4TH。感觉这个东西应该是包括在 PIC OR APIC 里面的(关于 APIC,可以看我以前的帖子)。对于 X86-32,硬件设备的 IRQ 于 IRQL 之间的关系是:IRQL= 27-IRQ。引入IRQL 的动机似乎是这样的:当 CPU 运行在低 IRQL 时,如果来了一个高 IRQL 对应的中断,那么低的中断的 ISR 是会被高的 ISR 抢过去的。就是说低的 ISR 又被一个更高级的 ISR 中断了。这样的好处是优先级高的 ISR 可以更快的得到响应。另外,在具体实现中,由于操作 PIC OR APCI 改 IRQL 是比较费时的,所以 WINDO

17、WS 是尽量不去直接操作硬件,而是等到万不得已的时候才改。在 LINUX 中,似乎没有类似 IRQL 这样的观念。就我目前看过的书和代码来看,LINUX 中的ISR 或者是 KERNLE 最多是操作下 CPU 上的中断标志位(IF)来开启或者关闭中断。也就是说,要么中断全开,要么全关。从这一点来看,LINUX 在这部分的设计上比 WINDOWS 简单。5.2 相似之处:WINDOWS 和 LINUX 似乎都把中断分成了 2 部分。在 LINUX 中叫 ISR(还是其他?)和BOTTOM HALF。而 WINODWS 中,DPC(Deferred Procedure Calls)和 APC(As

18、ynchronous Procedure Calls)就非常类似 BOTTOM HALF。二者把中断分成两部分的动机是差不多的。都是为了把 ISR 搞得越快越好。LINUX 中,在 ISR 里一般关中断,所以时间太长的话,其他中断就得不到响应。WINDOWS 中,ISR 跑在一个很高的 IRQL 里面,同样会阻塞其他 IRQL比较低的任务。LINUX 中的 BOTTOM HALF 又可以分为 TASKLET 和 SOFIRQ。二者的主要区别是复杂度和并发性(CONCURRENCY)。下面 COPY 自一书。Tasklet: Only one instance of each tasklet c

19、an run at any time. Different tasklets can run concurrently on different CPUs.Softirq: Only one instance of each softirq can run at the same time on a CPU. However, the same softirq can run on different CPUs concurrentlyOnly one instance of each softirq can run at the same time on a CPU. However, th

20、e same softirq can run on different CPUs concurrently.WINDOWS 中的 DPC 有点类似 TASKLET 和 SOFTIRQ。DPC 是系统范围内的,并且运行在 DPC IRQL。是一个类似中断上下文的环境(INTERRUPT CONTEXT)。APC 和 DPC 的区别是运行在更低级别的 APC IRQL。另外,APC 是针对每一个线程的。执行在某个线程环境中。主要目的也是把一部分事情放到以后去执行。APC 又分为 KERNEL APC 和 USER APC。APC 这个观念在 LINUX 中似乎没有类似的?至少我还没想到。5.3 参

21、考文献:1 WINDOWS INTERALS 4TH2 UNDERSTANDING LINUX NETWORK INTERNALS, 2005UNICODE VS ASCIIKERNEL 4M/4K MIXED PAGE VS 4K PAGEFS SEGMENT VS NO FSGDI VS XWINDOWSIRP VS FUNCTION POINTER6、注册表 VS 普通文件windows 下的注册表在内核模式下的所有进程及线程都可以访问到,都可以修改,很方便对系统配置的修改。而 linux 下没有注册表的概念,系统配置必须在镜像产生前就配置好了(makeconfig)。因此相比之下,Linux 不适合动态地定制系统功能,而 windows 适合快速修改配置,实现系统的功能定制。二、一致的地方WINDOWS 和 LINUX 很多地方又很相似。我觉得基本原因有 2 个。一个是 2 者都继续了一部分 UNIX 中的东西。另外一个是 2 者都主要基于 X86 体系结构。当然 2 者也都支持很多其他体系结构,特别是 LINUX。我下面主要讨论在 X86 体系下一致的地方。1、观念一切皆文件。2、内核映射:2G:2G, 1G:3G. 线性映射3、SOCKET4、DEVICE DRIVER OR KERNEL MODULE5、系统调用,中断

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报