Linux的诞生过程
Posted 小李会科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的诞生过程相关的知识,希望对你有一定的参考价值。
- 个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。
- 座右铭:海不辞水,故能成其大;山不辞石,故能成其高。
- 个人主页:小李会科技的主页
目录
前言:
本篇文章介绍了Linux的诞生过程和用处
一.Linux是什么
Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。
-
外文名: Linux 类别 : 操作系统 产生时间:1991年的10月5日
-
创始人:林纳斯·托瓦兹
-
发行版本:Debian、RedHat、Slackware等
-
特点:开源、可靠、安全、稳定、多平台
二.诞生过程
- Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。
- 1981 年IBM公司推出微型计算机IBM PC。
- 1981-1991 年间DOS操作系统一直是微机上操作系统的主宰。
- 1991 年,GNU 计划已经开发出了许多工具软件。
- 1991 年4 月,他开始酝酿并着手编制自己的操作系统。刚开始,他的目的很简单,只是为了学习Intel 386 体系结构保护模式运行方式下的编程技术。但后来Linux 的发展却完全改变了初衷。
- 1991 年初,林纳斯·托瓦兹开始在一台386sx 兼容微机上学习minix 操作系统。
- 1991 年的4 月份开始,林纳斯·托瓦兹几乎花了全部时间研究386-minix系统(hack the kernel),并且尝试着移植GNU 的软件到该系统上(GNU gcc、bash、gdb 等)。
- 1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell 软件了。
- 1991 年7 月3 日,第一个与Linux 有关的消息是在在comp.os.minix 上发布的(当然此时还不存在Linux 这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX ,FREAX 的英文含义是怪诞的、怪物、异想天开等)。
- 1991 年8 月25 日,在林纳斯·托瓦兹的下一发布的消息中,他向所有minix 用户询问"What would you like to see in minix?"("你最想在minix 中见到什么?")
- 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 函数里的故事里,这个不在第三部分的讨论范畴。
所以你看,一共就两行代码,顶多再算上最后一行的死循环,三行,就把创建新进程这个事搞定了。再加上新进程里要做的 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的诞生过程的主要内容,如果未能解决你的问题,请参考以下文章