基于 Linux 0.11 讲解 Linux 操作系统的启动原理

news2024/10/7 5:23:40

大家好,我是飞哥!

不知道大家有没有产生过一个疑问:从给 Linux 服务器按下开机电源按钮后到启动成功的一段时间里,在这中间 Linux 操作系统都做了哪些事情

在 Linux 服务器没有通电的时候,操作系统还只是躺在硬盘启动区中的一段程序,CPU 没有工作,内存也没有启动。但是在你按下开机键后,Linux 服务器内部就开始变得热闹了起来。一个电子世界被你激活了。经过几十秒或者几分钟的等待,Linux 服务器就可以使用了。

但这中间操作系统都干了啥呢?我有一位朋友叫闪客,就是因为对这个问题的好奇,花了两年时间写了 50 多篇文章,并还总结成了一本书。叫做《Linux 源码趣读》。这周,这本新书正式印刷出炉了。

对于 Linux 启动过程,代码的运行在书中总结成下面一张图来表示。但分了 50 小节来讲述每一个步骤中的细节。全书共 400 多页,250 多张精美的图解,五大部分,从头到尾把 Linux 0.11 全部核心代码讲述的一清二楚

c77827c9156aa3dc30d611fb659d4649.png

当你按下电源后,在主板上提前写死的固件程序 BIOS 会将硬盘启动区中的 512 字节 的数据原封不动地复制到内存中的 0x7c00 这个位置。

然后 CPU 开始跳转到这个位置开始启动引导执行。接着 CPU 的数据段寄存器 ds 、代码段集寄存器 cs 和 栈段寄存器 ss、栈基址寄存器 sp 都会进行初始化。接着除了引导区的 512 字节外的 200 多个扇区的内核代码都会被加载到内存中。

再接着内核会设置全局描述符表 GDT 也会被初始化。全局描述符表入口位置保存在 gdtr 寄存器中,是为了后面逻辑地址转化成物理地址时使用的。接着进入保护模式、开启分页机制后会进入到内核的 main 函数中。

是的,内核也有一个 main 函数。这个 main 函数非常重要,把操作系统的整个骨架都勾勒出来了。

void main(void) {
    ......
    mem_init(main_memory_start,memory_end);
    trap_init();
    blk_dev_init();
    sched_init();
    buffer_init(buffer_memory_end);
    hd_init();

    move_to_user_mode();
    if (!fork()) {
        init();
    }
    for(;;) pause();
}

可见 main 函数中包含了很多 init 函数。其中每一个 init 函数都对应着操作系统某个模块的初始化过程。具体包括内存模块初始化 mem_init、中断初始化 trap_init、块设备初始化 blk_dev_init、进程调度初始化 sched_init、硬盘初始化 hd_init 等。

  • 内存初始化是在内存中准备了一个数组。这个数组中的每一个元素是用来表示该页面是被使用了还是空闲。将所有的物理页都管理了起来。

  • 进程调度初始化中初始化了一个 task_struct 数组。每一个元素将来都会表示一个进程。并设置了时钟中断,将来用作触发调度。

  • 硬盘初始化后,内核打开允许硬盘控制器发送中断请求信号。

  • ......

上面描述的这些都是操作系统的第 0 号内核线程处理的。在操作系统中,0号内核线程是所有进程祖先,是操作系统Linux在初始化阶段从无到有的第一个内核线程

接着最后会切换到用户态模式。并通过 fork 系统调用创建一个 1 号内核线程。并在这个新的进程中继续进行初始化。这个新内核线程中 中会将眼影盘的基本信息(磁头数、柱面数、扇区数)存到一个内核数组中。还会加载根文件系统。顺着 inode 可以找到所有文件。通过 open 系统调用打开了 /dev/tty0,为进程设置好了 0 号、1 号、2号文件描述符。这就是 Linux 的标准 IO:stdin、stdout、stderr。

后面创建的所有进程也好线程也罢,都会继承进程 1 的 0 号、1 号、2号文件描述符。可以使用这 3 个标准 IO。

内核线程 1 还会再创建一个新的内核线程 2,并加载 /bin/sh 进程的代码。这就是 shell 程序,它用来接收用户的命令。也会展示我们熟悉的 shell 画面就展示出来了。

以上是我对闪客这本书中知识的一个概括。不过篇幅所限,不能把技术细节讲清楚。

早在今年 3 月的时候,我就收到了闪客发给我的书稿。看完过了这本纸质书的内容,并且还写了书封面中用到的推荐语。这本书非常巧妙地通过分析 Linux 0.11 的启动过程把所有内核相关的模块都给串了起来。

闪客的新书和飞哥的内容和书形成了很好的互补。我是侧重是针对Linux 3.10/6.1 版本网络管理、进程管理、内存管理等一些问题进行点状的突破。他的这本书是巧妙地通过分析 Linux 0.11 的启动过程把所有内核相关的模块都给串了起来。

d427cabba5ac777711fc0238bbb58231.jpeg

如果你也对 Linux 启动过程感兴趣,想深入地了解 Linux 的启动过程,也想了解各个模块是如何开始工作的,建议入手一本。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】网站被攻击了怎么办?怎么防护DDOS、CC、XSS、ARP等攻击?

网站被攻击了怎么办? 六字真言:认怂、关站、睡觉 如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉【入门&进阶全套282G学习资源包免费分享!】 常见的网络攻击 XSS攻击 XSS 攻击可以分为 3 类&#…

【数据结构】队列(C语言实现)

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 队列 1. 队列的概念及结构…

Winform中加密时提示此实现不是Windows平台FIPS验证的加密算法的一部分

场景 Java与Winform进行AES加解密数据传输的工具类与对应关系和示例: Java与Winform进行AES加解密数据传输的工具类与对应关系和示例_霸道流氓气质的博客-CSDN博客 winform中使用如上进行加密时提示: 实现不是Windows平台FIPS验证的加密算法的一部分…

Vue项目中集成TinyMCE富文本编辑器(图片批量上传等)

TinyMCE富文本在Vue中的使用 关于TinyMCE 实现效果 安装使用TinyMCE 第一步 第二步 1.官网申请Your Tiny API Key,并且配置访问域名: 2.使用css隐藏(这个就不讲了,不推荐使用) 3.全部由本地加载(推荐) 第三步(汉化包) 第四步(封装组…

QT使用MSVC编译时报错C2001: 常量中有换行符

QT使用MSVC编译时报错C2001: 常量中有换行符 Chapter11、QT界面菜单栏->工具->选项->文本编辑器,修改成如果编码是UTF-8则添加,如图:2、QT界面菜单栏->编辑->Slect Encoding...->UTF-8->按编码保存3、在需要的头文件中加…

如何创建高效的 Python Docker 镜像详解

Docker是打包和部署容器中应用程序的行业标准软件。Docker镜像是构建和运行应用程序的基础,为了充分发挥Docker的潜力,您需要优化镜像以提高资源效率、安全性和性能。这将确保您的应用程序在Docker生态系统内无缝运行。 通过一个实际示例来学习如何实现…

分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

学习笔记---不容错过的顺序表的应⽤~~

目录​​​​​​​ 1. 基于动态顺序表实现通讯录项⽬ 1.1 通讯录📇功能要求 1.2 总体思路分析🧐 1.3 创建初始化销毁顺序表🌞 1.3.1 contact.h 1.3.2 Seqlist.h 1.3.3 contact.c 1.3.4 text.c 1.3.5 代码运行测试 1.3.6 二次代码测…

旋转图像(C++解法)

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输…

Pytorch深度学习 - 学习笔记

文章目录 Pytorch深度学习1. Pytorch加载数据初认识2. TensorBoard3. Transforms常见的transform 4. torchvision中的数据集使用5. DataLoader使用6. 神经网络6.1 神经网络的基本骨架6.2 卷积层6.3 最大池化的使用6.4 非线性激活6.5 线性层及其他层6.6 小实战及Sequential 7. 损…

苹果手机内存清理怎么做?5招教你拯救内存!

大家的手机内存还能坚持多久呢?无论是什么牌子的手机,只要使用的时间越久,手机的内存必然会越来越小。如果不及时清理手机里的历史缓存、垃圾文件等数据,就会导致手机变得迟缓、卡顿。 那么,我们该怎么做呢&#xff1…

如何使用 GoGoCode 一键 Vue2 转换 Vue3

前言 从今年年初开始,项目开始升级优化,将之前的 Vue2 旧版本整体升级到 Vue3 版本。在重写了几个 Vue 文件后,我发现做的都是一些机械性的工作,效率低且重复性大。于是就试着搜索了一下有没有什么能够批量转换代码格式的工具&am…

SPE(Single Pair Ethernet)

以太网标准 讲SPE(Single Pair Ethernet)之前我们先了解一下以太网标准: CategoryStandardCable length(m)Data rateDuplex CapabilityWiresFast Ethernet10/100BASE-T10010Mb/s to 100Mb/sFull4Gigabit Ethernet1000/10GBAST-T1001Gb/s to …

UOS系统无法开机问题解决

1、问题截图1 : 2、问题截图2 : 3、问题截图3: 解决方案: 修复磁盘无效,建议拷贝数据,还原系统 请先拷贝数据 进live模式在root a或root b 或系统盘找到Home文件夹里-找到用户名-里面就是用户的数据&am…

四川竹哲电商:抖店怎么修改经营类目?

抖店是抖音推出的一款电商工具,通过抖店可以帮助商家在抖音上开展经营活动。在抖店平台上,商家需要选择经营类目,以便在相应的领域展示商品和提供服务。然而,有时候商家可能需要修改经营类目,以适应经营策略调整或扩大…

什么是无磁远传水表?工作原理是怎样的?

无磁远传水表是一种新型的智能水表,与传统水表相比,它具有更高的精度和可靠性,并且可以实现远程读数和控制。那么,无磁远传水表的工作原理是怎样的呢?下面,小编来为大家介绍下什么是无磁水表?它的工作原理是怎样的&a…

MySQL 三大日志(bin log、redo log、undo log)

redo log redo log (重做日志) 是 InnoDB 存储引擎独有的,它让 MySQL有了崩溃恢复的能力,是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与…

数字孪生技术:重塑企业经营的未来

在当今数字化时代,企业经营面临了前所未有的挑战和机遇。数字孪生技术作为新一代数字化工具,正在成为企业走向成功的关键。数字孪生是一种通过数字模型在虚拟世界中模拟和反映物理实体、过程和系统的技术,它为企业经营带来了许多重要的帮助。…

Sourcetree突然打不开,双击打开,图片闪一下就没反应了

解决方案如下: 1.点击图标,右键点击“打开文件所在位置 2.返回上一级,找到Atlassian文件夹 3.进入此文件夹下,删除SourceTree.exe_Url文件夹 4.再双击桌面的Sourcetree图标,可以正常打开。 最近刚遇到此问题&#x…

【广州华锐互动】智慧水务3D可视化数字孪生大屏定制开发

污水处理流程的复杂性需要一种有效的方法进行理解和优化。传统的2D图表和文字描述方法往往无法全面、直观地展示污水处理的各个环节。然而,智慧排水3D数字化管控系统可以为污水处理流程提供更深入、更全面的理解,从而帮助改进污水管理。 首先&#xff0c…