当前位置: 华文星空 > 知识

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

2019-11-19知识

说没有可比性的,估计是为了防止引战。

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

讨论这个观点之前,咱们得先明确「 内核 」的概念,划定讨论的范围,否则就是扯淡。

狭义上的操作系统内核,可能只包含了 进程线程管理、内存管理、同步与异步、IO管理、文件系统、协议栈(勉强算?) 这几块部分。

如果只在这个层面上讨论问题,我觉得两个系统确实平分秋色,复杂度相当。各有长短,比如Windows的进程线程划分的更加清晰明确,而Linux那糟糕的LWP和fork机制实在让人难受。而在文件系统方面,NTFS又不如VFS来的清晰明了(虽然两者不是一个层面的东西)。

广义上的操作系统内核,还包含各自操作系统向上提供服务的一系列配套设施,但它们同样运行在内核模式下,注意,这里不包含第三方的驱动程序。

在这个层面,我认为Windows的复杂性要高了不少,举几个例子:

兼容性

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

图形可视化

众所周知,Windows的一大成功来自于其优秀的可视化交互能力,微软为了实现高效的可视化交互,将整个GUI的实现放到了内核中来完成,win32k.sys就是非常重要的组成部分。系统调用表,Linux上叫sys_call_table,Windows里叫SSDT,但Windows除了这个,还有一个SSDTShadow,它就在win32k.sys里面。图形处理,想也知道很复杂的东西,所以这个win32k.sys历史上闹出了不少的内核0day漏洞,通过几个窗口函数调用就能控制计算机的事情屡见不鲜。

安全性

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

没办法,谁叫Windows曾经是世界上运行设备最多的操作系统呢(好像现在被Android超过了),树大自然招风。因为面临无数的安全攻击,从Windows 2000到XP,到Win7、Win8到Win10,一直在不断增强自己的安全性,什么Session隔离、地址空间随机化ASLR、数据执行保护DEP、内核地址空间随机化KASLR、控制流保护CFG、返回流保护RFG等等,这些安全机制的落地都离不开操作系统内核的支持,使得内核的代码变得越来越臃肿复杂。

当然Linux上也有SELinux,namespace、CGroup等等内核安全机制,但总的来说,Linux历史包袱比不上Windows,复杂度要低不少。

除了这些真正的内核,Windows上还有不少的服务有运行在内核态的部分,你看C:\Windows\System32\drivers目录下大量的sys文件就知道了,这些又算不算是内核呢?

总体来说,微软喜欢把很多东西都往内核里塞,塞成了一个大胖子,是好是坏?不好说,但就题主的问题而言,在我看来,Windows的复杂度还是要更高一些。