Windows 内核和 Linux 内核谁更复杂?

职场   2024-09-10 12:49   浙江  

看到这个话题,估计很多略懂一二的小伙伴都会一致地回答:

没有可比性!

如果一定要问为什么,一些耐不住寂寞的大佬就会跳出来解释:

Windows是混合内核,Linux是宏内核,二者的结构都不一样。

是的,没错,从内核设计的角度来说,Linux是宏内核,意味着 Linux 的内核是一个完整的可执行程序,且拥有最高的权限。

而Windows采用的是混合型内核,内核里面会有一个最小版本的内核,大部分服务都在内核中,就像是宏内核的方式包裹着一个微内核。

作为一个读过一点点Windows和Linux内核源码,并且写过几年内核驱动程序的同学,我个人的观点是:

Windows内核更加复杂。

在讨论这个观点之前,我们先要明确一下,什么是“内核”,只有明确了内核这个概念的范围,接下来的讨论才不是扯淡。

操作系统内核

首先从抽象层面来说,内核是作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节:

狭义上的操作系统内核,可能是只包含了内存管理、进程管理、设备驱动程序、文件系统、I/O管理、网络管理这几个核心组件。

从这个层面上来比较Windows和Linux,我觉得两个系统复杂度确实相当,而且各有千秋。

比如Windows的进程线程划分更加清晰,而Linux那糟糕的fork机制实在让人难受。

但在文件系统方面,个人觉得Linux的VFS比Windows的NTFS又要灵活太多。

再从广义上的操作系统内核来谈谈这个问题,它不仅包括管理硬件资源和提供基本服务的核心部分,还包括了其他必要的程序和函数库,共同构成了操作系统的基本框架和功能。

在这个层面,我认为Windows的复杂性要高得多,从以下几个方面来说明。

图形可视化

Windows操作系统之所以广受欢迎,部分原因在于其出色的图形用户界面(GUI)交互体验。微软为了提供流畅的GUI体验,将GUI的渲染和管理直接集成到了操作系统内核中,其中win32k.sys驱动程序扮演了核心角色。

系统调用是应用程序与内核交互的关键机制。在Linux中,这些调用通过sys_call_table实现,而在Windows中,则通过SSDT来管理。值得注意的是,Windows还拥有一个名为SSDTShadow的特殊机制,它同样位于win32k.sys中。由于图形处理的复杂性,win32k.sys在历史上多次成为安全漏洞的源头,这些漏洞往往可以通过简单的窗口函数调用,从而控制整个计算机。

兼容性

最典型的就是Windows的子系统机制,为了历史兼容,Windows内核提供了OS/2、POSIX、Windows三个子系统,Win10还支持了Linux。所以在Windows上,不是只有Win32应用程序可以运行,其他子系统的程序也能跑。

安全性

如果要问一个问题:Windows和Linux谁更安全?我想绝大多数人会认为Linux更安全,毕竟我们经常听到Windows又暴漏洞了,又被攻击了...

毋庸置疑,Windows是全球最流行的操作系统,现在可能被Android超越了,但它依然是黑客们眼中的“大目标”。

所以从Windows 2000到XP,再到Win7、Win8和Win10,微软一直在努力加强系统的安全性。他们引入了一大堆听起来就很高科技的安全措施,比如会话隔离、地址空间随机化、数据执行保护、内核地址空间随机化、控制流保护和返回流保护等等。这些安全功能的实现,都需要内核的强力支持,结果就是内核代码变得越来越复杂,就像一个不断膨胀的气球。

而Linux这边,虽然也有SELinux、命名空间和控制组等安全机制,但相对来说,Linux的历史包袱没那么重,复杂度也要低一些。

所以总体来看,微软喜欢把很多东西都往内核里塞,塞成了一个臃肿的大胖子。孰好孰坏?还真不好说。但在我看来,Windows的复杂度还是要更高一些。

我是「三世码农」,关注我加星标,干货不错过
↓↓↓

前端新世界
关注前端技术,分享互联网热点
 最新文章