深入理解 Linux 内核启动流程

 

目录

一、BIOS 与 Bootloader

1.BIOS(Basic Input/Output System)

2.Bootloader(引导加载程序)

二、内核初始化

1.解压内核映像

2.初始化硬件设备

3.建立内存管理系统

4.启动第一个进程(init)

三、系统初始化

1.运行级别切换

2.启动系统服务和守护进程

3.用户登录

四、总结


        在 Linux 系统中,内核的启动是一个复杂而关键的过程,它为整个操作系统的运行奠定了基础。本文将详细探讨 Linux 内核的启动流程,帮助读者更好地理解这个神秘而重要的过程。

一、BIOS 与 Bootloader

1.BIOS(Basic Input/Output System)

  • 当计算机启动时,BIOS 首先被执行。它负责硬件的初始化,包括检测硬件设备、设置硬件参数等。BIOS 还会查找可引导设备,通常是硬盘、U 盘或光盘。
  • 如果找到了可引导设备,BIOS 会将引导扇区(通常是硬盘的第一个扇区)加载到内存中,并将控制权转移给引导扇区中的代码。

2.Bootloader(引导加载程序)

  • Bootloader 是位于引导扇区或其他特定位置的程序,它的主要任务是加载 Linux 内核到内存中,并将控制权转移给内核。常见的 Bootloader 有 GRUB、LILO 等。
  • Bootloader 首先会进行一些初始化工作,如设置内存布局、检测硬件设备等。然后,它会读取内核映像文件,并将其加载到内存中的特定位置。最后,Bootloader 会跳转到内核的入口点,将控制权转移给内核。

二、内核初始化

1.解压内核映像

Linux 内核通常以压缩的形式存储在磁盘上,以便节省空间。当 Bootloader 将内核映像加载到内存中后,内核首先会进行解压缩操作。解压缩后的内核映像会被放置在内存中的特定位置,准备进行进一步的初始化。

2.初始化硬件设备

  • 内核在启动过程中会对各种硬件设备进行初始化。这包括 CPU、内存、中断控制器、定时器、设备总线等。内核会检测硬件设备的存在和状态,并为它们分配资源,如内存地址、中断号等。
  • 对于一些重要的硬件设备,内核还会加载相应的驱动程序,以便在系统运行时能够正确地操作这些设备。

3.建立内存管理系统

  • 内存管理是内核的一个重要功能,它负责为系统中的进程分配和管理内存资源。在启动过程中,内核会建立内存管理系统,包括初始化内存页表、设置内存分配策略等。
  • 内核还会检测系统中的物理内存大小,并将其划分为不同的内存区域,如内核空间和用户空间。内核空间是供内核代码和数据使用的内存区域,而用户空间是供用户进程使用的内存区域。
mm_init_cpumask(&init_mm); /*和内存有关的初始化 */

 

4.启动第一个进程(init)

  • 当内核完成了硬件设备的初始化和内存管理系统的建立后,它会启动第一个进程,通常是init进程。init进程是系统中的第一个用户空间进程,它的任务是初始化系统环境、启动其他系统服务和守护进程等。
  • init进程会根据系统的配置文件(如/etc/inittab)来确定系统的运行级别,并启动相应的服务和守护进程。例如,在系统启动时,init进程可能会启动网络服务、文件系统服务、登录服务等。

三、系统初始化

1.运行级别切换

  • 根据系统的配置文件,init进程会切换到不同的运行级别。每个运行级别代表了系统的一种特定状态,例如单用户模式、多用户模式、图形界面模式等。
  • 在不同的运行级别下,系统会启动不同的服务和守护进程,以满足用户的需求。例如,在图形界面模式下,系统会启动图形界面服务和相关的应用程序,而在单用户模式下,系统只启动必要的服务,以便进行系统维护和修复。

2.启动系统服务和守护进程

  • init进程会根据系统的运行级别启动相应的系统服务和守护进程。这些服务和守护进程包括网络服务、文件系统服务、打印服务、数据库服务等。它们负责为用户提供各种系统功能和服务,确保系统的正常运行。
  • 系统服务和守护进程通常以后台进程的形式运行,它们会在系统启动时自动启动,并在系统运行过程中持续运行,直到系统关闭。

3.用户登录

  • 当系统服务和守护进程启动完成后,系统会进入用户登录界面。用户可以通过输入用户名和密码登录到系统中,开始使用系统的各种功能和服务。
  • 用户登录后,系统会为用户创建一个用户环境,包括设置用户的工作目录、环境变量等。用户可以在这个环境中运行各种应用程序,进行文件操作、网络通信等。

四、总结

        Linux 内核的启动流程是一个复杂而精细的过程,它涉及到硬件设备的初始化、内存管理、进程管理等多个方面。通过了解这个过程,我们可以更好地理解 Linux 系统的工作原理,为系统的维护和优化提供帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记【19】

具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…

【Qt】qt安装

在工作一年之后,还是想做一个Qt的教程,遥想研一刚刚接触Qt,从0到1学习,没有什么参考书籍,网上的资料也不多,幸好Qt官方文档写得好,加上自己肯研究,才堪堪入门。 现在我想自己写一个…

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符: 前面不分栏,后面分栏(或前面分栏,后面不分栏),只需要在分隔位置处插入分隔符:“连续”即…

搭建Tomcat(四)---Servlet容器

目录 引入 Servlet容器 一、优化MyTomcat ①先将MyTomcat的main函数搬过来: ②将getClass()函数搬过来 ③创建容器 ④连接ServletConfigMapping和MyTomcat 连接: ⑤完整的ServletConfigMapping和MyTomcat方法: a.ServletConfigMappin…

谁说C比C++快?

看到这个问题,我我得说:这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子: // C风格 char* str (char*)malloc(100…

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>

1.代码 <ul><li>电话&#xff1a;<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱&#xff1a;<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱&#xff1a;<a hre…

Nginx三种安装方式

Nginx安装 可以登录 Nginx 的官方网站&#xff1a;https://www.nginx.com/ 找到安装方式。 查看如何安装开源的版本&#xff1a;https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/ 通过官方的说明&#xff0c;也可以知道安装&#…

Android 10 Launcher3 删除谷歌搜索

命令行获取页面 手机处于launcher首页 adb shell dumpsys window | findstr mCurrentFocus 输出 mCurrentFocusWindow{9afb34d u0 com.android.launcher3/com.android.launcher3.Launcher} 找到源码路径 packages/apps/Launcher3/ Android10源码 搜索控件 grep -r -n Apps…

自动驾驶AVM环视算法--python版本的俯视TOP投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…

前端OpenAPI根据后端Swagger自动生成前端接口报错

测试之后发现是因为Map<Long,List<CommentVO>>的返回值类型的锅&#xff0c;改成Page<List<CommentVO>>即可解决。 前端使用的umiMAX的openapi&#xff0c;报错如下&#xff1a; originalRef: BaseResponseboolean\n "401&q…

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…

.NET 技术 | 调用系统API创建Windows服务

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

《PCI密码卡技术规范》题目

单选1 在《PCI密码卡技术规范》中&#xff0c;下列哪项不属于PCI密码卡的功能&#xff08;&#xff09;。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案&#xff1a;D. <font style"color:#DF2A3F;">解析&…

Java操作Redis-Jedis

介绍 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在 java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使 用JDBC操作MySQL数据库一样。 Redis 的 Java 客户端很多&#xff0…

QT网络(二):TCP通信

传输层概念 传输控制协议&#xff08;transmission control protocol&#xff0c;TCP&#xff09;是一种被大多数 Internet 网络协议用于数据传输的底层网络协议&#xff0c;它是可靠的、面向流和连接的传输协议&#xff0c;特别适合用于连续数据传输。 应用层在网络模型中的…

Cherno C++学习笔记 P43 对象生存周期

这篇文章我们讲一下对象的生存周期。这个也是一个很重要的问题&#xff0c;因为我们总说&#xff0c;编程其实就是在操纵内存&#xff0c;而知道了变量如何在栈上生存&#xff0c;以及我们如何利用这些特性来让我们的编程更加简单&#xff0c;我们才是真的理解了编程。我们都知…

02、10个富士胶片模拟的设置

二色彩 1、色彩的加减控制全局的饱和度增减&#xff1b; 2、色彩效果只提升暖色系饱和度&#xff1b; 3、FX蓝色大幅度提升蓝色系饱和度&#xff1b; 4、三个参数都不改变颜色的色相。 2.1 色彩 色彩调整的是拍摄画面整体的色彩饱和程度 2.2色彩效果 调整的是画面中暖色…

【Unity3D】ILRuntime学习记录一

Unity 2019.4.0f1 导入ILRuntime 2.1.0版本 项目目录/Packages/manifest.json添加如下代码&#xff1a; {"scopedRegistries":[{"name":"ILRuntime","url":"https://registry.npmjs.org","scopes":["com.ou…

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

2024年12月19日Github流行趋势

项目名称&#xff1a;ByteByteGoHq / system-design-101 项目维护者&#xff1a;slam, LombardiDaniel, Stephanvs, alastairp, lucasberti 等项目介绍&#xff1a;使用视觉和简单术语解释复杂的系统。帮助你准备系统设计面试。项目star数&#xff1a;66,527项目fork数&#xf…