操作系统之启动过程

news2025/3/3 4:51:40

本文参考MOOC哈工大操作系统课程,需要有一定的汇编基础

打开电源后,计算机做了什么

此时需要先运行的代码是BIOS

  1. x86 PC开机后CPU处于实模式,寻址方式为CS:IP(CS左移4位+IP)
  2. 开机时,初始化的CS=0xFFFF,IP=0x0000,此时指向的地址为0xFFFF0(ROM BIOS映射区,上电后内存中只有此处有代码)
    此时载入的是BIOS程序,还没有进入操作系统的部分,BIOS程序是固化在主板上的一段程序负责基本输入输出、系统设置信息、开机后自检程序和系统自启动程序。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。目前大多烧录在可擦写ROM中,因此也可以进行BIOS升级。
    在这里插入图片描述
  3. 此时通过0xFFFF0此处的BIOS代码检查RAM、键盘、鼠标、磁盘等硬件和IO设备(此处执行不通过则不会执行操作系统,代表硬件有问题)
  4. 然后读取磁盘0磁道0扇区位置的数据到0x7c00处(从磁盘读取到内存0x7c00处),磁盘0磁道0扇区(一个扇区512字节)处的数据即为引导扇区,存放着操作系统的引导程序
  5. 设置CS=0x07c0,IP=0x0000即指向地址0x7c00
  6. 读入引导扇区里的代码之后,操作系统的故事就从这里开始了
    在这里插入图片描述
    忽略本文段数据段等,关注核心代码,start开始后
    设置ax=0x07c0,ds=ax
    设置ax=0x9000,es=ax
    设置cx=256 (十进制256)
    si,di归零
    rep movw 重复执行移动直到cx归零,即移动256字节 源地址ds:si,目的地址es:di
    jmpi go, INITSET 间接跳转,意思就是跳转到go标签处的代码处
    此时start下面的这部分代码已经是移动到了0x90000处了
    在这里插入图片描述
    设置ds=0x9000,es=0x9000,ss=0x9000,sp=0xff00
    load_setup:设置dx=0x0000,cx=0x0002,bx=0x0200,ax=0x0200+setup长度
    ax寄存器高八位为ah,低八位为al,此时ax=0x02代表读磁盘,al为setup长度,代表读取的扇区个数
    同样cx分为ch和cl,dx分为dh和dl,此时读取的磁盘的位置为柱面号0开始扇区为2磁头号为0驱动器号为0,读取到的内存地址为es:bx=0x9000:0x0200=0x90200。
    载入setup扇区的代码后,就要跳出boot扇区的代码开始执行setup代码

在这里插入图片描述
INT 0x13 参数参考:https://www.cnblogs.com/AmitX-moten/p/4823598.html
功能号:AH = 08H
调用参数:DL = 驱动器号,ES:BX = 格式化参数表指针
返回参数:成功 ⇒ BL = 磁盘大小,CX中的0-5位存扇区数,CX中的6-15位存柱面号,DH/DL = 磁头数/驱动器数,ES:DI = 磁盘驱动器参数列表地址,失败 ⇒ AH = 错误码,CF = 1

Ok_load_setup:载入代码后,设置dl=0x00,ax=0x0800,执行中断0x13,获取磁盘参数
设置ch=0x00,将扇区数取出给sectors。
通过INT 0x10中断读取光标,再通过该中断显示#mesg1处内存中的字符(loading system…)(cx寄存器代表字符长度)
然后执行call指令,将CS和IP入栈,跳转到read_it处执行代码

在这里插入图片描述
setup模块后就需要进入system模块,此时需要从磁盘载入该模块。
通过条件转移指令,跳转ok1_read执行,jb代表jump below,此时应该是为了防止程序跳到system外。
ok1_read代码将磁盘扇区数赋给ax,用ax减去已读扇区数,此时的ax代表未读的扇区数,然后开始读磁道。
至此bootsect.s引导扇区的代码执行完毕,此时需要转入setup模块进行执行。

在这里插入图片描述
setup模块,进行系统的设置
此时首先取出鼠标位置,放入[0](间接寻址此时指向CS:IP+0=0x90000)
再取出内存大小放入[2],0x90002处
因为此时CS:IP最多指向的地址空间为1M因为地址位数为20位,2^20bit=1M
所以需要扩展内存
此时SYSSET=0x1000,操作系统的代码放在0x10000起始的位置,下面要整体挪动到0x00000
do_move 此时又要开始移动了,将system模块放到0地址处,此时可以解释为何上面要移动0x07c00的代码到0x90000,就是因为这里要放system的地址。
从ds:si地址 移动到es:di=0x00000处 移动0x8000字节
在这里插入图片描述

将CPU从实模式转入保护模式/32位模式,寻址方式发生改变,通过CS选择子选择GDT表中的地址+IP即为内存地址
在这里插入图片描述
转入保护模式之前,其实setup还做了一件事,就是建立GDT表,为后面改变寻址方式做准备
在这里插入图片描述
此时可以解释一下jmpi 0,8的意思,CS=8选择子查GDT表得到的结果是0x00000000 32位地址,寻址空间为4G,此时CPU可以寻址的空间从1M转到了4G

在这里插入图片描述
此时已经跳出setup模块正式进入了system模块,system模块的第一个文件就是head.s,此时的汇编为32位汇编,head.s做了一系列设置(堆栈、idt、gdt、设置地址线等)执行后需要执行main.c,转入C语言执行
在这里插入图片描述
通过压栈压入_main的参数 0,0,0,和main的地址(L6死循环地址),跳转到set_paging,执行完设置页表,弹出栈时,main函数的地址被弹出,此时执行main(0,0,0)
在这里插入图片描述
在这里插入图片描述
上述代码中for循环将内存的页表从0开始的地方设置一段为USED,这一段即为系统所在的地址。
end_men-start_men为剩余的内存的大小,end_men >>=12,end_men右移12位,代表除以4k,此时end_men代表剩余内存有多少页,而mem_map就代表一个数组,这个数组中记录着每个内存页是否被使用。
上述代码中start_men和end_men即从之前的汇编处可以得到,0x90000和0x90002。
通过main.c初始化完成后,操作系统即启动了。

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

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

相关文章

_linux 进程间通信(命名管道)

文章目录1. 创建一个命名管道2. 用命名管道实现server&client通信2.0 log.hpp打印日志信息2.1 comm.hpp(server.cc和client.cc共有文件)2.2 server.cc读取数据2.3 client.cc发送数据2.4 结果展示3. 还可以多个进程接收1. 创建一个命名管道 命名管道可以从命令行上创建&…

微服务介绍微服务环境搭建

一、微服务介绍 从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构--->微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。 微服务架构 微服务架构在某种程度上是面向…

机械原理复习试题及答案

机械原理 一、填空题: 1.机构具有确定运动的条件是机构的自由度数等于 。 2.同一构件上各点的速度多边形必 于对应点位置组成的多边形。 3.在转子平衡问题中,偏心质量产生的惯性力可以用 相对地表示。 4.机械系统的等效力学模型是具有 ,其上作…

Word文档中经常会遇到字体间距突然变得很大,怎么处理?

Word文档中经常会遇到字体间距突然变得很大,怎么处理? 目录 Word文档中经常会遇到字体间距突然变得很大,怎么处理? 1、如下图字体间距突然变大。 可能原因一: 1、选中该段文字,鼠标右键选择【段落 】 …

【882. 细分图中的可到达节点】

来源:力扣(LeetCode) 描述: 给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。 图…

进程替换与复制

目录进程替换基础知识什么是进程替换进程替换函数函数使用execlexeclpexecleexecvexecvpexecve进程替换基础知识 什么是进程替换 进程替换:把当前进程换为其他进程执行。(其他进程:创建新进程,生成可执行程序,装在进…

Android 13 Wi-Fi状态机流程及Log分析

本文基于Android 13源码解读,对Wi-Fi状态机调用流程进行梳理,并结合Log进行分析,便于大家理解Wi-Fi模块调用流程。 梳理出Wi-Fi状态机共有如下几种状态: mConnectableState mConnectingOrConnectedState mL2ConnectingState mL2ConnectedState mL3ProvisioningState …

【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

前言 大家好,我是阿光。 本专栏整理了《机器学习项目实战10例》,内包含了各种不同的入门级机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码数据集。 正在更新中~ ✨ 🚨 我的项目环境&#xff…

《计算机体系结构量化研究方法第6版》1.4 技术趋势

引入 1、以下五种技术是现代计算机实现所不可或缺的。 (1)集成电路逻辑技术。晶体管密度每年大约增加35%,相当于每4年翻两番。晶片大小的增长速度比较难以预测,也慢一些,增速为每年10%~ 20%。两者综合起来&#xff0c…

【Linux】CentOS 7安装 MySQL

1. 更改Centos YUM 源 1) 备份 yum 源配置文件 (在根目录下执行) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2)将官方的 yum 源换成阿里的yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo…

Day12--渲染二级和三级分类列表

1.动态渲染右侧的二级分类列表 我的操作: 1》在cate.vue中: 2》效果图: *********************************** *********************************** *********************************** 2.循环渲染右侧二级分类列表的 UI 结构&#xff1…

RabbitMQ快速入门

中间件&消息队列 中间件概述 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开…

你不能错过的【Python爬虫】测试3(爬取所有内容 + 完整源代码 + 架构 + 结果)

目录 一、主要工具包 以及 版本二、架构展示三、各部分code3.1 yjs.py (重要)3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py3.6 start.py四、结果展示一、主要工具包 以及 版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三、各部分code 3…

MySQL体系-日志与MVCC(源码层面)

MySQL 本身具备生产binlog日志的功能,在InnoDB存储引擎中,为了持久性有了redo log,为了原子性和隔离性有了undo log,最终通过redo log undo log 保证了一致性; 我先画一个InnoDB操作流程,先简单的了解下它们的工作机制…

基于S2SH的保险业务管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86467452 主要使用技术 SpringStruts2HibernateJSPJSCSSMysql 功能介绍 本系统旨在为当今的保险行业提供一套综合性的管理系统业务,系统的主要用户为保险的购买者以及系统的管理…

10.实用调试技巧

一、调试 1.调试的定义 调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。 2.调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产…

Linux系统编程(三)——Linux下的进程

第一篇中总结了系统的环境搭建,第二篇中学习了系统的一些IO函数,接下来就深入到了Linux下的进程线程的实现。 目录 0x01 进程概述 一、进程的信息 二、程序与进程 三、并行与并发 四、进程控制块PCB 0x02 进程状态转换 一、进程的状态 二、进程相…

【C++】哈希-bitset位图与模拟

目录 1.位图 1.1什么是位图 1.2位图的作用 2.bitset应用 2.1bitset构造 2.2bitset成员函数与使用 3.bitset模拟实现 构造函数 set reset test flip count size none,any 1.位图 在前文中我们介绍了哈希的一些内容,接下来我们介绍一个新奇的玩意&am…

回归问题原理

回归问题是一种常见的监督机器学习任务,在很多领域均有广泛应用。其典型应用包括销量预测、库存预测、股票价格预测、天气预测等。本问将讨论线性回归,包括线性回归模型的目标函数(损失函数和正则函数)、线性回归模型的优化求解、…

【一包通刷】晶晨S905L3A/B_完美AI语音线刷包_打开ADB_ROOT权限

【9.0一包通刷】晶晨S905L3A/B_完美AI语音线刷包_默认打开ADB ROOT权限支持游戏启动_万物互联启动动画 适用型号:M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、M411A等等; 系统版本:Android9 系统桌面:超…