linux 是一个宏内核,能完成操作系统的基本功能,这和微内核系统不同,后者需要一组运行于这个微内核上的服务才能完成相应的功能。所以 linux 内核的开发很大程度上是对硬件驱动的开发,不同版本的 linux 内核,对硬件的支持是不同的。但是内核集成的驱动是有限的,比如显卡、声卡、摄像头的驱动就是独立开发的。不同的厂商根据掌握技术的不同,有能力的,就自己给内核做扩展和修修补补,这就导致即便内核版本相同,对硬件支持也有差异。同时由于产品定位不同,其包含的驱动也不同,关键看发行者的意图。很多硬件厂商也独立提供自己产品的驱动源代码,有精力、能力的系统开发人员就会把尽可能多的第三方驱动加进系统。这些都带来了硬件支持上的差异。比如,magic 作为一个桌面版操作系统,就要尽可能地兼容所有硬件,否则用户就要苦不堪言了。相反作为服务器版本,很多驱动都是用不到的,比如声卡,同时巨大的内核也会影响效率,所以其内核可能要小得多,同时还要在稳定性、安全性方面作很多修补,真对服务器作优化。
至于为什么不能不能拿别人的模块驱动自己的设备,首先问你一句常识,有多少设备的不同版本的 windows 驱动能够嫁接在一起运行呢?同样道理,linux 下也不行。驱动是直接和硬件打交道的,由于活跃地开发,不同内核的同一个驱动可能差异很大,同时驱动间存在依赖关系,如果其依赖环境发生变化,很可能导致这个驱动不能运行。所以对这样的底层模块移花接木,是费力不讨好的。有时,即便修改了一个配置项,编译出来的模块很可能不能在上一次编译的同一个内核里装载。据我所知,直到 2.6.15 版的 linux 内核,才增加了对其他版本内核模块的有限兼容能力,而且你必须开启这个选项才能使内核具备这种能力。