diff --git a/content/zh/blog/luoyuzhe/ 004History-of-Linux-kernel-3/004History-of-Linux-kernel-3 .md b/content/zh/blog/luoyuzhe/ 004History-of-Linux-kernel-3/004History-of-Linux-kernel-3 .md new file mode 100644 index 0000000000000000000000000000000000000000..9738ca7f513217bd7d1681fa99076bf6bc2fac44 --- /dev/null +++ b/content/zh/blog/luoyuzhe/ 004History-of-Linux-kernel-3/004History-of-Linux-kernel-3 .md @@ -0,0 +1,62 @@ ++++ +title="第二期Linux内核发展史-3" +date="2020-08-06" +tags=["Linux","内核","发展史"] +archives="2020-08" +author="罗宇哲" +summary="Linux内核发展史-3" ++++ + + _作者:罗宇哲,中国科学院软件研究所智能软件研究中心_ + +这一小节我们主要介绍Linux系统应用程序的主要来源——GNU。 + +### 一、GNU + +Linux包含系统内核和提供系统服务和工具的应用程序两个部分。Linux所使用的应用程序是由许多程序元编写并自由发布的。Linux支持自由软件的概念,即软件本身不应受限,它们应遵守GNU(GNU是GNU's Not UNIX的递归缩写)通用公共许可证(GPL)[1]。软件通常是以源代码的形式发布的,但也可能需要支付一定的费用。这里提到的GNU项目最初是由自由软件基金会(Free Software Foundation)发起的,这个基金会的创始人是Richard Stallman。GNU项目的宗旨是:试图创建一个与UNIX系统兼容,但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。[1]因此GNU为软件社区贡献了许多UNIX系统上应用程序的仿制品,这些应用程序都遵循GPL许可证。 + +下面是在GPL条款下发布的一些主要的GNU项目软件[1]: + +- GCC: GNU编译器集,它包括GNU C编译器。 +- G++: C++编译器,是GCC的一部分。 +- GDB:源代码级的调试器。 +- GNU make: UNIX make命令的免费版本。 +- Bison:与UNIX yacc兼容的语法分析程序生成器。 +- bash:命令解释器(shell)。 +- GNU Emacs:文本编辑器及环境。 + +许多其他的软件包也是在遵守自由软件的原则和GPL条款的情况下开发和发行的,包括电子表格、源代码控制工具、编译器和解释器、因特网工具、图形图像处理工具(如Gimp),以及两个完整的基于对象的环境(GNOME和KDE)。 + +### 二、常见开源协议简介 + +木兰协议:木兰协议是我国首个开源协议,这一开源协议共有五个主要方面,涉及授予版权许可、授予专利许可、无商标许可、分发限制和免责申明与责任限制。在版权许可方面,木兰协议允许“每个‘贡献者’根据’本许可证‘授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其‘贡献’,不论修改与否。”木兰协议比Apache License更友好一些,Apache License要求列出每个修改文件,其实很多项目做不到这一点,所以MulanPSL直接取消了这项要求[2]。 + +GPL协议:GPL协议采取两种措施来保护程序员的权利:(1)给软件以版权保护;(2)给程序员提供许可证。它给程序员复制,发布和修改这些软件的法律许可。在复制和发布方面,GPL协议规定“只要你在每一副本上明显和恰当地出版版权声明和不承担担保声明,保持此许可证的声明和没有担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你可以为转让副本的实际行动收取一定费用。你也有权选择提供担保以换取一定的费用。”[3]GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但**不允许**修改后和衍生的代码做为**闭源的商业软件发布和销售**。GPL协议的主要内容是只要在一个软件中使用(“使用”指**类库**引用,修改后的**代码**或者**衍生代码**)GPL协议的产品,则该软件产品必须也采用**GPL协议**,既必须也是**开源和免费**[4]。 + +LGPL协议:LGPL是一个为主要为**类库使用**设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议**不同**。LGPL允许**商业软件**通过类库**引用(link)方式**使用LGPL类库而**不需要**开源商业软件的代码。这使得采用**LGPL协议**的开源代码可以被**商业软件**作为类库引用并发布和销售。但是如果**修改LGPL协议的代码**或者**衍生**,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都**必须采用LGPL协议**[4]。 + +BSD协议:BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件: + +1.如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。 + +2.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。 + +3.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。 + +BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议[5]。 + +### 三、总结 + +本小节中我们简要介绍了有关Linux应用程序的一个重要来源——GNU。从下一小节开始我们将介绍Linux内核源码结构。 + +参考文献 + +[1] 《Linux程序设计(第四版)》 + +[2] https://iot.ofweek.com/2019-08/ART-132216-8120-30401877.html + +[3] https://baike.baidu.com/item/GPL/2357903?fromtitle=GPL%E5%8D%8F%E8%AE%AE&fromid=8274607&fr=aladdin + +[4] https://blog.csdn.net/xiaoxiao133/article/details/83049959 + +[5] https://www.runoob.com/note/13176 \ No newline at end of file diff --git a/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/002History-of-Linux-kernel-1.md b/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/002History-of-Linux-kernel-1.md new file mode 100644 index 0000000000000000000000000000000000000000..285edb22de0370078fe36d25233f21072ebd0a00 --- /dev/null +++ b/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/002History-of-Linux-kernel-1.md @@ -0,0 +1,147 @@ ++++ +title="第二期Linux内核发展史-1" +date="2020-08-06" +tags=["Linux","内核","发展史"] +archives="2020-08" +author="罗宇哲" +summary="Linux内核发展史-1" ++++ + + _作者:罗宇哲,中国科学院软件研究所智能软件研究中心_ + +openEuler是基于Linux 内核的企业级Linux服务器操作系统平台的开源社区发行版。openEuler支持鲲鹏架构,可运行在TaiShan服务器上。本技术连载将会从理论基础、源码分析和实操方法三个方面来比较全面地介绍内核编程与应用编程的基础知识,到2020年8月之前主要介绍内核编程部分。通过本连载的介绍,您将对openEuler内核编程和应用编程的理论和实践知识有一个基本的了解。本小节将从Linux内核发展史出发,带您走进openEuler的世界,一起学习操作系统的基础知识和openEuler内核的技术细节。 + +### 一、Linux内核发展简史 + +1991年,刚刚过完21岁生日的芬兰赫尔辛基大学计算机系单身狗Linus负债DIY了一台性能彪悍的计算机。他准备用这台计算机运行在操作系统课上学会的Minix操作系统并黑进学校性能更加强大的计算机系统来上网或者看新闻[1]。然而,Minix系统的价格让Linus望而却步,且当时Minix系统的协议只支持教学用途,于是这个小伙子决定开发一套自己的操作系统[2]。有三分之一的国土在北极圈内的芬兰冬季严寒而漫长,这给了Linus充分的时间构建自己的系统。在独自开发操作系统的漫长的日子里,只有学校每周三晚上的party给Linus的生活带来一点亮色,但他很快因为没有女伴而放弃了party并沉迷OS无法自拔。1991年9月17日,Linux内核(当时叫Freax)的0.01版被上传至FTP服务器,从此拉开了一个传奇的序幕…… + +从0.01版的内核开始,Linux内核经过不断迭代成熟,从最初的一万行左右的代码成长至今天千万行级的巨无霸。第一个版本只是一个内核。为了有一个工作系统,还需要一个shell、编译器、库等等。这些全部来自其他GNU软件。一年后的1992年,第一个Linux发行版诞生了。到今天为止,著名的发行版包括Debian、Ubuntu、RedHat Enterprise Linux和Fedora等。下表简要列出了迄今为止各版本内核的一些更新情况和发行日期[4]: + +| 内核版本号 | 时间 | 内核发展情况 | +| ------------ | ---------- | ------------------------------------------------------------ | +| 0.00 | 1991.2-4 | 两个进程分别显示AAABBB | +| 0.01 | 1991.9 | 第一个正式向外公布的Linux内核版本 | +| 0.02 | 1991.10.5 | LinusTorvalds将当时最初的0.02内核版本发布到了Minix新闻组,很快就得到了反应。LinusTorvalds在这种简单的任务切换机制上进行扩展,并在很多热心支持者的帮助下开发和推出了Linux的第一个稳定的工作版本。 | +| 0.03 | 1991.10.5 | | +| 0.10 | 1991.10 | Linux0.10版本内核发布,0.11版本随后在1991年12月推出,当时它被发布在Internet上,供人们免费使用。 | +| 0.11 | 1991.12.8 | 基本可以正常运行的内核版本 | +| 0.12 | 1992.1.15 | 主要加入对数学协处理器的软件模拟程序 | +| 0.95(0.13) | 1992.3.8 | 开始加入虚拟文件系统思想的内核版本 | +| 0.96 | 1992.5.12 | 开始加入网络支持和虚拟文件系统 | +| 0.97 | 1992.8.1 | | +| 0.98 | 1992.9.29 | | +| 0.99 | 1992.12.13 | | +| 1.0 | 1994.3.14 | Linux1.0版本内核发布,使用它的用户越来越多,而且Linux系统的核心开发队伍也建起来了。 | +| 1.2 | 1995.3.7 | | +| 2.0 | 1996.2.9 | | +| 2.2 | 1999.1.26 | | +| 2.4 | 2001.1.4 | Linux 2.4.0版本内核发布。 | +| 2.6 | 2003.12.17 | Linux 2.6版本内核发布,与2.4内核版本相比,它在很多方面进行了改进,如支持多处理器配置和64位计算,它还支持实现高效率线和处理的本机POSIX线程库(NPTL)。实际上,性能、安全性和驱动程序的改进是整个2.6.x内核的关键。 | +| 2.6.15 | 2006 | Linux 2.6.15版本内核发布。它对IPv6的支持在这个内核中有了很大的改进。 | +| 2.6.30 | 2009.6 | 改善了文件系统、加入了完整性检验补丁、TOMOYOLinux安全模块、可靠的数据报套接字(datagramsocket)协议支持、对象存储设备支持、FS-Cache文件系统缓存层、nilfs文件系统、线程中断处理支持等等。 | +| 2.6.32 | 2009.12 | 增添了虚拟化内存de-duplication、重写了writeback代码、 改进了Btrfs文件系统、添加了ATIR600/R7003D和KMS支持、CFQ低传输延迟时间模式、perftimechart工具、内存控制器支持softlimits、支持S+Core架构、支持IntelMoorestown及其新的固件接口、支持运行时电源管理、以及新的驱动。 | +| 2.6.34 | 2010.5 | 添加了Ceph和LogFS两个新的文件系统,其中前者为分布式的文件系统,后者是适用于Flash设备的文件系统。Linux Kernel 2.6.34的其他特性包括新的Vhostnet、改进了Btrfs文件系统、对Kprobesjump进行了优化、新的perf功能、RCUlockdep、GeneralizedTTLSecurityMechanism(RFC5082)及privateVLANproxyarp(RFC3069)支持、asynchronous挂起恢复等等。 | +| 2.6.36 | 2010.10 | Tilera处理器架构支持、新的文件通知接口fanotify、Intel显卡上实现KMS和KDB的整合、并行管理工作队列、Inteli3/5平台上内置显卡和CPU的智能电源管理、CIFS文件系统本地缓存、改善虚拟内存的层级结构,提升桌面操作响应速度、改善虚拟内存溢出终结器的算法、整合了AppArmor安全模型(注:与SELinux基于文件的标注不同,AppArmor是基于路径的)。 | +| 2.6.37 | 2011.1.4 | Linux2.6.37包含了对Ext4和XFS的几个SMP可伸缩性改进,一个在禁用大内核锁的情况下编译内核的选项,对每个cgroup IO限制的支持,一个基于Ceph集群文件系统的网络设备,几个Btrfs改进,更有效的静态探测,对探测模块的性能支持和可访问列表本地和全局变量、使用LZO压缩的图像休眠、IPv4支持的PPP、一些网络微优化和许多其他小的更改、改进和新的驱动程序。 | +| 2.6.38 | 2011.3.14 | 此版本增加了对自动进程分组(在新闻中称为“wonder patch”)的支持、VFS的显著可扩展性改进、Btrfs LZO压缩和只读快照、对B.a.T.M.a.N.mesh协议(有助于在发生自然灾害、军事冲突或互联网审查时提供网络连接,)、透明的大页面支持(不使用hugetblfs)、在多个cpu上自动传播即将到来的网络流量、支持AMD Fusion apu、许多驱动程序和其他更改。 | +| 2.6.39 | 2011.5.18 | EXT4 SMP的可伸缩性改进,初始TCP拥塞窗口的增加,一种称为Unicore-32的新架构,一种允许创建称为IPset的网络资源组的功能,Btrfs更新,一种允许将崩溃信息存储在固件中的功能,以便在重新引导后恢复它,通过handle syscalls打开,perf更新,以及许多其他的小变化和新的驱动。 | +| 3.0 | 2011.7.21 | 除了一个新的版本编号方案,Linux3.0还有几个新的特性:Btrfs数据清理和自动碎片整理,XenDOM0支持,ECHO中没有特权的ICMP,WakeonWLAN,Berkeley包过滤器JIT过滤,一个类似memcached的页面缓存系统,一个对sendmsg()调用和setns()进行批处理的sendmsg()系统调用,一个系统调用允许更好地处理轻量级虚拟化系统,如容器。增加了新的硬件支持:例如,Microsoft Kinect、AMD Llano Fusion APU、Intel iwlwifi 105和135、Intel C600串行连接scsi控制器、Ralink RT5370 USB、多个Realtek RTL81xx设备或Apple iSight网络摄像头。增加了许多其他驱动和小的改进。 | +| 3.1 | 2011.10.24 | 支持OpenRISC 开源 CPU,对写回限制的性能改进,slab分配器中的一些加速,新的iSCSI实现,支持用于移动支付的近场通信芯片,通用软件RAID层中的坏块管理,一个新的用于电源管理的“cpupowerutils”用户空间实用程序、默认情况下在ext3中启用的文件系统屏障、Wii遥控器支持和新的驱动程序以及许多小的改进。 | +| 3.2 | 2012.1.4 | 此版本包括对大于4KB和小于1MB的ext4块的支持,这将提高大文件的性能;btrfs已更新为更快的清理、关键文件系统元数据的自动备份和用于手动检查文件系统的工具;进程调度器添加了对设置CPU时间上限的支持;在大量写操作的情况下,桌面的响应能力得到了改进,TCP被更新为包括一个算法,该算法可以在丢失数据包后加快连接的恢复;分析工具“perf-top”增加了对任务和库的实时检查的支持,并可以看到带注释的程序集代码;设备映射器增加了对任务和库的支持对于存储的“精简配置”,我们增加了一个新的架构:高通公司的Hexagon DSP处理器。在这个版本中还提供了其他驱动程序以及一些小的改进和修复。 | +| 3.3 | 2012.3.18 | 这个版本最重要的特点是合并了Android项目的内核代码。但是,它还包括对新体系结构(TI C6X)的支持、大大改进的平衡和Btrfs中不同RAID配置文件之间的重排能力,以及一些网络改进:为虚拟化场景设计的虚拟交换机实现(Open vSwitch),一种比“绑定”驱动程序更快、更可扩展的替代方案,对网络设备的传输队列进行可配置的限制,以抵抗缓冲区膨胀,网络优先级控制组和每个cgroup的TCP缓冲区限制。也有许多小功能和新的驱动程序和修复程序也可用。 | +| 3.4 | 2012.5.20 | 此版本包括几个Btrfs更新:支持大于4KB的元数据块,大大提高了元数据性能,更好的错误处理和更好的恢复工具;还有一个新的X32 ABI,它允许在64位模式下运行带有32位指针的程序;对GPU驱动程序的几项更新:Nvidia GeForce 600“开普勒”的早期模式设置,AMD Radeon 7xxx和AMD Trinity APU系列的支持,以及Intel Medfield graphics的支持;还支持x86 CPU驱动程序自动robing,一个设备映射器目标,它存储块的加密散列以检查入侵,另一个目标是使用外部只读设备作为精简配置的LVM卷的源,一些性能改进,如GTK2报表GUI和新的“Yama”安全模块。也有许多小功能和新的驱动程序和修复程序也可用。 | +| 3.5 | 2012.7.21 | 此版本包括对Ext4中的元数据校验和的支持,使用诸如StaseTAP或PERP之类的工具进行性能分析的用户空间探针,沙盘机制允许过滤SysCurts,设计了一种新的网络队列管理算法,用于打击Buffer-BuLAT,支持检查点和恢复TCP连接,支持TCP早期重传(RFC 5827)、支持Android风格的机会挂起、btrfs I/O故障统计以及通过Firewire和USB的SCSI。许多小功能和新的驱动程序和修复程序也可用。 | +| 3.6 | 2012.9.30 | 这个Linux版本在Btrfs中包含了一些新特性:子卷配额、配额组和快照差异(也称为“发送/接收”)。它还包括支持同时挂起到磁盘和内存、TCP“快速打开”模式、“TCP小队列”功能以防止缓冲区膨胀;支持通过NFS/NBD进行安全交换、更好的Ext4配额支持、支持PCIe D3cold电源状态;以及VFIO,允许从客户机驱动程序安全访问裸机主机设备。许多小功能和新的驱动程序和修复程序也可用。 | +| 3.7 | 2012.12.10 | 此Linux版本包括对ARM 64位体系结构的支持,ARM支持使用同一内核引导到不同系统,签名的内核模块,Btrfs支持使用chattr和faster fsync()在每个文件的基础上禁用写时拷贝,这是一个模仿strace的新“perf trace”工具,支持服务器端的TCP快速打开功能、实验性的SMBv2协议支持、稳定的NFS4.1和并行的NFS支持、允许通过UDP传输第2层以太网数据包的新隧道协议,以及支持Intel“管理器模式访问保护”(SMAP)安全功能。许多小功能和新的驱动程序和修复程序也可用。 | +| 3.8 | 2013.2.18 | 这个Linux版本在Ext4中支持在inode中嵌入非常小的文件,这大大提高了这些文件的性能并节省了一些磁盘空间。还有一个新的Btrfs特性,允许快速替换磁盘,一个为ssd优化的新文件系统F2FS,支持文件系统挂载,UTS,IPC,PIDs,以及为没有特权的用户提供的网络堆栈名称空间,内存资源控制器中的内核内存,XFS中的日志校验和,改进的NUMA策略重新设计和取消了对386处理器的支持。许多小功能和新的驱动程序和修复程序也可用。 | +| 3.9 | 2013.4.28 | 这个Linux版本包括对实验性RAID5/6模式的支持,以及对Btrfs中快照共享的文件进行更好的碎片整理;对Android SDK使用的“金鱼”模拟器的支持,能够将固态硬盘存储作为缓存设备;两个新的架构端口:Synopsys ARC 700和Meta Imagination处理器;ARM中的KVM虚拟化支持体系结构,一个Intel驱动程序,它“注入”空闲状态以提高每瓦特的性能,支持Chrome OS笔记本电脑,一个新的挂起电源状态,并删除过时的配置实验配置选项。许多小功能和新的驱动程序和修复程序也可用。 | +| 3.10 | 2013.6.30 | 此版本增加了对bcache的支持,它允许使用SSD设备缓存来自其他块设备的数据;Btrfs格式的改进,使专用于存储数据块信息的树小30-35%;支持XFS元数据校验和自描述元数据、无时钟多任务、SysV IPC,rwlock和mutex可伸缩性改进,减少短事务尾部延迟的TCP尾部丢失探测算法,MIPS体系结构中的KVM虚拟化支持,混合不同类型cpu的ARM big.LITTLE体系结构,跟踪快照,新驱动程序和许多小改进。 | +| 3.11 | 2013.9.2 | 此版本增加了对一个新的O_TMPFILE open(2)标志的支持,该标志允许轻松创建安全的临时文件,自r600以来所有Radeon GPU的实验性动态电源管理,对NFS4.2和标记为NFS的SELinux的初步支持,对Lustre分布式文件系统的实验性支持,对程序写入的页的详细跟踪,ARM对ARM64的巨大页面支持和KVM/Xen支持,SYSV IPC消息队列可伸缩性改进,低延迟网络轮询机制,压缩交换缓存,新驱动程序和许多小改进。 | +| 3.12 | 2013.11.2 | 此版本增加了对Btrfs中离线重复数据消除的支持,双GPU笔记本电脑中的自动GPU切换,对AMD Radeon图形的性能提升,更好的RAID-5多核性能,改进了对内存不足情况的处理,改进了VFS路径名分辨率的可扩展性,改进了无时间多任务模式,在图形DRM层中独立的模式设置和渲染设备节点,改进了虚拟化客户机的锁定性能,XFS目录递归可伸缩性改进,IPC可伸缩性改进,tty层锁定改进,新驱动程序和许多小的改进。 | +| 3.13 | 2014.1.19 | 此版本包括nftables,iptables的后续产品,为高性能固态硬盘设计的块层的改进,英特尔RAPL设备功耗上限框架,改进的squashfs性能,默认启用的AMD Radeon电源管理和自动Radeon GPU交换,改进的NUMA性能,改进的性能与庞大的网页工作负载,TCP快速开放默认启用,支持NFC支付,支持高可用性无缝冗余协议,新的驱动程序和许多其他小的改进。 | +| 3.14 | 2014.5.30 | 此版本包括实时任务的截止时间任务调度策略、内存压缩机制现在被认为是稳定的、锁定验证器到用户空间的端口、存储属性(如Btrfs中每个inode的压缩)的能力、对跟踪事件的触发器支持、对用户空间探测的改进,内核地址空间随机化,TCP自动合并某些类型的连接,一个新的网络包调度程序来对抗缓冲区膨胀,新的驱动程序和许多其他小的改进。 | +| 3.15 | 2014.6.8 | 这个版本在有硬盘的系统中恢复得更快,它增加了对原子交叉重命名两个文件的支持,它增加了新的fallocate(2)模式,允许删除一个文件的范围或将其设置为零,它增加了一个新的文件锁定API,内存管理更好地适应工作集大小的变化,它提高了FUSE写性能,它还增加了支持zram中的LZ4算法,允许从32位EFI固件加载64位内核,增加了对即将加入英特尔CPU的AVX-512矢量指令的支持,增加了新的驱动程序和许多其他小改进。 | +| 3.16 | 2014.8.3 | 此版本通过支持动态切换Nvidia卡上的时钟频率来提高性能,它还支持将用户空间内存映射到Intel设备上的GPU,XFS有一个免费的inode btree用于更快的inode分配,ARM64内核可以用作EFI存根,IPv6支持TCP Fast Open,一些radeon设备有更好的性能得益于改进的电源管理支持,支持Intel Cherryview图形,控制组获得了可选的统一层次结构模式,还添加了新的驱动程序和许多其他小的改进。 | +| 3.17 | 2014.10.5 | 此版本增加了对IP上USB设备共享的支持,对Xbox One控制器的支持,对Apple的thunderbolt的支持,一个新的sealing API,它限制了对共享内存文件描述符的操作,使开发人员可以更容易地进行共享内存编程,支持perf trace中的页面故障跟踪,在kexec中只支持使用有符号的内核、getrandom()系统调用以生成更安全的随机数以及图形“渲染节点”不再是实验性的。也有新的驱动和许多其他小的改进。 | +| 3.18 | 2014.12.7 | 此版本增加了对overlayfs的支持,它允许在单个装载点组合两个文件系统;支持将用户空间内存映射到Radeon设备上的GPU,一个bpf()系统调用,它允许上载可附加到事件的类似bpf的程序;一个为数据中心优化的TCP拥塞算法;Geneve虚拟化封装,支持在UDP上嵌入IP协议,通过批处理套接字缓冲区提高网络性能,以及可选的多队列SCSI支持。也有新的驱动和许多其他小的改进。 | +| 3.19 | 2015.2.8 | 此版本增加了对Btrfs清理和用RAID 5和6快速替换设备的支持,对帮助阻止缓冲区溢出的Intel内存保护扩展的支持,对AMD HSA体系结构的支持,对调试ARM Coresight子系统的支持,对Altera Nios II CPU体系结构的支持,用于路由和交换卸载的网络基础设施、有助于支持Beaglebone或Raspberry Pi等消费者开发板上的扩展总线的设备树覆盖、NFSv4.2中对穿孔和预分配的支持,以及Android活页夹已从暂存区移到稳定区。也有新的驱动和许多其他小的改进。 | +| 4.0 | 2015.4.12 | 此版本增加了对内核代码进行实况补丁的支持,主要目的是在不重启的情况下修复安全更新;DAX,当文件系统在具有持久内存存储的系统上运行时,避免使用内核缓存的方法;KASAN,一种动态内存错误检测器,允许在空闲和越界bug之后找到使用;lazytime,relatime的一种替代方法,它只会在缓存中进行访问、修改和更改时间更新,并有机会写入磁盘;允许overlayfs具有多个较低层,支持并行NFS服务器体系结构;以及dm-crypt CPU可伸缩性的改进。也有新的驱动和许多其他小的改进。 | +| 4.1 | 2015.6.21 | 此版本增加了对Ext4加密的支持,对管理群集raid阵列的实验性支持,一个记录所有对设备的写入并允许重放它们的新设备映射器目标,一个在块设备中打开持久性内存系统中的内存的驱动程序,对禁用多用户支持的支持,支持基于路径标签而不是长网络地址路由数据包的多协议标签交换,允许将BPF程序附加到kprobes以进行更好的探测,ACPI支持ARM64体系结构,以及允许改进软件rasterizer的虚拟GEM驱动程序。也有新的驱动和许多其他小的改进。 | +| 4.2 | 2015.8.30 | 此版本为现代AMD Radeon硬件添加了一个新的amdgpu驱动程序,一个使用客户机内部主机GPU功能的virtio GPU驱动程序,新的原子模式设置图形API已声明稳定,支持堆叠安全模块,更快和更可扩展的自旋锁实现,cgroup写回支持,以及重新引入H8/300架构。也有新的驱动程序和许多其他小的改进。 | +| 4.3 | 2015.11.1 | 此版本删除ext3文件系统,并保留Ext4作为主Ext文件系统,Ext4还可以挂载ext3文件系统;它还添加了userfaultfd(),一个用于处理用户空间中的页面错误的系统调用;membarrier(),一个用于在一组线程上发出内存屏障的系统调用;一个用于限制cgroup中的PID数量的PID控制器,更易于使用的“环境”功能;空闲页跟踪,更精确地跟踪应用程序使用的内存;支持IPv6标识符定位器寻址;网络轻量级通道、虚拟路由和转发精简版支持,以及许多其他改进和新驱动程序。 | +| 4.4 | 2016.1.10 | 此版本增加了对虚拟GPU驱动程序中3D支持的支持,该驱动程序允许虚拟化客户机中的3D硬件加速图形;对直接I/O和异步I/O的循环设备支持,该支持节省内存并提高性能;对开放通道ssd的支持,该设备共享Flash转换层的职责在操作系统中,TCP侦听器处理是完全无锁的,允许更快和更可扩展的TCP服务器;MD层中的日志RAID5修复了RAID写入漏洞;eBPF程序现在可以由没有特权的用户运行,它们可以被持久化,perf还增加了对eBPF程序的支持;一个新的mlock2()系统调用,允许用户请求在页面错误时锁定内存;并阻止轮询支持,以提高高端存储设备的性能。也有新的驱动和许多其他小的改进。 | +| 4.5 | 2016.3.13 | 此版本添加了一个新的copy*file*range(2)系统调用,允许在不通过用户空间传输数据的情况下复制文件;现代Radeon GPU的实验性Powerplay电源管理;Btrfs可用空间处理的可扩展性改进;支持GCC的未定义行为Sanitizer(-fsanitize=Undefined);设备映射器的verity目标中的转发错误更正支持;在madvise()中支持MADVFREE标志;新的cgroup统一层次结构被认为是稳定的;*SO*REUSEPORT UDP套接字的可伸缩性改进;epoll的可伸缩性改进,以及内存控制器中套接字的更好的内存计算。也有新的驱动和许多其他小的改进。 | +| 4.6 | 2016.5.15 | 此版本增加了对USB 3.1 SuperSpeedPlus(10 Gbps)的支持、新的分布式文件系统OrangeFS、更可靠的内存不足处理、对Intel内存保护密钥的支持、使应用层协议实现更简单和更快的功能、对802.1AE MAC级加密(MACsec)的支持、对V版的支持BATMAN协议的一个OCFS2在线inode检查器,支持cgroup名称空间,支持pNFS SCSI布局,以及许多其他改进和新的驱动程序。 | +| 4.7 | 2016.7.24 | 此版本增加了对最近RADON RX 480 GPU的支持,支持同一目录中的并行路径名查找,一个新的实验“SeeDuuls'频率调速器,它应该比现有的管理者更快和更精确,支持EFI 'Capsule'升级固件的机制,支持USB/IP中的虚拟USB设备,使模拟的手机像真正的USB设备一样工作;新的安全模块“LoadPin”,确保所有内核模块都从同一个文件系统加载;在ftrace接口中创建事件直方图的接口;支持将BPF程序附加到内核跟踪点;支持调用链perf trace实用程序中的事件,对Android的sync_文件围栏机制的稳定支持,以及许多其他改进和新的驱动程序。 | +| 4.8 | 2016.10.2 | 此版本增加了对在页面缓存中使用透明的大页面的支持,对eXpress Data Path的支持,这是一个高性能、可编程的网络数据路径;对XFS反向映射的支持,它是几个即将推出的功能的构建块;使用强化的usercopy对内存副本进行更严格的检查;支持IPv6安全标签(CALIPSO,RFC 5570);GCC插件支持;virtio vsocks,以方便客户/主机通信;新的Vegas TCP拥塞控制算法;文档已移动到reStructuredText格式,以及许多其他改进和新驱动程序。 | +| 4.9 | 2016.12.11 | 这个版本增加了对共享扩展数据块(cp——reflink支持)和XFS上的写时拷贝支持;虚拟映射的内核栈使内核更加可靠和安全;一个更高效的BPF分析器,使Linux部分地支持Dtrace;基于带宽测量而非数据包丢失的新的可选BBR-TCP拥塞控制算法;使用保护密钥硬件功能的系统调用;对Ara项目中的Greybus总线的支持;用于检测固件引起的延迟的硬件延迟跟踪程序,以及许多其他改进和新的驱动程序。 | +| 4.10 | 2017.2.19 | 此版本增加了对虚拟化GPU的支持,一个用于NUMA系统中缓存行冲突分析的新“perf c2c”工具,一个用于任务调度详细历史记录的新“perf sched timehist”命令,改进的写回管理应该使系统在重写负载下更具响应性,一个新的混合块轮询方法使用更少CPU比纯轮询,支持ARM设备,如Nexus5&6或Allwinner A64,允许将eBPF程序附加到cGroup的功能,一个实验性的MD RAID5写回缓存,支持Intel缓存分配技术,以及许多其他改进和新驱动程序。 | +| 4.11 | 2017.4.30 | 此版本增加了对多队列块层中可插入IO调度程序框架的支持,在关闭write hole的MD RAID5实现中的日志支持,对在SSD中放置的交换进行更可扩展的交换实现,一个新的STATx()系统调用,解决了stat()的缺陷,作为ftrace接口前端的新perf ftrace工具,对实现OPAL存储规范的驱动器的支持,对RFC7609中定义的共享内存通信RDMA协议的支持,所有VGA控制台的持久滚动缓冲区,以及许多新的驱动程序和其他改进。 | +| 4.12 | 2017.7.2 | 此版本包括一个新的BFQ I/O调度程序,它提供了更好的交互体验;它还包括对Radeon RX Vega图形卡的初步支持和对USB Type-C连接器的支持;对实时内核修补功能的改进,对允许关闭RAID5 write hole的Intel IMSM部分奇偶校验日志的支持;支持将OpenChannel ssd公开为设备块,并支持另一个I/O调度程序Kybe,它允许为读写配置延迟目标 | +| 4.13 | 2017.9.3 | 这个版本增加了Ext4对大量目录项的支持,Ext4对64k以下扩展属性的支持,异步I/O的改进,后台写入的错误处理的改进,块层的错误处理的改进,内核TLS加速,以及许多其他改进。 | +| 4.14 | 2017.11.12 | 此版本包括支持x86硬件中更大的内存限制(128PiB虚拟地址空间,4PiB物理地址空间);支持AMD安全内存加密;提供更好内核跟踪和更小内核大小的新放卷机;一种cgroup“线程模式”,允许在一组进程的线程之间分配资源;对zstd压缩算法的支持已添加到Btrfs和Squashfs中;支持从用户内存到套接字的数据零拷贝;更好的异步缓冲I/O支持;支持未来GPU所需的异构内存管理;在某些情况下更好的cpufreq行为;使用PCID CPU特性的更长生命周期的TLB条目;异步非阻塞缓冲读取;以及许多新的驱动程序和其他改进。 | +| 4.15 | 2018.1.28 | 除了处理Meltdown/Spectre的最新代码外,此版本还包括amdgpu驱动程序的模式设置和高级显示功能;改进了对具有SATA积极链路电源管理的系统的电源管理支持;开放RISC-V cpu的端口;对AMD cpu中虚拟内存加密的初始支持;对Intel的支持用户模式指令预防功能;cgroups v2中对CPU控制器的支持;允许直接写入由文件系统管理的持久内存的新mmap(2)标志;以及许多新的驱动程序和其他改进。 | +| 4.16 | 2018.4.1 | 除了处理CPU安全漏洞的最新代码外,此版本还宣布反向映射和reflink功能稳定,membarrier(2)添加了快速支持,SMB3 Direct(RDMA)支持,添加了x86 jailhouse hypervisor,它能够静态地将多核系统划分为多个所谓的单元,支持PowerPC内存保护密钥、AMD安全加密虚拟化的管理程序部分,以及许多新的驱动程序和其他改进。 | +| 4.17 | 2018.6.3 | 此版本增加了对AMD Radeon Vega 12的支持,并在支持的AMD Radeon GPU中默认启用“显示代码”;还添加了内核TLS接收路径;更有效的空闲循环,防止CPU在shallow idle states下花费太多时间;删除了八个未维护的体系结构,另一个,添加了Andes NDS32体系结构;XFS获得了lazytime支持;修改了CPU负载估计;支持Intel Cannonlake gpu并添加了内核内存一致性模型;以及许多新的驱动程序和其他改进。 | +| 4.18 | 2018.8.12 | 此版本包括新的“可重新启动序列”系统调用,它使编写可扩展的用户空间代码变得更容易;对未授权的装载的支持;旨在使用BPF提供netfilter功能的bpfilter项目的开始;零拷贝TCP接收API;对高性能网络的新AF-XDP地址系列的支持;对高通Snapdragon 845 SoC的支持;以及许多新驱动程序和其他改进的支持。 | +| 4.19 | 2018.10.22 | 此版本还增加了:CAKE network queue management用于对抗bufferbloat,其设计初衷是为了从最慢的ISP链路和路由器中挤出最大的带宽和延迟;支持保证cGroup的最小I/O延迟目标;对未来Wi-Fi 6(802.11ax-drafts)的实验性支持;overlayfs用户的内存使用得到了改进;一个实验性的、为只读使用而优化的EROFS文件系统;一个新的异步I/O轮询接口;支持避免对攻击者控制的FIFO或世界上可写的粘性目录中的常规文件的无意写入;支持一个Intel特性,它将部分CPU缓存锁定为一个应用程序;以及许多新的驱动程序和其他改进。 | +| 4.20 | 2018.12.23 | 此版本包括对测量系统负载的新方法的支持;它增加了对未来AMD Radeon Picasso和Raven2的支持,并启用了对Radeon Vega20的非实验性支持;它增加了对C-SKY CPU体系结构和x86 Hygon Dhyana CPU的支持;TLB微优化在某些工作负载中带来了小的性能优势;TCP已经切换到“提前离开时间”模式;一种将memfd区域转换为dma buf的机制允许qemu改进虚拟化图形性能;它还包括针对CPU安全漏洞的最新一轮修复;它还添加了许多新的驱动程序和其他改进。 | +| 5.0 | 2019.3.3 | 此版本包括对energy-aware调度的支持,该调度将任务唤醒到phone中更节能的CPU;它还包括对低功耗设备的adiantum文件系统加密;它增加了对amdgpu驱动程序中AMD Freesync(可变刷新率)的支持;它增加了对UDP中接收卸载和MSG_ZEROCOPY支持的支持;它增加了对ARM指针认证的支持;它增加了对cgroupv2中的cpuset资源控制器(它可以约束任务的CPU和内存节点位置)的支持;它增加了对binderfs的命名空间支持,它允许运行多个android实例;它增加了对btrfs中交换文件的支持;它还增加了许多新的驱动因素和其他改进。 | +| 5.1 | 2019.5.5 | 此版本包括用于异步I/O的高性能接口io_uring;它还增加了fanotify的改进,以提供在大型文件系统上监视更改的可伸缩方式;它增加了一种方法,允许在PID重用的情况下安全地传递信号;持久内存现在可以用作热插拔RAM;Zstd压缩级别可以在Btrfs中配置;它还添加了一个新的cpuidle调控器,比菜单调控器做出更好的电源管理决策;所有32位体系结构都添加了处理y2038问题所需的系统调用;现在可以在没有initramfs的情况下引导到设备映射器设备;而实时补丁增加了对创建累积补丁的支持。一如既往,还有许多其他新的驱动因素和改进。 | +| 5.2 | 2019.7.7 | 此版本包括Sound Open Firmware,这是一个将开源固件引入到DSP音频设备的项目;还包括许多英特尔产品的开放固件。此版本还改进了Pressure Stall Information资源监控,使其可供Android使用;通过新的系统调用重新设计了mount API;BFQ I/O调度程序获得了一些性能改进;新的CLONE*PI*DFD标志允许CLONE(2)返回*PIDFD*send_signal(2)可用的pidfs;Ext4已经获得了对不区分大小写的名称查找的支持;还有一个新的设备映射器目标,它模拟有失败扇区和/或读取失败的设备;已经添加了ARM Mali t4xx和更新的6xx/7xx的开源驱动程序。一如既往,有最新的CPU错误(MDS)和许多其他新的驱动程序和改进。 | +| 5.3 | 2019.9.15 | 此版本包括对AMD Navi gpu的支持;对umwait x86指令的支持,该指令允许进程在短时间内等待而无需spinning loops;一种“利用率限制”机制,用于增强手机中使用的功率不对称cpu的交互性;一个新的PIDFDXOPEN(2)系统调用,完成了让用户处理PID重用问题的工作;在0.0.0.0/8范围内提供了16百万个新的IPv4地址;支持Zaxin x86 CPU;支持英特尔速度选择,以便在Xeon服务器中更容易地进行电源选择;以及支持轻量级管理程序ACRN,这是为嵌入式物联网设备构建的。一如既往,还有许多其他新的驱动和改进。 | +| 5.4 | 2019.11.24 | 此版本包括kernel lockdown mode,旨在加强UID 0和内核之间的边界;virtio fs,一个高性能virtio驱动程序,它允许一个虚拟化的客户机去装载已导出到主机上的目录;fs-verity,用于检测文件篡改,如dm-verity,但是可以在文件上工作,而不是在块设备上工作;dm-clone允许对dm目标进行实时克隆;两个新的madvise()标志用于改进Android上的应用程序内存管理,支持新的Intel/AMD gpu,支持exfat文件系统,并删除EROFS文件系统的实验状态;一个新的haltpoll cpuidle驱动程序和调控器,大大提高了虚拟化客户机在空闲循环中进行客户机端轮询的性能;blk-iocost,一个I/O cgroup控制器,试图更准确地计算I/O的成本。一如既往,还有许多其他新的驱动和改进。 | + +由此可见Linux内核不断支持新的功能,不断变得更加的复杂。 + +### 二、openEuler 特性 + +华为服务器操作系统内部代号为 EulerOS,有近10年的技术积累,已广泛用于华为内部产品配套。同时,华为基于对鲲鹏处理器的深刻理解,在性能、可靠性、安全性等方面对 EulerOS 进行了深度优化。为促进多样性计算产业发展及生态建设,华为将把服务器领域的技术积累进行开源。2019年1月7日华为正式推出了鲲鹏920处理器,并开始着力构建鲲鹏生态。华为开发了基于鲲鹏处理器的TaiShan服务器,并开源了其内部代号为EulerOS的服务器操作系统[8],社区开源版被命名为“openEuler”。openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等应用场景。 + +在之后的连载过程中,我们会逐步分析openEuler对ARM架构的支持、进程机制、内存管理机制、文件系统、网络通信、虚拟化与容器技术、系统安全技术、设备驱动程序以及初始化过程,整个连载预计192期,通过本连载的持续学习,您将对openEuler的内核有一个较为细致的了解。为了为读者提供一些实践的机会,本连载在每章之后会有一些对本章知识应用方法的介绍,帮助大家能把知识运用于实际。 + +### 三、巨人的肩膀 + +其实,除了之前提到的Minix系统外,Linux系统本身也是站在巨人的肩膀上,在它发布之前操作系统就已经经过了长期的发展,下表展现了Linux更深的渊源[7]: + +| 时间 | 事件 | +| ---------------- | ------------------------------------------------------------ | +| **20世纪60年代** | MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机;主机负责运算,而终端负责输入输出。 | +| **1965年** | Bell实验室、MIT、GE(通用电气公司)准备开发Multics系统,为了同时支持300个终端访问主机,但是1969年失败了。刚开始并没有鼠标、键盘,输入设备只有卡片机,因此如果要测试某个程序,则需要将读卡纸插入卡片机,如果有错误,还需要重新来过。(Multics:Multiplexed Information and Computing Service) | +| **1969年** | Ken Thompson(C语言之父)利用汇编语言开发了FIle Server System(Unics,即Unix的原型。因为汇编语言对于硬件的依赖性,因此只能针对特定硬件。这么做只是为了移植一款“太空旅游”的游戏。 | +| **1973年** | Dennis Ritchie和Ken Thompson发明了C语言,而后写出了Unix的内核 。其中90%的代码是C语言写的,10%的代码用汇编写的,因此移植时只要修改那10%的代码即可。 | +| **1977年** | Berkeley大学的Bill Joy针对他的机器修改Unix源码,称为BSD(Berkeley Software Distribution),Bill Joy是Sun公司的创始人。 | +| **1979年** | Unix发布System V,用于个人计算机。 | +| **1984年** | 因为Unix规定:“不能对学生提供源码”,Tanenbaum老师自己编写兼容于Unix的Minix,用于教学。 | +| **1984年** | Stallman开始GNU(GNU’s Not Unix)项目,创办FSF(Free Software Foundation)基金会。自由软件指用户可以对软件做任何修改,甚至再发行,但是始终要挂着GPL的版权。产品:GCC、Emacs、Bash Shell、GLIBC。 | +| **1985年** | 为了避免GNU开发的自由软件被其他人用作专利软件,因此创建GPL(General Public License)版权声明。 | +| **1988年** | MIT为了开发GUI,成立了XFree86的组织。 | +| **1991年** | 芬兰赫尔辛基大学的研究生Linus Torvalds基于gcc、bash开发了针对386机器的Lniux内核。 | +| **1994年** | Torvalds发布Linux-v1.0。 | +| **1996年** | Torvalds发布Linux-v2.0,确定了Linux的吉祥物:企鹅。 | + +在上面这张表中,有两个重要的项目对Linux的诞生产生了重要的影响,它们是Unix系统和GNU项目。在下面两篇连载中,我们将简要介绍Unix系统和GNU项目。下图展示了与Linux有关的操作系统发展史: + + + +### 四、结语 + +本小节中我们简要回顾了Linux内核的发展历史。Linux的成功不但让Linus还清了其DIY个人计算机的欠款,而且还让他收获了爱情——一位叫朵芙(Tove)的姑娘向他发来邮件,邀请他去约会。不知道Linus赴约的时候是否知道,邀请他的这个女生曾六次获得芬兰空手道冠军。“朵芙是第一个通过互联网方式接近我的女人,而我干脆就把她娶回了家。”多年以后,Linus回忆这一段经历,十分得意[1]。最后献上一句Linus的话与大家共勉[2]:“做自己喜欢的、并对其他人也有帮助的事情很重要。” + +参考文献 + +[1]http://tech.sina.com.cn/csj/2019-07-26/doc-ihytcitm4728357.shtml?cre=tianyi&mod=pchp&loc=4&r=0&rfunc=43&tj=none&tr=12 + +[2]https://www.sohu.com/a/251078953_355140 + +[3]https://baijiahao.baidu.com/s?id=1611958048582090280&wfr=spider&for=pc + +[4]https://blog.csdn.net/xiebingsuccess/article/details/91861871 + +[5]https://www.oschina.net/news/101070/linux-kernel-4-19-released + +[6]https://kernelnewbies.org/Linux_4.19 + +[7]https://www.cnblogs.com/alantu2018/p/8991158.html + +[8]http://baijiahao.baidu.com/s?id=1645207733241546990&wfr=spider&for=pc \ No newline at end of file diff --git a/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/Linux-OS-history.jpg b/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/Linux-OS-history.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1150f32f8963f7eb4a61a504f06442e4dc311832 Binary files /dev/null and b/content/zh/blog/luoyuzhe/002History-of-Linux-kernel-1/Linux-OS-history.jpg differ diff --git a/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/003History-of-Linux-kernel-2.md b/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/003History-of-Linux-kernel-2.md new file mode 100644 index 0000000000000000000000000000000000000000..216e7f20dc6152d30200beee3fe39f49c29ff602 --- /dev/null +++ b/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/003History-of-Linux-kernel-2.md @@ -0,0 +1,61 @@ ++++ +title="第三期Linux内核发展史-2" +date="2020-08-06" +tags=["Linur","内核","发展史"] +archives="2020-08" +author="罗宇哲" +summary="Linux内核发展史-2" ++++ + + _作者:罗宇哲,中国科学院软件研究所智能软件研究中心_ + +Linux是由赫尔辛基大学的Linus Torvalds开发的,在系统开发期间得到了因特网上广大UNIX程序员的帮助。它最初只是受Andy Tanenbaum教授的Minix(—个小型的类UNIX系统)启发而开发的一个程序,纯属个人爱好,但后来它逐步发展成为一个完整的系统。Linux的成功来源于其之前操作系统和应用软件的已有工作,主要是UNIX和GNU。本小结我们将介绍一下UNIX的发展简史。 + +### 一、UNIX操作系统发展历史 + +UNIX操作系统最初是由贝尔实验室开发的,当时的贝尔实验室是电信业巨头AT&T(美国电报电话公司)旗下的一员。UNIX是在20世纪70年代为DEC(数字设备公司)的PDP系列计算机设计的,它现在已成为一种非常流行的多用户、多任务操作系统。UNIX操作系统可以运行在大量不同种类的硬件平台上,其适用范围从PC工作站一直到多处理器服务器和超级计算机。 + +UNIX系统的主要特点有[1]: + +1.简单性:许多很有用的UNIX工具是非常简单的,因此也是很小并易于理解的。 + +2.集中性:在UNIX中,当用户出现新的需求时,我们通常是把小工具组合起来以完成更复杂的任务,而不是试图将一个用户期望的所有功能放在一个大程序里。 + +3.可重用组件:将应用程序的核心实现为库。具有简单而灵活的编程接口、文档齐备的库可以常助其他人开发出同类程序,或者把这些技术应用到新的应用领域。 + +4.过滤器:许多UNIX应用程序可用作过滤器。也就是说,它们对输入进行转换并产生输出。 + +5.开放的文件格式:比较成功并流行的UNIX程序都使用纯ASCII码的文本文件或XML文件作为配置文件和数据文件。 + +6.灵活性:你不能期待用户都能非常正确地使用你的程序。所以,你在編程时应尽景考虑到灵活性,尽量避免随意限制字段长度或记录数目。 + +最初的Unix是用汇编语言编写的,一些应用是由叫做B语言的解释型语言和汇编语言混合编写的。B语言在进行系统编程时不够强大,所以汤普逊和里奇对其进行了改造,并与1971年共同发明了C语言。1973年汤普逊和里奇用C语言重写了Unix。在当时,为了实现最高效率,系统程序都是由汇编语言编写,所以汤普逊和里奇此举是极具大胆创新和革命意义的。用C语言编写的UNIX代码简洁紧凑、易移植、易读、易修改,为此后UNIX的发展奠定了坚实基础。 + +1974年,汤普逊和里奇合作在ACM通信上发表了一篇关于UNIX的文章,这是UNIX第一次出现在贝尔实验室以外。此后UNIX被政府机关,研究机构,企业和大学注意到,并逐渐流行开来。 + +1975年,UNIX发布了4、5、6三个版本。1978年,已经有大约600台计算机在运行UNIX。1979年,版本7发布,这是最后一个广泛发布的研究型UNIX版本。20世纪80年代相继发布的8、9、10版本只授权给了少数大学。此后这个方向上的研究导致了九号计划的出现,这是一个新的分布式操作系统。 + +1982年,AT&T基于版本7开发了UNIX System Ⅲ的第一个版本,这是一个商业版本仅供出售。为了解决混乱的UNIX版本情况,AT&T综合了其他大学和公司开发的各种UNIX,开发了UNIX System V Release 1。 + +这个新的UNIX商业发布版本不再包含源代码,所以加州大学柏克莱分校继续开发BSD UNIX,作为UNIX System III和V的替代选择。BSD对UNIX最重要的贡献之一是TCP/IP。BSD有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及4.4-lite。这些发布版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前辈,包括AT&T System V UNIX和Microsoft Windows。其他一些公司也开始为其自己的小型机或工作站提供商业版本的UNIX系统,有些选择System V作为基础版本,有些则选择了BSD。BSD的一名主要开发者,比尔·乔伊,在BSD基础上开发了SunOS,并最终创办了太阳计算机系统公司。 + +1991年,一群BSD开发者(Donn Seeley、Mike Karels、Bill Jolitz和Trent Hein)离开了加州大学,创办了Berkeley Software Design, Inc (BSDI)。BSDI是第一家在便宜常见的Intel平台上提供全功能商业BSD UNIX的厂商。后来Bill Jolitz离开了BSDI,开始了386BSD的工作。386BSD被认为是FreeBSD、OpenBSD和NetBSD、DragonFlyBSD的先辈。AT&T继续为UNIX System V增加了文件锁定,系统管理,作业控制,流和远程文件系统。1987到1989年,AT&T决定将Xenix(微软开发的一个x86-pc上的UNIX版本),BSD,SunOS和System V融合为System V Release 4(**SVR4**)。这个新发布版将多种特性融为一体,结束了混乱的竞争局面。 + +1993年以后,大多数商业UNIX发行商都基于SVR4开发自己的UNIX变体了。 + +UNIX System V Release 4发布后不久,AT&T就将其所有UNIX权利出售给了Novell。Novell期望以此来对抗微软的Windows NT,但其核心市场受到了严重伤害,最终Novell将SVR4的权利出售给了X/OPEN Consortium,后者是定义UNIX标准的产业团体。最后X/OPEN和OSF/1合并,创建了Open Group。Open Group定义的多个标准定义着什么是以及什么不是UNIX。实际的UNIX代码则辗转到了Santa Cruz Operation,这家公司后来出售给了Caldera Systems。Caldera原来也出售Linux系统,交易完成后,新公司又被重命名为SCO Group。 + +下图以树状图的形式展示了从UNIX系统衍生出的各种操作系统[2]: + + + + +### 二、总结 + +本小节中我们简要介绍了有关Linux内核的一个重要基础——UNIX操作系统。下一小节我们将介绍Linux应用程序的一个重要来源——GNU。 + +参考文献 + +[1]《Linux程序设计(第四版)》 + +[2] https://www.cnblogs.com/alantu2018/p/8991158.html \ No newline at end of file diff --git a/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/Derivate-OS-of-NUIX.gif b/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/Derivate-OS-of-NUIX.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ea5b2b4e56fab916aefa3998871f4fc66f7cfaf Binary files /dev/null and b/content/zh/blog/luoyuzhe/003History-of-Linux-kernel-2/Derivate-OS-of-NUIX.gif differ diff --git a/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/005Linux-kernel-source-structure-1 .md b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/005Linux-kernel-source-structure-1 .md new file mode 100644 index 0000000000000000000000000000000000000000..2e3d93d0762305389687b7b51448313a6d1d4170 --- /dev/null +++ b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/005Linux-kernel-source-structure-1 .md @@ -0,0 +1,68 @@ ++++ +title="第五期Linux内核源码结构-1" +date="2020-08-06" +tags=["Linux","内核","源码"] +archives="2020-08" +author="罗宇哲" +summary="Linux内核源码结构-1" ++++ + + _作者:罗宇哲,中国科学院软件研究所智能软件研究中心_ + +在上一期中,我们介绍了Linux内核发展的历史,也介绍了与其相关的UNIX和GNU的相关知识。从这一期开始,我们将介绍Linux内核的源码结构。我们将先根据Linux源码的目录结构进行分析,到本文章发布前,Linux 4.19的最新版本为Linux 4.19.94,我们将依据openEuler开源社区源码并参考Linux 4.19.94版内核源码进行分析。 + +### 一、Linux内核源码的目录结构分析 + +下图列出了截至文章发表前openEuler开源社区kernel目录下的目录结构[5]: + + + + + + + +其中各个文件夹中**源代码的功能**如下表所示[1][3]: + +| **目录/文件名** | **源码功能简介** | +| ---------------- | ------------------------------------------------------------ | +| `/Documentation` | 说明文档,对每个目录的具体作用进行说明。 | +| `/arch` | 不同CPU架构下的核心代码。其中的每一个子目录都代表Linux支持的CPU架构。 | +| `/block` | 块设备通用函数。 | +| `/certs` | 与证书相关。 | +| `/crypto` | 常见的加密算法的C语言实现代码,譬如crc32、md5、sha1等。 | +| `/drivers` | 内核中所有设备的驱动程序,其中的每一个子目录对应一种设备驱动。 | +| `/include` | 内核编译通用的头文件。 | +| `/init` | 内核初始化的核心代码。 | +| `/ipc` | 内核中进程间的通信代码。 | +| `/kernel` | 内核的核心代码,此目录下实现了大多数Linux系统的内核函数。与处理器架构相关的内核代码在`/kernel/$ARCH/kernel`。 | +| `/lib` | 内核共用的函数库,与处理器架构相关的库在`/kernel/$ARCH/lib`。 | +| `/mm` | 内存管理代码,譬如页式存储管理内存的分配和释放等。与具体处理器架构相关的内存管理代码位于`/arch/$ARCH/mm`目录下。 | +| `/net` | 网络通信相关代码。 | +| `/samples` | 示例代码。 | +| `/scripts` | 用于内核配置的脚本文件,用于实现内核配置的图形界面。 | +| `/security` | 安全性相关的代码。 | +| `/sound` | 与音频有关的代码,包括与音频有关的驱动程序[2]。 | +| `/tools` | Linux中的常用工具。 | +| `/usr` | 该目录中的代码为内核尚未完全启动时执行用户空间代码提供了支持。 | +| `/virt` | 此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统。 | +| `COPYING` | 许可和授权信息。 | +| `CREDITS` | 贡献者列表。 | +| `Kbuild` | 内核设定脚本,可以对内核中的变量进行设定。 | +| `Kconfig` | 配置哪些文件编译,那些文件不用编译[4]。 | +| `Makefile` | 该文件将编译参数、编译所需的文件和必要的信息传给编译器。 | + +### 二、结语 + +本期我们根据openEuler的目录,并参考Linux目录结构简要介绍了openEuler kernel中各个子目录的功能,下一期我们将结合Linux 内核的Kernel Map介绍**Linux内核的基本功能和抽象层级**。 + +参考文献 + +[1] https://www.cnblogs.com/CaesarTao/p/10600462.html + +[2] http://blog.chinaunix.net/uid-30374564-id-5571674.html + +[3] https://blog.csdn.net/wangyachao0803/article/details/81380882 + +[4] https://blog.csdn.net/jianwen_hi/article/details/53398141 + +[5] https://gitee.com/openeuler/kernel \ No newline at end of file diff --git a/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-1.png b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4fdfef00b595f6779b5ab7ae995bdc52f8a0dc0a Binary files /dev/null and b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-1.png differ diff --git a/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-2.png b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e06297fff41b070204e611ca381ee38ad2760921 Binary files /dev/null and b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-2.png differ diff --git a/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-3.png b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4158ee769a31414217b2fd93bf0e253ba3312e Binary files /dev/null and b/content/zh/blog/luoyuzhe/005Linux-kernel-source-structure-1/Directory-structure-3.png differ diff --git a/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/006Linux-kernel-source-structure-2.md b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/006Linux-kernel-source-structure-2.md new file mode 100644 index 0000000000000000000000000000000000000000..eb78cb13885dd4d452d41264986e9f92292731f0 --- /dev/null +++ b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/006Linux-kernel-source-structure-2.md @@ -0,0 +1,48 @@ ++++ +title="第六期Linux内核源码结构-2" +date="2020-08-06" +tags=["Linux","内核","源码"] +archives="2020-08" +author="罗宇哲" +summary="Linux内核源码结构-2" ++++ + + _作者:罗宇哲,中国科学院软件研究所智能软件研究中心_ + +在上一期中,我们按照openEuler内核的目录结构简要介绍了openEuler内核目录中各个子目录的功能,这一期我们将简要介绍**Linux内核的基本功能和抽象层级。** + +### 一、Linux内核Kernel Map简介 + +Linux内核的Kernel Map从功能上将Linux内核划分为不同功能的区域,并展示了不同区域中函数互相之间的调用关系。下图展示了Linux 2.6.36版内核的Kernel Map[1]: + + + +从Kernel Map中我们可以看出,操作系统事实上提供了硬件资源的抽象,供用户程序调用,例如在图中操作系统管理的硬件资源有用户外设(如键盘、摄像头和图形卡等)、IO端口(如USB、PCI接口等)、CPU、内存、磁盘和网络设备等。 + +针对所有硬件资源的使用,在用户态程序看来都是一系列的系统调用,这些系统调用展示在user space interface层,例如对于进程来说有fork、execve等系统调用,分别用于创建新的进程和运行可执行文件等;而对于文件系统则有read和write等系统调用,用于读写文件等。Linux系统可以通过执行软中断将系统控制权交给内核,内核可以执行不同的系统调用再将结果返回[2]。下表列出了**Linux内核各系统调用的基本功能**[2]: + + + +硬件设备之上是设备驱动程序,驱动程序能控制硬件设备上的微控制器,如磁盘的磁盘控制器,来达到控制硬件设备的目的。然而,在高层的系统调用和设备驱动程序之间有着很大的鸿沟,需要用不同级别的软件抽象来实现。以用于管理磁盘的文件系统为例,对用户程序来说,只需要关注一般的读写功能统一函数接口就可以了,而不需要关注具体使用的是什么样的文件系统,例如是Ext2还是Ext4文件系统,这是因为虚拟文件系统(VFS)对这些不同的文件系统进行了统一的抽象。虚**拟文件系统与具体的文件系统的关系**如下图所示[3]: + + + +以Ext2文件系统的写数据为例,在调用用户态的write()接口的时候,需要传入文件描述符。内核根据文件描述符找到file,然后调用函数接口(file-\>fop-\>write)将数据写入文件。其中file结构体的fop指针就是在打开文件的时候通过inode初始化的[3]。这个过程如下图所示: + + + +此外,从Kernel Map中可以看出,有一些对系统资源抽象的重要功能,如进程/线程的调度,也在Kernel Map的中间层实现。注意在Linux中,进程和线程都是由task_struct数据结构来管理的,它们的区别在于线程间共享虚拟地址空间而进程的内存资源互相独立[4]。内核从靠近硬件的底层到靠近用户程序的高层,抽象程度逐渐提升,实现了提供给用户程序的各种硬件资源抽象和使用它们所需要的公共功能,最终抽象为系统调用供用户程序使用。内核程序一般运行在CPU的特权级别,可以访问系统的所有资源,而用户态程序运行在CPU的用户级别下,只能访问其进程的资源,这种设计增加了系统的稳定性。 + +### 二、结语 + +本期我们结合Linux内核Kernel Map简要介绍了Linux内核的基本功能和抽象层级,从下一期开始我们将介绍Linux内核编程环境。 + +参考文献 + +[1] https://makelinux.github.io/kernel/map/ + +[2] https://baijiahao.baidu.com/s?id=1604601045858159778&wfr=spider&for=pc + +[3] https://baijiahao.baidu.com/s?id=1621555464151870974&wfr=spider&for=pc + +[4] https://blog.csdn.net/u012218309/article/details/81912074 \ No newline at end of file diff --git a/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-1.png b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-1.png new file mode 100644 index 0000000000000000000000000000000000000000..89746235ec11b37a3ad73c0412d9ccf3800bd2f8 Binary files /dev/null and b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-1.png differ diff --git a/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-2.jpg b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..331d29fa0e7befadaef21fe47c415f978cf579a0 Binary files /dev/null and b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-2.jpg differ diff --git a/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-3.jpg b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c37b5b74219b200a274fec497f774a9cdbb68f4f Binary files /dev/null and b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-3.jpg differ diff --git a/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-4.jpg b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0369cf28774f814a0a401f3c405acb111b9f4a6 Binary files /dev/null and b/content/zh/blog/luoyuzhe/006Linux-kernel-source-structure-2/Kernel-6-4.jpg differ