linux 启动

来源:互联网 发布:windows书籍 编辑:程序博客网 时间:2024/05/08 16:19


最近在看关于进程的时候,看到了关于linux启动的相关的过程的时候,觉得有必要在这里记录下,并且分享给大家,中间肯定有些说的不清楚的地方,

请大家指出来哈,不胜感激。我这里只是简单的说明开机的过程,并没有深入的说明。

  我想大家都知道了系统启动的过程吧,简单的说有下面几个重要的过程

  1. 启动电源,加载BIOS的硬件信息和进行自我测试,并且依据设定取得第一个可开机的装置;
  2. 读取并执行第一个开机装置内MBR的boot Loader ;
  3. 依据boot loader 的设定加载kernel,开始侦听硬件和加载驱动程序;
  4. 在硬件驱动成功后,kernel就会主动的呼叫init程序;
  5. 再由init程序依据/etc/ttys文件中的每一行数据,分别启动进程一个getty进程;
  6. getty调用exec执行login进程处理登录;
  7. 登录成功程序就进入系统了。

现在我们就以上面这个过程进行讲解吧:
  • BIOS, 开机自我测试和MBR
首先是在系统去加载BIOS,并透过BIOS程序去加载CMOS的信息,并且通过CMOS内的设定值取得主机的各项硬件配置。
比如说是CPU与接口设备的沟通频率、开机装置的搜寻顺序、硬盘大小和类型、系统时间、各种总线是否启动、IO地址等等。
完了后BIOS还会进行开机自我测试(power-on self test,POST)然后开始执行硬件侦测的初始化。而后就来到了MBR数据
的读取了。
由于我们系统软件都放在硬盘中,所以BIOS会指定开机的装置来读取磁盘中的系统核心文件。但是由于不同的操作系统
他的文件系统也不相同,因此就出现了开机管理程序来处理核心文件的加载问题。而这里的这个开机管理程序就是boot loader
那么boot loader 安装在哪里?也就是在我们硬盘的第一个扇区的开头的一个块空间里面,我们将这个区域一般叫做MBR(Master 

Boot Record)。

而在这里呢?每一个分区有一个文件系统,每个文件系统都有一个boot sector区域,而在这块区域里面也会有关于各个文件系统
相应的loader。那么MBR中的boot loader又是怎么处理进行加载文件系统中的loader呢?
在这里我又得在补充点了,boot loader 的功能:

  1. 提供选单:用户可以选择不同的开机项目
  2. 载入核心文件:直接指向可开机的程序
我们先看看下面的图:
如上图所示,每个操作系统默讣是会安装一套 boot loader 到他自己的文件系统中 (就是每个 filesystem 左下方的方框),而在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR 去,也可以选择不安装。 如果选择安装到 MBR 的话,那理论上你在 MBR 和 boot sector 都会保有一分 boot loader 程序的。 至于 Windows 安装时,他预设会主动的将 MBR 和 boot sector 都装上一分boot loader!所以啦, 你会发现安装多重操作系统时,你的 MBR 常常会被不同的操作系统的 boot loader 所覆盖啦

注意哦,这也是为什么windows要比linux现安装的原因哦,因为安装windows 的时候会用windows自己的MBR覆盖里面原来的程序,而windows写到MBR的引导程序没有选择功能的,它只认识windows的启动程序。所以它只能启动windows。而linux的引导程序则不同,她可以识别linux和windows的启动程序,所以就需要先装windows后装linux这样就是linux的引导程序覆盖了windows的引导程序这样就可以建立双系统了。而如果你先装了linux,也是可以再装windows的,但是需要修改windows的引导程序,不做讨论。

  • kernel加载init,并由init加载gettty进程在由不同的终端执行login进程
由上面的过程,已经将kernel加载到内存后,又kernel创建init进程。
请看下面这张图

在/etc/ttys中的每一行都代表一个终端,所以在kernel创建init进程后,由init进程根据/etc/ttys中每一行fork一个新的进程。再由每一个终端的新的进程exec getty程序,创建getty进程。并且打开终端设备和读取用户名、初始化环境设置等。当用户输入用户名后,该getty进程调用如下语句

execl( “/bin/sh”, "login", "-p", username, (char*)0, envp);

这样就将进程执行login程序了。。

再由login程序读取密码,在到/etc/shadow文件中查看,如果登录成功则会进行很多环境的修改,比如修改工作目录,改变终端的所有权,调用setgid等设置用户进程的属主,通过login获得相应的环境变量等,初始化shell等。实际上login程序会做更多的事情,这里就不说了。

如果登录失败,那么login进程则调用退出函数exit(127),在由系统init为该终端fork新的进程后执行上面的过程。


这篇文章这是我自己的对这个过程的很浅显的认识,希望对你有所帮助!
















原创粉丝点击