热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

理解Linux的启动过程

文章标题:理解Linux的启动过程。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  从按下PC电源,到出现熟悉的bash提示符"$"或进入漂亮的KDE/GNOME桌面,这是我们每天开机必经的过程。那么,在这短短几十秒内,Linux是怎样启动的呢?本文介绍Linux的启动过程。

  平台:PC机, Ubuntu 5.10

  基础知识

  BIOS (Basic I/O System,基本输入/输出系统)

  BIOS,完整地说应该是ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际上是被固化到计算机中的一组程序,为计算机提供最低级的、最直接的硬件控制。准确地说,BIOS是硬件与软件程序之间的一个“转换器”或者说是接口(虽然它本身也只是一个程序),负责解决硬件的即时需求,并按软件对硬件的操作要求具体执行。

  从功能上看,BIOS分为三个部分:

  1.自检及初始化程序;

  2.硬件中断处理;

  3.程序服务请求。

  这里我们主要关注第一部分——自检及初始化程序:这部分负责启动计算机,具体有三个部分,第一个部分是用于计算机刚接通电源时对硬件部分的检测,也叫做加电自检(POST),功能是检查计算机是否良好,例如内存有无故障等。第二个部分是初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,主要是对硬件设置的一些参数,当计算机启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。

  最后一个部分是引导程序,功能是引导DOS或其他操作系统。BIOS先从软盘或硬盘的开始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到引导记录会把计算机的控制权转给引导记录,由引导记录把操作系统装入计算机,在计算机启动成功后,BIOS的这部分任务就完成了。

  关于BIOS的详细介绍,可以google一下,这篇文章就不错。

  硬盘

  就物理组成来说,一个硬盘封装里有多个盘片(platter),每个盘面有两个面(surface)。在盘片上都有一个磁头(head)来进行硬盘盘片的读/写,盘片绕轴(spinder)旋转一周时磁头所走过的轨迹即磁道(track),所有盘片的同一磁道构成了磁柱(cylinder)。磁道又被分为多个扇区(sector),扇区是最小的磁盘存储单位,即硬盘分区时的最小单位——通常为512KB。磁道由缝隙(gap)分开,gap中存储的不是数据位,而是用来确认扇区的格式位。

  MBR

  主引导扇区(MBR, Master Boot Recorder)是硬盘中最重要的部分,它记录了硬盘的分区信息、引导信息。CU上面有一篇介绍MBR的文章。

  注意这里所说的MBR是指BIOS中指定的启动设备中的MBR。如果以软盘启动,则MBR是软盘的第一个扇区。如果是硬盘,则是硬盘的第一个扇区。如果有多个硬盘呢?那么就是BIOS中指定启动硬盘的第一个扇区!

  run-level

  运行  $ less /etc/inittab

  显示下列信息:

  # /etc/init.d executes the S and K scripts upon change

  # of runlevel.

  #

  # Runlevel 0 is halt.

  # Runlevel 1 is single-user.

  # Runlevels 2-5 are multi-user.

  # Runlevel 6 is reboot.

  上面显示的就是当前可用的登录模式,共有0~6中级别。常用的是3和5。

  0:关机

  1:单用户模式(系统有问题时的登录模式,相当于WINDOWS的"安全模式“)

  2:对于Debian/Ubuntuare来说,2~5都是相同的——多用户图形界面模式。对于其他发行版来说,3可能是多用户文本模式,4为系统保留,5为多用户图形模式,具体的定义可以查看该发行版对应的/etc/inittab文件内容。

  6:重新启动

  另外,还可能有"S"级,它等同于1的单用户级别。

  运行 $ runlevel 可以查看系统当前运行级别

  如果把运行级别设成了0或6,想象会出现什么情况?如何解决呢?

  WINDOWS在启动时,如果按下F8,会出现“安全模式“、”正常启动“、”MS-DOS“模式的选择。相当于Linux run-level的1,5,3(不对应于Debian/Ubuntu)。

  关于Debian/Ubuntu中的run-level,看这里!

  基本流程

  1, 加载BIOS硬件信息,并取得第一个开机装置的代号。

  2,加载第一个开机装置中MBR的boot loader(即lilo, grub, spfdisk等)引导信息。

  3,加载Linux内核,内核开始解压缩,并驱动硬件。

  4,内核执行init程序,并获得run-level信息;

  5,init 执行 /etc/init.d/rcS 程序;

  6,加载内核模块(module)

  7,init 执行 对应run-level 级的脚本文件( Scripts );

  8,执行 /bin/login 程序,等待用户登入;

  9,用户登入之后,开始以shell控制系统(如果以图形界面登录,则运行图形界面)。

  下面具体介绍流程中的步骤:

  1,加载BIOS

  系统上电时,最先读取BIOS信息。BIOS(Basic Input/Output System)是计算机与外设最底层的接口,它存储了计算机启动时最先加载的数据,包括:CPU类型、启动设备顺序、硬盘大小/类型、芯片组工作状态、外设I/O地址、PnP (Plug and Play,既插既用设备)的开启与否、内存时钟等。

  读取了BIOS设定值后,系统根据BIOS数据进行开机自我检测(Power On Self Test, POST),对硬件进行初始化,并设定PnP设备,指定启动设备,之后从磁盘的MBR中读取Bootloader数据。

  2,加载Boot Loader

  系统读完BIOS之后,接着加载第一个引导磁盘的第一个扇区(MBR),boot loader就位于MBR中。此时,启动工作的接力棒就交到了boot loader的手中。

  常用的boot loader有lilo, grub, spfdisk等,现在最流行的是grub,我用的Ubuntu中,boot loader就是grub,本文假设boot loader是grub,其实基本原理都是一样的。

  为什么要在MBR中安装boot loader呢?它到底有什么作用?实际上,boot loader的作用就是加载OS内核。系统在启动时,要读取文件以加载内核,必须能够识别硬盘文件系统,但这时候系统还在启动过程中,对文件系统信息一无所知。boot loader就辅佐系统识别文件格式,加载内核。boot loader不仅不光能够识别Linux内核,而且能识别WINDOWS内核.所以,如果要安装多系统,那么要在MBR中安装能支持这些系统文件系统的 boot loader.

  如果是以grub启动,加载它后,会有个选择启动那个OS的菜单,当你作出选择后,grub就从被选定OS所在的扇区中加载相应的内核.

[1] [2] 下一页


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • Linux神奇漏洞:长按回车键70秒 即可轻松拿到Root权限
    一般来说获取系统root权限是很困难的,尤其是加密系统中,但西班牙安全研究员hectormarco、ismaelripoll发现,linux系统下只需按住回车键70秒钟,就能轻 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
author-avatar
mobiledu2502881573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有