Linux的诞生过程

Posted 小李会科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的诞生过程相关的知识,希望对你有一定的参考价值。

  • 个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。
  • 座右铭:海不辞水,故能成其大;山不辞石,故能成其高。
  • 个人主页:小李会科技的主页

目录

 前言:

一.Linux是什么

 二.诞生过程

三.启动流程


 前言:

本篇文章介绍了Linux的诞生过程和用处


一.Linux是什么

Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。 

  • 外文名: Linux   类别 :  操作系统   产生时间:1991年的10月5日

  • 创始人:林纳斯·托瓦兹

  • 发行版本:Debian、RedHat、Slackware等

  • 特点:开源、可靠、安全、稳定、多平台
     

 二.诞生过程

  1. Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。
  2. 1981 年IBM公司推出微型计算机IBM PC。
  3. 1981-1991 年间DOS操作系统一直是微机上操作系统的主宰。
  4. 1991 年,GNU 计划已经开发出了许多工具软件。
  5. 1991 年4 月,他开始酝酿并着手编制自己的操作系统。刚开始,他的目的很简单,只是为了学习Intel 386 体系结构保护模式运行方式下的编程技术。但后来Linux 的发展却完全改变了初衷。
  6. 1991 年初,林纳斯·托瓦兹开始在一台386sx 兼容微机上学习minix 操作系统。
  7. 1991 年的4 月份开始,林纳斯·托瓦兹几乎花了全部时间研究386-minix系统(hack the kernel),并且尝试着移植GNU 的软件到该系统上(GNU gcc、bash、gdb 等)。
  8. 1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell 软件了。
  9. 1991 年7 月3 日,第一个与Linux 有关的消息是在在comp.os.minix 上发布的(当然此时还不存在Linux 这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX ,FREAX 的英文含义是怪诞的、怪物、异想天开等)。
  10. 1991 年8 月25 日,在林纳斯·托瓦兹的下一发布的消息中,他向所有minix 用户询问"What would you like to see in minix?"("你最想在minix 中见到什么?")
  11. 1991 年的10 月5 日,林纳斯·托瓦兹在comp.os.minix 新闻组上发布消息,正式向外宣布Linux 内核系统的诞生(Free minix-like kernel sources for 386-AT)。

三.启动流程

1、读取MBR的信息,启动Boot Manager ,Windows使用NTLDR作为Boot Manager,如果您的系统中安装多个版本的Windows

3、init进程读取“/etc/inittab”文件中的信息,并进入预设的运行级别,按顺序运行该运行级别对应文件夹下的脚本。

4、根据“/etc/rcS.d/”文件夹中对应的脚本启动Xwindow服务器“xorg”,Xwindow为Linux下的图形用户界面系统。

5、启动登录管理器,等待用户登录 ,Ubuntu系统默认使用GDM作为登录管理器,您在登录管理器界面中输入用户名和密码后,便可以登录系统。

Linux 0.11-一个新进程的诞生-22

Linux 0.11-一个新进程的诞生-22


一个新进程的诞生

本文为整个第三部分的第一回内容。

一个新进程的诞生,从操作系统的源码角度来说,其实就两行代码。而关于创建进程的重点,其实就一行代码,就是大名鼎鼎的 fork 函数。

我们先来看一张图,看看操作系统从开机到怠速都做了些什么事情。

你看,第一部分和第二部分,为我们这个第三部分做了充足的铺垫工作。

第一部分 进入内核前的苦力活

第二部分 大战前期的初始化工作

到了第三部分,简单说就是从内核态切换到用户态,然后通过 fork 创建出一个新的进程,再之后老进程进入死循环。

void main(void) 
    // 第二部分的内容,各种初始化工作
    ...
    // 第三部分的内容,一个新进程的诞生
    move_to_user_mode();
    if (!fork()) 
        // 新进程里干了啥,是第四部分的内容
        init();
    
    // 死循环,操作系统怠速状态
    for(;;) pause();

至于 fork 出来的新进程做了什么事,就是 init 函数里的故事里,这个不在第三部分的讨论范畴。

关于linux fork函数实现和作用讲解

所以你看,一共就两行代码,顶多再算上最后一行的死循环,三行,就把创建新进程这个事搞定了。再加上新进程里要做的 init 函数,一共四行代码,就走到了 main 函数的结尾,也就标志着操作系统启动完毕!

但就是这没有多少个字母的四行代码,是整个操作系统的精髓所在,也是最难的四行代码。理解了它们,你就会有原来操作系统就是这破玩意的感叹了~

今天我们就总览一下这四句,很轻松。

第一句是 move_to_user_mode

直译过来即可,就是转变为用户态模式。因为 Linux 将操作系统特权级分为用户态与内核态两种,之前都处于内核态,现在要先转变为用户态,仅此而已。

一旦转变为了用户态,那么之后的代码将一直处于用户态的模式,除非发生了中断,比如用户发出了系统调用的中断指令,那么此时将会从用户态陷入内核态,不过当中断处理程序执行完之后,又会通过中断返回指令从内核态回到用户态。

整个过程被操作系统的机制拿捏的死死的,始终让用户进程处于用户态运行,必要的时候陷入一下内核态,但很快就会被返回而再次回到用户态,是不是非常无奈?

第二句是 fork

这是创建一个新进程的意思,而且所有用户进程想要创建新的进程,都需要调用这个函数。

原来操作系统只有一个执行流,就是我们一直看过来的所有代码,就是进程 0,只不过我们并没有意识到它也是一个进程。调用完 fork 之后,现在又多了一个进程,叫做进程 1。

当然,更准确的说法是,我们一路看过来的代码能够被我们自信地称作进程 0 的确切时刻,是我们在 第18回 | 进程调度初始化 sched_init 里为当前执行流添加了一个进程管理结构到 task 数组里,同时开启了定时器以及时钟中断的那一个时刻。

因为此时时钟中断到来之后,就可以执行到我们的进程调度程序,进程调度程序才会去这个 task 数组里挑选合适的进程进行切换。所以此时,我们当前执行的代码,才真正有了一个进程的身份,才勉强得到了一个可以被称为进程 0 的资格,毕竟还没有其他进程参与竞争。

如果你觉得这些话很困惑,就对了,在理解了整个这一块的细节之后,尤其是对于进程调度这种被人赋予了好多虚头巴脑的名词的地方,你会豁然开朗的。

第三句是 init

只有进程 1 会走到这个分支来执行。这里的代码可太多了,它本身需要完成如加载根文件系统的任务,同时这个方法将又会创建出一个新的进程 2,在进程 2 里又会加载与用户交互的 shell 程序,此时操作系统就正式成为了用户可用的一个状态了。

当然,当你知道了新进程诞生的过程之后,进程 2 的创建,就和进程 1 的创建一样了,在后面的章节中你将不会再困惑创建新进程的过程,减轻了学习负担。所以这一部分,又是作为下一部分的重要基础,环环相扣。

我们的教育,往往是强调知识点。但我认为,整个知识都是成体系的,没有哪个地方可以单点立起整个的理解大厦,必须一环扣一环。幸运的是,每一环都是十分简单且纯粹的。

第四句是 pause

当没有任何可运行的进程时,操作系统会悬停在这里,达到怠速状态。没啥好说的,我一直强调,操作系统就是由中断驱动的一个死循环。

一共四句话,切换到用户态,创建新进程,初始化,然后悬停怠速。

乍一看,是不是特别简单?是的,不过当你展开每一段代码的细节后你会发现,一个庞大的世界让你无从下手。但当你把全部细节都捋顺了之后你又会发现,不过如此。

欲知后事如何,且听下回分解。


转载

本文转载至闪客图解操作系统系列文章

以上是关于Linux的诞生过程的主要内容,如果未能解决你的问题,请参考以下文章

Linux诞生与发展的历史背景

Linux运维第二课----Linux发展史环境准备

IT运维工程师们为什么选择使用Linux系统

IT运维工程师们为什么选择使用Linux系统

linux操作系统的诞生,发展和成长过程始终依赖着的重要支柱都有哪些

Linux运维基础(九):Linux的引导过程