Linux 系统启动过程分析

简介:

美丽的开端是成功的一半,慢慢开始我的享受之路->kernel。

Linux启动流程:

wKioL1mvXhrS8WNyAACGShIq7jQ144.png


1.BIOS(基本输入输出系统)启动

    它的主要任务是提供CPU所需的启动指令,是预先编译好了供系统启动使用的启动程序,把他们存在ROM中,并安排他到一个固定的位置,FFFF:0000.

    首先是上电自检,然后对系统内的硬件设备进行监测和连接,并把测试所得的数据存放到BIOS数据区,以便操作系统启动时或启动后使用,最后,BIOS将从软盘或硬盘上

    读入Boot Loader。除了启动程序,BIOS还提供一组中断以便对硬件设备的访问。

2.读取MBR

    如果从硬盘启动,BIOS将读入该盘的零柱面零磁道上的1扇区(MBR),这个扇区存放着Boot Loader,该扇区的最后一个字节存放标志,如果为AA55,BIOS在完成硬件监测后会把控制权给Boot loader。

3.Boot Loader

    通常是一段汇编代码,存放在MBR中,它的主要作用就是将系统启动代码读入内存。BIOS将其读入至内存中物理地址0x07c00处。

    Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

    Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。

4.加载内核

    Boot Loader一言总结就是把操作系统的代码调入内存。

    Boot Loader此时将控制权交给了Setup.s这段程序;首先,Setup.S对调入内存的操作系统检查,

它会通过BIOS中断获取内存容量信息,设置键盘的响应速度,设置显示器的基本模式,获取硬件信息,

检测是否有PS/2鼠标,这时操作系统就准备让CPU进入保护模式。当然,要先屏蔽中断,避免打扰。

    进入保护模式下的启动阶段,将控制权交给Head.S:做一些屏蔽中断的准备工作,知道start_kernel()被调用,中断向量表才被使用,检查CPU的类型,在start_kernel()根据这个结果设置,页初始化等。到这里中断管理,内存管理已经建立好,然后调用/INIT/MAIN.C中的start_kernel()函数(以后总结内核再详细讨论main.c)。进入main.c就是一系列的初始化了。

5.建立init进程

    init进程的建立是在main.c函数的最后一行调用,rest_init()->kernel_thread(init, NULL, CLONE_KERNEL);

init()函数:

1)建立 dbflush、kswapd 两个新的内核线程。

2)初始化 tty1 设备。该设备对应了多个终端(concole),用户登录时,就是登录在这

些终端上的。

3)启动 init 进程。 Linux 首先寻找 “/etc/init” 文件, 如果找不到, 就接着找 “/bin/init”

文件,若仍找不到,再去找“/sbin/init”。如果仍无法找到,启动将无法进行下去。否则便执行 init 文件,从而建立 init 进程。

    当 etc/init(假定它存在)执行时,建立好的 init 进程将根据启动脚本文件的内容创

建其它必要的进程去完成一些重要的操作。

(1)文件系统检查。

(2)启动系统的守护进程。

(3)对每个联机终端建立一个“getty”进程。

(4)执行“/etc/rc”下的命令文件。

    此后, “getty”会在每个终端上显示 “login” 提示符, 以等待用户的登录。 此时 “getty”会调用 “exec” 执行 “login” 程序, “login” 将核对用户帐户和密码, 如果密码正确, “login”调用“exec”执行 shell 的命令行解释程序(当然,也可以执行 X Windows 如果用户设置了的话)。shell 接着去执行用户默认的系统环境配置脚本文件(通常是用户的 home 目录下的

profile 文件)。

    init 还有另外一个任务,当某个终端或虚拟控制台上的用户注销之后,init 进程要为

该终端或虚拟控制台重新启动一个 “getty”,以便能够让其他用户登录。这是为什么呢?

你应该发现,当用户登录时,“getty”用的是“exec”而不是“fork”系统调用来执行

“login”,这样,“login”在执行的时候会覆盖“getty”的执行环境(同理,用户注册成

功后,“login”的执行环境也会被 shell 占用)。所以,如果想再次使用同一终端,必须再

启动一个“getty”。

    此外,init 进程还负责管理系统中的“孤儿”进程。如果某个进程创建子进程之后,

在子进程终止之前终止,则子进程成为孤儿进程。init 进程负责“收养”该进程,即孤儿进

程会立即成为 init 进程的子进程。这是为了保持进程树的完整性。

总结:Linux启动时一个相当复杂的过程,这些就是大概的总结。接下来分析main函数初始化,再下来就是按模块进行分析kernel。



本文转自 8yi少女的夢 51CTO博客,原文链接:http://blog.51cto.com/zhaoxiaohu/1963018,如需转载请自行联系原作者

相关文章
|
2月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
108 3
|
21天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
157 78
|
24天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
56 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
11天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
29 7
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
168 48
|
20天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
88 13
|
14天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
1月前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
2月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
52 3
|
21天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0

热门文章

最新文章