麒麟操作系统内核的相似性分析
作者: 来源: 发表时间:2006-04-30
浏览次数:
字号:大 中 小
按照麒麟开发人员的解释,麒麟操作系统内核服务层使用的是FreeBSD 5.0的代码。可是,从我们的分析数据可以明显看出,Kylin 2.0.0和FreeBSD 5.0的相似度有40.53%,而与FreeBSD 5.3的相似度达到了60.26%,因此我们有理由相信麒麟使用的是FreeBSD 5.3或者5.4的代码。
当然,我们可以理解为这是开发人员的声明[3]中的一个笔误,他想说FreeBSD 5.x,而不是FreeBSD 5.0。但是,另一方面,如果说仅仅是外围服务层使用的是FreeBSD的话,那么麒麟与FreeBSD 5.3的相似度不应该高过FreeBSD自家不同版本之间的相似度。既然麒麟2.0.0内核与FreeBSD 5.3达到了60.26%的相似度,那么我们可以肯定地说,麒麟操作系统内核源代码至少有一半以上使用的是FreeBSD 5.3的源代码。
2.2.5 Kylin与FreeBSD 5.3, 5.4不同编译配置下的内核相似度分析
为了能够进一步了解麒麟操作系统内核同FreeBSD内核的相似度,接下来,我们将对FreeBSD 5.3和5.4在不变动任何源代码的情况下,重新进行编译,增加一些在Kylin 2.0中出现的模块。这样做的是希望在不修改FreeBSD代码的前提下,看看不同的编译配置是否能够使得FreeBSD与麒麟操作系统内核的相似度更高。
这次,我们在FreeBSD的内核编译配置文件GENERIC中增加如下三个选项:
options COMPAT_LINUX
options LINPROCFS
device sound
因为麒麟内核的一个亮点就是可以做到和Linux的二进制兼容,所以这主要是增加FreeBSD的Linux兼容性。其实事实上FreeBSD已经可以很好的兼容Linux二进制代码了,按照FreeBSD的内核设计,它完全可以同时支持多种ABI(应用程序二进制接口),并支持同时运行不同系统可执行文件。通过加载COMPAT_LINUX模块,FreeBSD就已经做到了和Linux可执行文件间的二进制兼容,可以执行大部分Linux程序[17]。
而LINPROCFS模块则是模拟了Linux的进程文件系统,也就是我们在Linux下见到的/proc目录,很多Linux的程序需要用到这个系统,因此加载这个模块后,可以让Linux更好的在FreeBSD上运行[18]。
最后增加了sound设备,因为我们通过分析,发现Kylin内核里面加载了各种声卡驱动。需要提及的是,麒麟系统启动比较慢,有可能也是因为编译了过多的不必要的模块进内核所导致的。
|
原始内核\目标内核 |
汇编行数 |
freebsd_5.3 |
freebsd_5.3_1 |
freebsd_5.4 |
freebsd_5.4_1 |
kylin_2.0.0 |
kylin_2.0.21 |
|
freebsd_5.3 |
1,161,593 |
- |
97.47% |
98.03% |
73.12% |
57.94% |
50.48% |
|
freebsd_5.3_1 |
1,198,401 |
93.78% |
- |
80.82% |
98.07% |
56.49% |
56.64% |
|
freebsd_5.4 |
1,174,287 |
96.97% |
94.55% |
- |
96.58% |
56.24% |
51.88% |
|
freebsd_5.4_1 |
1,210,928 |
91.68% |
97.05% |
94.56% |
- |
55.66% |
55.29% |
|
kylin_2.0.0 |
1,120,079 |
60.26% |
61.19% |
59.04% |
60.17% |
- |
91.06% |
|
kylin_2.0.21 |
1,190,562 |
52.04% |
57.02% |
50.87% |
54.38% |
85.57% |
- |
通过比对,我们可以看到,随着增加了Linux兼容性和声卡驱动模块后,Kylin 2.0与FreeBSD的5.3、5.4的相似度均有小幅提高。其中Kylin 2.0.0内核和FreeBSD 5.3的相似度为61.19%。我们有理由相信,随着更多合适的内核模块的加入,Kylin 2.0和FreeBSD的内核相似度有可能会进一步提高。
实际上,经过内核模块的比对,我们也发现了Kylin内核中出现了很多疑似是FreeBSD的其他模块,但是由于每次编译和比对要花费大量的时间,因此,我没有能够一一的加以测试。如果有兴趣的朋友可以进一步测试麒麟系统内核与不同的内核配置文件之间的相似度。
2.2.6 同一份FreeBSD 5.3代码,不同编译配置下的内核相似度分析
接下来,我们将在不修改任何FreeBSD 5.3内核源代码的前提下,尝试用不同的内核编译配置文件对FreeBSD 5.3内核进行编译。希望能够通过这样的尝试看出,同一份源代码,在不同配置文件下能够产生最低多低的相似度,换句话说,就是使相似度下降多少百分比。
在测试中,由于编译和比对的时间太慢,所以,我只用3个不同的内核配置文件编译内核,这相对于可能出现的内核数量是一个很小的比例。因此,我不能够得出最低使相似度下降的百分比,但是我能够得出至少可以使相似度下降多少百分比。换句话说,我能够测试出一个相似度可能被降低的范围,但是实际能够降低的范围比这个还要大。
|
原始内核\目标内核 |
汇编行数 |
freebsd_5.3 |
freebsd_5.3_1 |
freebsd_5.3_2 |
freebsd_5.3_3 |
|
freebsd_5.3 |
1,161,593 |
- |
97.47% |
72.01% |
71.62% |
|
freebsd_5.3_1 |
1,198,401 |
93.78% |
- |
96.95% |
94.32% |
|
freebsd_5.3_2 |
1,256,264 |
66.54% |
45.25% |
- |
98.11% |
|
freebsd_5.3_3 |
1,271,301 |
67.10% |
89.43% |
96.95% |
- |
我只是很少的修改了几个内核编译选项,我尽量使生成的内核大小不要差异太大。最后选定了3个比较合适的内核配置文件,它们与FreeBSD 5.3默认配置的内核差异从71.62%到97.47%。我们可以看到仅仅将内核配置文件稍加改动,就可以使同一份源代码编译出来的内核文件降低将近30%的相似度。可以预知的趋势是,随着改动的增大,将能够降低更多的相似度。
既然在不变动源代码的情况下,就可以将相似度降低到70%左右,那么仅仅是服务层采用FreeBSD 5.3代码的麒麟系统内核本应该有相当低的相似度,但是分析数据却得到了61.19%高相似度,因此麒麟操作系统内核的自主代码的比例确实是一个比较值得关注的问题。
2.3 结论
经过这次分析,我们比较了麒麟操作系统内核同FreeBSD, NetBSD, OpenBSD, Linux和Solaris内核的相似度。在发现麒麟内核与FreeBSD 5.x有30.43%-48.18%的相似度后,将麒麟内核与FreeBSD 5.x各个版本进行了比对。通过比对看到麒麟系统与FreeBSD 5.3默认内核达到了60.26%的相似度,在经过微小调整内核配置文件后,相似度又得到了进一步的提高,达到了61.19%。在继续调整内核配置文件之后,这个相似度还有进一步提升的空间。
随后,我们在不修改FreeBSD 5.3源代码的情况下,仅仅通过配置文件的变动,就使内核相似度降低到了71.62%,而且还有可能降的更低。
经过分析,我们可以看出麒麟操作系统与FreeBSD 5.3具有血亲关系,而且麒麟系统相对于FreeBSD 5.3的改动,还没有FreeBSD 5.3相对于FreeBSD 5.2.1改动大。从61.19%的相似度,我们可以认定,麒麟操作系统中至少有60%的代码是来自于FreeBSD 5.3的源代码。
由于简单的修改配置文件就可以使相同代码相似度降低到71.62%,而我们最终所得到的61.19%又是仅仅是麒麟内核同FreeBSD 5.3内核相似度的最小值,因此,实际的麒麟操作系统与FreeBSD 5.3在源代码上的相似度很有可能会达到甚至超过90%。
我们可以推测(但不确定)麒麟操作系统内核可能是通过以下几个步骤产生的。
首先是在FreeBSD 5.3内核源代码的基础上进行了部分的修改,可能是为了增强与LSB的兼容性。
然后,开发了Keta内核模块,来实现Kernel-based静态页面web加速器。
最后,以FreeBSD的默认内核配置文件GENERIC为基础,编译了更多的可选模块进内核。这么做的目的可能是为了让内核更具有通用性。
如果确实如此,那么生成的麒麟操作系统内核与其说是一个新的操作系统内核,不如说是被麒麟开发者打了内核补丁的FreeBSD 5.3更为恰当。
三、尾声
我们很难推测麒麟在内核创新的百分比,从已知的数据我们只能说,创新可能只有10%到20%之间。
首先,麒麟的官方说明中提到“主要是由具有Mach 风格的基本内核层、具有BSD 风格的系统服务层和具有Windows 界面风格的桌面环境组成,前两层在核态运行。”采用Mach微内核层+FreeBSD内核服务层的做法是其一个亮点。微内核构架加上一个成熟操作系统的服务层,是目前比较流行的一个做法,Mac OS X就是这样。在对Mac OS X的xnu内核源代码分析过程中,就可以看到其中的两层内核结构,很清晰。不过在我们反汇编麒麟操作系统内核的分析过程中,竟然连一个与Mach相关的内核函数都没有看到,许多关键的模块也基本上和FreeBSD相同而看不到Mach的身影,因此我们对于麒麟操作系统内核是否真如官方说明所宣称的那样,“具有Mach 风格的基本内核层”,还是抱有很大疑问的。
其次,从其对外宣称的一些麒麟的特性上看,绝大多数都是FreeBSD已经成熟的特性。比如,对Linux达到二进制兼容,事实上,FreeBSD很早以前就已经做到了和Linux二进制兼容了,麒麟直接采用了FreeBSD的内核源代码,也自然而然的支持了这个特性,无非是在于LSB兼容上进一步的做了一些工作。麒麟系统的所宣称的安全性应该也是继承于FreeBSD长期积累下来的健壮和稳定性上。
内核级代码确实可以大幅提高性能,Linux在2.4的时候也曾经采用一个叫做TUX的内核级的Web加速器来进行静态页面的加速处理。不过这个一直是争论的焦点,相当多的安全人士不推荐Linux这样设计,因为内核级代码虽然较快,但是,一旦发生溢出等安全攻击,那么攻击者就可以直接将自己的代码注入内核空间执行,具有系统最高权限,而不受约束。这将给系统安全性带来极大的隐患。另外,内核级的Web加速器也有其自身弱点,由于功能受限,而不能够用动态页面,只能够支持静态页面,所有的动态页面只有转交给另一个真实的Web服务器,比如Apache Web Server,才能够处理。所以对于动态页面,内核的Web加速器并没有什么明显效果。随着Linux 2.6的NPTL引入,用户模式下的多任务性能得到了大幅提高,TUX就很快被移出标准内核了。而FreeBSD的多任务模型和Linux很不同,特别是在FreeBSD 5.x后多任务模型有很大的改进,FreeBSD的用户模式的多任务性能并不是很差,为了这个不大的性能提高,而严重的降低系统安全性,实在是一个不明智的举动。在这种情况下,还宣称自己是高安全性,显得很不伦不类。
而且,从编译进麒麟内核的模块看,我们可以感到很多桌面系统的模块被加到了默认内核中,但是对外却宣称是服务器操作系统。我们都知道,安全的原则是最小化服务原则。多一个服务,多一个驱动,就多引入了一份不稳定和不安全。可是麒麟内核却加载了很多类似于屏幕保护模块、声卡模块、显卡图形驱动模块、ACPI电源管理的内核模块,这些模块对于一个服务器来说,并不是必须的,而且其中很多代码会给系统带来很大的安全隐患。这绝不单单是引导速度变慢的问题,麒麟宣称自己是服务器操作系统,但是在这点的选择上也是很不明智的。
最后需要提及的是,麒麟所安装的软件大部分是GNU的开放源代码软件,这些软件遵循GPL。它要求如果对任何代码进行了修改,必须开放修改过的源代码,。但不幸的是,麒麟操作系统虽然修改了部分的代码,却没有开放出修改后的源代码。从这种意义上说,麒麟操作系统对这些GNU的开源软件有侵权嫌疑。
附录A 进一步分析
如果想进一步的分析麒麟与其他操作系统的相似性,也可以从objdump导出的函数名称的相似度来比较。我曾经分析过FreeBSD 5.3内核和麒麟内核objdump出的函数名的差异。FreeBSD 5.3有14101个函数,Kylin 2.0有14399个函数,其中有4个函数出现在了FreeBSD 5.3而没有出现在Kylin 2.0中;有302个函数出现在了Kylin 2.0 objdump的文件里,而没有出现在FreeBSD 5.3的objdump文件里。经过分析,这302个函数中有223都可以在FreeBSD 5.3的源代码里找到,没有被objdump出来有可能是因为编译环境不同。还剩下79个函数可能是麒麟新增的函数,他们是:
+ acd_describe_proc():
+ ad_print_proc():
+ ata_info():
+ ata_proc_print():
+ bus_usb_proc():
+ g_conftxt_class_proc():
+ g_conftxt_geom_proc():
+ g_conftxt_proc():
+ ifa_ifwithnet_packet():
+ kevent_epoll_ctl():
+ kevent_epoll_wait():
+ kqueue_scan_epoll():
+ linprocfs_doata0info():
+ linprocfs_doata1info():
+ linprocfs_donetarp():
+ linprocfs_donetroute():
+ linprocfs_dopartitions():
+ linprocfs_doprogress():
+ linprocfs_doscsi():
+ linprocfs_dousbdevices():
+ linprocfs_dousbhub():
+ linux_emul_convpath_orig():
+ linux_gifindex():
+ linux_ioctl_floppy():
+ linux_sifflags():
+ linux_to_bsd_sifhwaddr():
+ mdchange_vnode():
+ mpt_get_tgt_negotiated_params():
+ mpt_physdisk_status():
+ mpt_print_header(): [OpenBSD]
+ mpt_print_raid_config():
+ mpt_raid_vol_status():
+ mpt_read_cfg_page_with_alloc():
+ mpt_read_config_info_raid(): [OpenBSD]
+ mpt_set_tgt_params():
+ packet_abort():
+ packet_appenctl():
+ packet_attach():
+ packet_bind():
+ packet_connect():
+ packet_control():
+ packet_detach():
+ packet_dhd_input():
+ packet_disconnect():
+ packet_init():
+ packet_input():
+ packet_output():
+ packet_peeraddr():
+ packet_proto_input():
+ packet_send():
+ packet_shutdown():
+ packet_sockaddr():
+ ptmsclose():
+ ptmsopen():
+ ptmx_clone():
+ ptmxclose():
+ ptmxinit():
+ ptmxopen():
+ raid_get_physdisk_by_num():
+ read_raid_info():
+ resolve_raid_targets():
+ scsi_proc_inquiry():
+ shmperm():
+ splash_progress():
+ syscons_progress():
+ sysctl_kern_umass():
+ usb_bus_exist():
+ usbd_add_procinfo():
+ usbd_devinfo_sn():
+ usbd_remove_procinfo():
+ xpt_announce_proc():
+ xpt_find_umass():
+ xpt_proc_periph():
+ xptdaannouncefunc():
以及
+ vfs_nmount():
+ mpt_read_config_info_ioc():
+ linux_epoll_create():
+ linux_epoll_ctl():
+ linux_epoll_wait():
如果单从函数名比对的统计上看的话,14399个函数,只有79个函数可能是原创的。与FreeBSD 5.3在函数名上的相似度有99.45%。这个相似程度十分惊人,但是仅凭函数名相似不足以说明逻辑上相似,因此,在分析报告中,这个分析数据只作为参考数据放到附录中。感兴趣的朋友可以进一步的分析。
附录B 参考资料