1.2 Linux内核简介
Linux是操作系统大家族中的一名成员。从20世纪90年代末开始,Linux变得越来越流行,并跻身于有名的商用UNIX操作系统之列。这些UNIX系列包括AT&T公司(现在由SCO公司拥有)开发的SVR4(System V Release 4),加利福尼亚大学伯克利分校发布的BSD,DEC公司(现在属于惠普公司)的Digital UNIX,IBM公司的AIX,惠普公司的HP-UX,Sun公司的Solaris,以及苹果公司的Mac OS X等。
1991年,Linus Torvalds开发出最初的Linux,这个操作系统适用于基于Intel 80386微处理器的IBM PC兼容机。经过多年的发展,Linux已经可以在许多其他平台上运行,包括Alpha、Itanium(IA64)、MIPS、ARM、SPARC、MC680x0、PowerPC以及zSeries。
Linux最吸引人的一个优点就在于它是一个自由的操作系统:它的源代码基于GNU公共许可证(GNU Public License,GPL),是开放的,任何人都可以获得源代码并研究它;只要得到源代码,就可以深入探究这个成功而又现代的操作系统。Linux提倡自由、开源、共享,人人为我,我为人人。在GPL的号召下,全世界的Linux开发者组成了一个虚拟的开源社区。这是一种非常优秀的组织结构,尽管开发者分布在世界各地,但是可以通过源代码和互联网进行高效的无障碍交流。大家既从开源社区获取资源,也把自己的贡献回馈给开源社区。
从技术角度来说,Linux只是操作系统内核,而不是一个完全的类UNIX操作系统,这是因为它不包含全部的UNIX应用程序,诸如文件系统实用程序、命令解释器、窗口系统、图形化桌面、系统管理员命令、文本编辑程序、编译开发程序等。以上这些应用程序大部分都可在GNU公共许可证下免费获得,因此包含Linux内核、基础运行环境(运行时库如GLibc)、编译环境(如GCC)、外壳程序(Shell,即命令解释器)和图形操作界面(GUI)的完整操作系统套件被称为GNU/Linux。尽管如此,在大多数情况下,仍用Linux来指代完整的GNU/Linux。
Linux内核遵循IEEE POSIX标准(POSIX的全称是Portable Operating System Interface of UNIX,表示可移植操作系统接口)。它包括现代UNIX操作系统的全部特点,如虚拟存储、虚拟文件系统、内核线程、轻量级进程、UNIX信号量、SVR4进程间通信、支持内核抢占、对称多处理器系统等。
Linux内核是一体化内核(或称宏内核)操作系统,宏内核的设计风格是“凡是可以在内核里实现的都在内核里实现”。因此,除了异常/中断处理、内存管理和进程管理3大基本功能以外,文件系统、设备驱动和网络协议也放在内核层实现。宏内核的优点是内核内部的各种互操作都可以通过函数调用实现,因此性能较好;而缺点是体积较大且理论上健壮性不太好(因为内部耦合性太高)。与宏内核相对的是微内核,常见的实现是GNU Hurd,其设计风格是“凡是可以不在内核里实现的都不在内核里实现”,因此很多功能子系统被设计成了一种服务(进程)。微内核的优点是体积较小且理论上更健壮(因为内核本身的功能较少,不容易出错);而缺点是操作系统的大量互操作都依赖于进程间通信(Inter-Process Communication,IPC),因此性能较差。微内核虽然把一些内核的核心功能剥离到了服务进程中,但重要的服务崩溃后实际上跟内核崩溃类似,因为整个系统也同样处于一个基本不可用的状态。Linux虽然是宏内核,但是也吸收了一些微内核的优点,比如从1.0版本开始就可以通过模块化(将一些非核心的功能设计成可以运行时动态加载/卸载的内核模块)来减少内核核心部分的体积。
1.2.1 Linux内核发展简史
Linux内核从最初发布的0.01版本到本书所使用的5.4.x版本,经历了“史前时代”“奇偶时代”“快速演进时代”和“极速演进时代”4个阶段,如图1-6所示。
图1-6 Linux内核版本演进图
(一)史前时代(0.01~1.0)
版本更迭过程为0.01→0.02→0.10→0.11→0.12→0.95→0.96→0.97.x→0.98.x →0.99.x→1.0.0,其中重要的版本如下。
○ 0.01: 第一个版本。
○ 0.02: 第一个公开发布的版本。
○ 0.11: 《Linux内核完全注释》使用的版本。
(二)奇偶时代(1.0.0~2.6.10)
这个时期的版本号用“a.b.c”表示,其中a为主版本号,b为次版本号,c为修订号。版本号变更的原则是,发生重大改变时升级主版本号,发生非重大改变时升级次版本号;次版本号为奇数表示开发版,次版本号为偶数表示稳定版;稳定版和开发版在修订号上各自升级演进,开发版达到稳定状态时,发布下一个稳定版。比如1.0.x在尽量不引入新功能的前提下不断升级;同时1.1.x在不断开发新功能的状态下不断升级,当1.1.x开发到足够稳定时,转变成1.2.x成为稳定版;同时新的开发版1.3.x诞生……
稳定版包括1.0.x、1.2.x、2.0.x、2.2.x、2.4.x、2.6.x;开发版包括1.1.x、1.3.x、2.1.x、2.3.x、2.5.x,其中重要的版本如下。
○ 1.0.0:第一个正式版本,支持模块化,支持网络。
○ 1.2.0:开始支持非X86架构。
○ 2.0.0:开始支持对称多处理(SMP)。
○ 2.2.0:开始被各种发行版大规模应用。
○ 2.4.5:开始有“中国制造”的代码(如LVS等)。
○ 2.4.18:《深入理解Linux内核(第2版)》使用的版本。
○ 2.6.0:开始声名响彻天下。完全可抢占,O(1)调度器,SYSFS,X86_64支持,NUMA支持,NPTL支持……
(三)快速演进时代(2.6.11~2.6.39)
从2.6.11开始,Linux内核界发生了两件大事:第一件大事是抛弃了BitKeeper,转而开始用Git管理源代码;第二件大事是抛弃了奇偶版本法,转而使用“a.b.c.d”表示版本号,其中a为主版本号,b为次版本号,c为主修订号,d为次修订号。主修订号c的升级既包括新特性引入,也包括缺陷修订(Bugfix),次修订号d的升级只包括缺陷修订。
这个阶段开发速度加快,版本号即便c段相邻,差别也很大。在奇偶时代,2.4.5和2.4.6的差异不是很大;而在快速演进时代,2.6.36和2.6.37的差别会非常大,甚至与2.4.x和2.5.x之间的差异相当。
在演进如此迅速的时代,如果继续采用奇偶版本法会有什么问题?首先,2.7版本开发持续时间会很长,不到2.8版本发布时,2.7版本加入的新特性无法得到利用。其次,2.7版本新特性同样很难后向移植(backport)到2.6版本,因为代码差异太大。
这个阶段的重要版本如下。
○ 2.6.11.0:《深入理解Linux内核(第3版)》使用的版本。
○ 2.6.20.0:开始支持KVM虚拟化技术。
○ 2.6.23.0:开始支持龙芯2E,引入CFS调度器,缺省使用SLUB内存分配器。
○ 2.6.24.0:i386和X86_64合并成X86架构。
○ 2.6.33.0:开始支持龙芯2F,在MIPS系列处理器上支持内核压缩。
○ 2.6.38.0:引入AutoGroup机制,大幅提升桌面应用体验,引入透明巨页(THP)。
(四)极速演进时代(3.0~5.x)
在快速演进阶段,内核版本号的a.b一直保持为2.6没变,完全可以合二为一。与此同时,参与Linux内核开发的个人与单位越来越多,Linux内核发展开始进入极速演进时代。在这个阶段,版本号回归“a.b.c”表示法,其中a为主版本号,b为次版本号,c为修订号。在含义上,新的a相当于之前(快速演进时代)的a.b,新的b相当于之前的c,新的c相当于之前的d。次版本号b的升级既包括新特性引入,也包括缺陷修订,修订号c的升级只包括缺陷修订。关于每个版本的Linux内核都引入了什么新功能,可以参考本书附录B或者准官方的内核发行概述。
这个阶段的重要版本如下。
○ 3.6.0:开始支持龙芯1号。
○ 3.8.0:引入调度实体负载跟踪机制(PELT),MIPS系列处理器开始支持透明巨页。
○ 3.10.0:Radeon系列显卡开始支持高清视频解码(UVD)。
○ 3.13.0:NUMA调度性能大幅度改进。
○ 3.14.0:MIPS系列处理器开始支持FP64/O32。
○ 3.15.0:开始支持龙芯3A1000,开始支持MIPS向量扩展(MSA)。
○ 3.16.0:开始引入快速排队读写锁(qrwlock)。
○ 3.17.0:开始支持龙芯3B1500,开始支持MIPS硬件页表遍历器(HTW)。
○ 3.18.0:开始支持用GCC5编译内核。
○ 4.0.0:开始支持在线补丁(LivePatching)和内核地址净化器(KASan)。
○ 4.2.0:开始引入快速排队自旋锁(qspinlock),代码量达到2000万行。
○ 4.5.0:MIPS开始支持IEEE754-2008标准,引入CGroup_V2。
○ 4.7.0:开始支持龙芯3A2000,MIPS开始支持可变长ASID、48位虚拟地址空间、可重定位内核和内核地址空间布局随机化(KASLR),CPUFreq增加schedutil策略。
○ 4.8.0:开始支持龙芯1C,完善支持软件MIPS KVM,内存页回收从基于管理区重构为基于NUMA节点。
○ 4.9.0:MIPS开始引入通用内核,引入TCP拥塞控制算法BBR。
○ 4.12.0:MIPS支持48位虚拟地址空间和硬件虚拟化(KVM/VZ),在线补丁使用每进程一致性模型(原来是全局一致性模型)。
○ 4.13.0:开始支持龙芯3A3000,MIPS开始支持自旋锁/读写锁。
○ 4.15.0:开始支持RISC-V,X86引入KPTI(对付Meltdown漏洞)和Retpoline(对付Spectre漏洞)。
○ 5.0.0:调度器引入EAS(节能感知)特征,块设备层全面切换到多队列模型(blk-mq),AMDGPU显卡驱动支持FreeSync,全面支持零拷贝网络。
1.2.2 Linux内核的开发模式
目前,Linux内核开发处于极速演进时代。在代码仓库管理上,有主线仓库(Mainline)、稳定仓库(Stable)、未来仓库(Linux-next)和子系统仓库(Subsystem,如Linux-mips)4大类,其关系如图1-7所示。
图1-7 Linux内核的4类代码仓库及其关系
绝大多数开发者贡献的代码首先要接受子系统仓库管理员(Maintainer)的审核,才能进入某个特定的子系统仓库;在进入子系统仓库以后,未来仓库会进行二次审核;二次审核通过以后,将进入主线仓库(偶尔也有跳过未来仓库,从子系统仓库直接进入主线仓库的情况)。可以说,代码进入子系统仓库才仅仅处于Alpha状态;进入未来仓库才算达到Beta状态;如果进入了主线仓库,就相当于达到RC状态或者Final状态,算是被官方采纳了。通过这种多层次的严格审核,Linux内核的代码质量得到了极大的保障。
下面分别介绍这4类代码仓库。
(一)主线仓库
主线仓库是最重要的仓库,其升级规则是在次版本号上面升级演进,两个正式版之间会发布若干个候选版(RC版),如3.0→3.1-rc1→3.1-rcN→3.1→3.2-rc1→……
某一个正式版和下一个候选版之间的时期叫作合并窗口期,比如3.0和3.1-rc1之间就是3.1的合并窗口期。只有在合并窗口期才允许增加新特性,其他阶段只允许缺陷修订。也就是说,如果开发者想让某个新特性进入3.1内核,那么必须保证在3.1-rc1之前进入,否则就只能等待3.2的合并窗口期了。主线仓库的管理员及对应的仓库地址如下。
管理员:Linus Torvalds
Git仓库地址:git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
(二)稳定仓库
稳定仓库基于主线仓库的正式版产生,在修订号上面升级演进,如3.0.x分支和3.1.x分支在稳定仓库中的版本演进关系分别为3.0→3.0.1→3.0.2→3.0.3→3.0.N→……和3.1→3.1.1→3.1.2→3.1.3→3.1.N→……
稳定仓库的代码变更全都是缺陷修订,不引入新的特征,其管理员及对应的仓库地址如下。
管理员:Greg Kroah-Hartman等
Git仓库地址:git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
(三)未来仓库
未来仓库的前身为Andrew Morton维护的Linux-mm。代码变更在进入下一版主线仓库之前先到达这里,如果说主线仓库在功能上类似于奇偶时代的偶数版本(稳定版)的话,那么未来仓库在功能上就类似于奇偶时代的奇数版本(开发版)。未来仓库的版本命名规则是日期,如Next20151212。未来仓库会不定期合并主线仓库的代码,将其作为新一轮添加特性的基础(Base)代码。未来仓库的管理员及对应的仓库地址如下。
管理员:Stephen Rothwell
Git仓库地址:git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
(四)子系统仓库
子系统仓库为数众多,一般按体系结构(arch)、驱动类型(drivers)进行分类。龙芯内核开发者比较关心的子系统仓库主要是以下两个。
○ MIPS子系统:管理员为Ralf Baechle
Git仓库地址:git://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git
○ GPU子系统:管理员为David Airlie
Git仓库地址:git://people.freedesktop.org/~airlied/linux
和未来仓库一样,子系统仓库会不定期合并主线仓库的代码,将其作为新一轮添加特性的基础代码。
内核根目录的MAINTAINERS文件会列出所有的现任管理员及其相关信息,比如MIPS架构下面龙芯相关的3个子架构(即龙芯1号、龙芯2号和龙芯3号)的管理员信息如下。
MIPS/LOONGSON1 ARCHITECTURE M: Keguang Zhang <keguang.zhang@gmail.com> L: linux-mips@vger.kernel.org S: Maintained F: arch/mips/loongson32/ F: arch/mips/include/asm/mach-loongson32/ F: drivers/*/*loongson1* F: drivers/*/*/*loongson1* MIPS/LOONGSON2 ARCHITECTURE M: Jiaxun Yang <jiaxun.yang@flygoat.com> L: linux-mips@vger.kernel.org S: Maintained F: arch/mips/loongson64/fuloong-2e/ F: arch/mips/loongson64/lemote-2f/ F: arch/mips/include/asm/mach-loongson64/ F: drivers/*/*loongson2* F: drivers/*/*/*loongson2* MIPS/LOONGSON3 ARCHITECTURE M: Huacai Chen <chenhc@lemote.com> L: linux-mips@vger.kernel.org S: Maintained F: arch/mips/loongson64/ F: arch/mips/include/asm/mach-loongson64/ F: drivers/platform/mips/cpu_hwmon.c F: drivers/*/*loongson3* F: drivers/*/*/*loongson3*
MAINTAINERS文件中包含一个个子架构的条目。每个条目的开头第一行是关于子架构的描述,比如,龙芯1号的MIPS/LOONGSON1 ARCHITECTURE、龙芯2号的MIPS/LOONGSON2 ARCHITECTURE和龙芯3号的MIPS/LOONGSON3 ARCHITECTURE。M开头的行是管理员的姓名和电子邮箱,龙芯1号的管理员是张科广,龙芯2号的管理员是杨嘉勋,这两位都是开源社区的龙芯爱好者,而龙芯3号的管理员就是笔者(陈华才)。L开头的行是该子架构用于开发交流的邮件列表;S开头的行是该子架构的维护状态;F开头的行是该子架构涉及的主要源代码文件的路径。
1.2.3 关于长期维护稳定版本
所谓的长期维护稳定(Long Term Stable,LTS)版本,实际上是一种特殊的稳定(Stable)版本。Stable版本的缺陷修订实际上是主线版本中缺陷修订的后向移植。普通的Stable版本的维护时间为3个月左右,因此当主线仓库中下一版的正式版发布,上一版的Stable分支就不再继续升级(End Of Life,EOL)。而LTS版本的维护时间为2年左右,也可能更长。同时维护的LTS版本为5个左右,当一个新的LTS版本被选中时,一般最老的LTS版本就不再继续升级(EOL)。
Linux内核官方选择长期维护稳定版本的依据大致有几点:具有里程碑意义(如3.0),过去一段时间内引入的新特性的集大成者,或者被Redhat、Debian等著名发行版采用的版本。曾经被选为长期维护稳定版本的内核有2.6.16.x、2.6.27.x、2.6.32.x、2.6.33.x、2.6.34.x、2.6.35.x、3.0.x、3.2.x、3.4.x、3.10.x、3.12.x、3.14.x、3.16.x、3.18.x、4.1.x、4.4.x、4.9.x、4.14.x、4.19.x和5.4.x。
1.2.4 龙芯的内核版本选型
上一小节所提到的长期维护稳定版本是指Linux内核官方的版本选型。通常Linux操作系统发行商和CPU生产商也会提供自己主导开发的长期维护版本,厂商的选型与官方的选型可能相同也可能不同。龙芯的Linux内核开发主要由龙芯中科与航天龙梦两家单位主导,而龙芯相关的内核代码是随着时间的推移逐步融入Linux官方的。即便是官方的5.4.x版本,也并未全部采纳龙芯相关的内核代码,因此官方内核尚不能完美支持龙芯。为了满足各种不同的需求,龙芯中科与航天龙梦提供了多个完全支持龙芯的长期维护稳定版本,包括2.6.32.x、2.6.36.x、3.4.x、3.5.x、3.6.x、3.8.x、3.10.x、3.16.x、4.1.x、4.4.x、4.9.x、4.14.x、4.19.x和5.4.x。自3.10.x以来的所有官方LTS版本几乎都在此列。
龙芯选择长期维护稳定版本时有两种主要思路:一种是基于官方Linux内核(也称Vanilla Kernel,香草内核),另一种是基于RHEL(RedHat Enterprise Linux,即红帽企业版Linux,应用最广泛的Linux发行版之一)。经过多年的开发实践,现在笔者和龙芯开源社区都倾向于选择官方Linux内核,因为官方内核是“内部完全自洽”的,而红帽企业版Linux是“内部部分自洽”的。
那么如何理解“内部完全自洽”和“内部部分自洽”呢?众所周知,Linux内核源代码大致包括体系结构部分(arch),公共部分(common,包括scheduler、mm、fs等)和设备驱动(driver)。而arch细分又包括X86、ARM、MIPS、PowerPC等众多架构。官方内核的各种arch、各种driver以及public的任意组合都是能正常工作的,称为“内部完全自洽”;而红帽企业版Linux主要为X86定制优化,从官方内核引入某一版本(如3.10.0)的基础代码之后,会大规模引入后向移植,因此红帽企业版Linux对于X86来说是自洽的,但对非X86的MIPS等架构来说是严重不自洽的。
我们可以通过内核版本(KernelVersion)、后向移植(Backport)与KernelLevel等几个概念来更清楚地描述这个自洽问题。
官方内核有清晰的内核版本演进策略。比如目前使用a.b.c版本号结构,a和b是大版本演进,一边加入新功能,一边修复缺陷;c是稳定性演进,只修复缺陷。例如,4.2.0版会在4.1.0版的基础上增加新功能,同时修复缺陷;而4.1.1版只是在4.1.0版的基础上修复缺陷。因此,每当一个大版本发布(a或者b的升级),就会产生新的分支进入稳定通道(只升级c),4.1.x和4.2.x是不同的稳定分支。其中一部分稳定分支会作为官方的LTS分支,如前面提到的4.1.x、4.4.x、4.9.x、4.14.x、4.19.x及5.4.x。其他如4.2.x、4.3.x只是普通的稳定分支,而官方主线分支本书写作时已经升级到了5.5-rc1。
官方内核和红帽企业版Linux都会做后向移植,但官方内核的后向移植是全范围的修复缺陷,而红帽企业版Linux的后向移植是选择性地加入新功能和修复缺陷。这正是“内部完全自洽”与“内部部分自洽”问题的根源:红帽企业版Linux对X86和driver有大量的后向移植(尤其是有大量的新功能 ),对MIPS几乎没有后向移植(连修复缺陷都没有);导致红帽企业版Linux在X86架构上自洽,而在MIPS架构上不自洽。
我们以官方内核作为标杆,将任意内核源代码中某个子系统的版本状态定义成KernelLevel。那么上述问题用KernelLevel量化一下就更容易理解了。
○ 官方3.10.0内核:ArchLevel=X86Level=MIPSLevel=3.10,CommonLevel=3.10,DriverLevel=3.10,PatchLevel=0。
○ 官方3.10.108内核:ArchLevel=X86Level=MIPSLevel=3.10,CommonLevel=3.10,DriverLevel=3.10,PatchLevel=108。
○ 官方4.14.0内核:ArchLevel=X86Level=MIPSLevel=4.14,CommonLevel=4.14,DriverLevel=4.14,PatchLevel=0。
○ 官方4.14.120内核:ArchLevel=X86Level=MIPSLevel=4.14,CommonLevel=4.14,DriverLevel=4.14,PatchLevel=120。
○ 红帽3.10.0内核:ArchLevel=Undefined(其中X86Level≈4.0,MIPSLevel= 3.10),CommonLevel≈3.18,DriverLevel≈4.2,PatchLevel=Undefined(X86相关部分与X86Level基本一致)。
当内核中几个主要部分的KernelLevel完全相同时,即ArchLevel=CommonLevel=DriverLevel,我们称为内部完全自洽。当ArchLevel中各个架构的KernelLevel互不一致,但其中某个架构的KernelLevel与CommonLevel或DriverLevel保持一致或基本一致时,我们称为针对某架构的内部部分自洽。PatchLevel越高,代表在该分支里面越稳定(因为缺陷修订越全面)。
因此我们可以得出以下几个结论。
1. 所有版本的官方内核均内部完全自洽。
2. 同一个稳定分支的官方内核,版本号第三位越高越稳定。
3. 红帽3.10.0内核对X86自洽并且基本相当于官方4.0版本(特指RHEL7.2的标配内核,因为随着RHEL的升级,红帽企业版Linux的KernelLevel还会继续发生改变),对MIPS完全不自洽(甚至都无法顺利编译)。
龙芯长期维护的Linux内核应当如何选型的答案是显而易见的:官方内核。选择官方内核的优点是更好的内部完全自洽,也就更加稳定可靠,适配更容易;其缺点是相比于同一个标称版本的红帽企业版Linux,驱动比较旧,支持的设备比较少。然而,选择官方内核是利大于弊的,并且我们可以采用以下几种同时维护多个内核版本的方法。
1. 龙芯在确实需要3.10.x内核的时候,可以选择基于最稳定版本的官方内核3.10.108。
2. 龙芯在需要支持各种新功能和新设备时,可以选择基于新稳定版本的官方内核,如4.14.x或者4.19.x。
3. 龙芯由于特殊情况需要3.10.x内核但又想支持个别新设备时,可以选择基于最稳定版本的官方内核3.10.108,通过仔细查看官方内核的Git历史记录然后针对特定设备做后向移植(万万不可采取从新版本内核中批量复制目录的方法)。
4. 龙芯如果既想要大规模支持各种新功能和新设备,又想维持3.10.x主版本号不变的印象时,可以直接选择新版本的官方内核,如4.14.x或者4.19.x,然后通过修改Makefile伪装成3.10.x(就跟RHEL标称的3.10.0内核一样,只是给用户制造了一个3.10.0的假象,其内容根本不是3.10.0)。
方法1和方法2是自然而然的,是大多数情况下的正确选择;而方法3和方法4是特殊情况下的特殊选择。方法3对内核开发人员的技能要求比较高,但是这种移植的工作量是值得的,开发人员可以更深刻地掌握设备驱动;即便移植得不够完美,其影响也是“有界”的,而选择红帽企业版Linux所导致内部不自洽的隐患则是“无界”的。方法4看似不合理其实很合理,因为该方法的本质跟红帽企业版Linux一样是“旧瓶装新酒”,但这新酒是内部完全自洽的新酒,是“红帽思路”的最佳替代方案。
为什么方法3要强调万万不可从新版本内核中批量复制目录呢?因为这不是正规的内核开发方法,而是导致内部不自洽的罪魁祸首。如果在龙芯上采用红帽企业版Linux,则会导致更大范围的内部不自洽。不自洽的隐患很大,隐藏的问题也未必会马上体现出来;而一旦出现问题时,要指出“何处不自洽”并不容易(因为内核源代码规模庞大,问题通常隐藏得比较深)。除非是内核领域拥有极高造诣的开发人员,否则是难以快速定位的。这就好比:除非是领域内的顶尖高手,否则贸然使用转基因技术是很容易出问题的,出现问题后要一个普通人立即指出转基因技术导致了什么问题也是不现实的。
注意:
红帽是一家伟大的公司,红帽的内核也是基于官方内核开发和优化的,在X86平台上运行良好。本书没有任何批评红帽企业版Linux的意思,只是分析了为什么红帽的内核不适宜作为龙芯的基础内核。相反,红帽开发和维护Linux内核的方法和成功经验是非常值得龙芯学习的。