从按下电源键到进入系统,CPU在干什么?
本专栏更新速度较慢,简单讲讲计算机的那些事,简单讲讲那些特别散乱杂的知识,欢迎各位朋友订阅专栏啊
感谢一路相伴的朋友们
浅淡操作系统系列第2篇
目录
通电
保护模式和实模式
内存管理单元MMU
逻辑地址?物理地址?
段与基址
执行
MBR
操作系统
结语
快捷翻页
参考文章
通电
只要一通电,电路就会启动自检工作,把所有的寄存器全部重置,如果哪里有异常的话,就会把错误记录到EAX寄存器中,如果发现EAX的值不是0,那就不好了
一般开机的时候寄存器的值长这个样子
EAX,EBX, ECX, ESI, EDI, EBP, ESP: 0x00000000
EFLAGS: 0x00000002
CS: 0xF000
EIP: 0xFFF0
······
CS和IP这两个寄存器会决定CPU一会从哪里执行代码
CPU一般都是工作在保护模式下,使用虚拟地址来访问内存,由内存管理单元MMU负责给转换成真实的物理地址
不过在刚刚开机的时候,虚拟地址翻译所需要的页目录、页表这些信息都还没准备好,MMU还没法工作,这时候只能使用16位的寄存器,工作在实地址模式下,使用段+基址的方式来和内存读写,最多只能使用1MB的内存空间
这里来解释一下刚才涉及的知识点
保护模式和实模式
这个对于完全不懂的人解释起来太复杂了,但按照惯例,先放干货(这里引用cqwei1987大佬的文章《实模式和保护模式的区别》):
实模式:
它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式。实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂(1M)的可访问内存空间(物理内存和BIOS-ROM),软件可通过这些地址直接访问BIOS程序和外围硬件。实模式下处理器没有硬件级的内存保护概念和多道任务的工作模式。但是为了向下兼容,所以80286及以后的x86系列兼容处理器仍然是开机启动时工作在实模式下。80186和早期的处理器仅有一种操作模式,就是后来我们所定义的实模式。实模式虽然能访问到1M的地址空间,但是由于BIOS的映射作用(即BIOS占用了部分空间地址资源),所以真正能使用的物理内存空间(内存条),也就是在640k到924k之间。1M地址空间组成是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:物理地址=左移4位的段地址+偏移地址。
实模式寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。
保护模式:
286处理器体系结构引入了地址保护模式的概念,处理器能够对内存及一些其他外围设备做硬件级的保护设置(保护设置实质上就是屏蔽一些地址的访问)。
保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
两者区别在cqwei1987大佬的文章中讲的很详细,这里举个简单易懂的例子:
保护模式就像一家高档餐厅,顾客在这里可以享受更加细致的服务和更加精致的美食。高档餐厅的菜品通常需要更多的时间和精力来准备,而且餐厅会为顾客提供更加周到的服务,确保顾客的用餐体验更加舒适和安全
实模式则像一家快餐店,顾客在这里可以快速地买到食物并离开。快餐店的菜品通常不需要太多的时间和精力来准备,而且餐厅也不会为顾客提供太多的服务。实模式下的计算机就像快餐店一样,可以快速地启动并运行程序,但功能和安全性都相对有限
内存管理单元MMU
内存管理单元是计算机硬件的一部分,负责处理CPU的内存访问请求
MMU是Memory Management Unit的缩写,有时也称作分页内存管理单元(Paged Memory Management Unit,PMMU)
MMU通过将逻辑地址转换为物理地址来实现内存管理。它通过将虚拟地址空间映射到物理地址空间,使得多个进程可以同时访问相同的物理地址空间,而不会相互干扰。MMU还负责内存的访问权限管理,确保程序只能访问其被授权访问的内存区域
MMU是现代计算机系统中的重要组成部分,它与CPU紧密配合,提高了系统的性能和安全性
逻辑地址?物理地址?
比如大家经常看到的,类似于:0x123456789abcdef0的就是逻辑地址
而物理地址则是二进制串,类似于:1010001001100001010011010111100001111111111010000
MMU的工作就是转换逻辑地址与物理地址
段与基址
段指的是内存中连续的存储区域,每个段的起始地址称为段基址,即此段从内存中的哪个地址开始存储。段基址是段的起始地址,但不是物理地址,它是一个线性地址
段基址通常有20位,但在某些操作系统中可能会被压缩到16位
段与基址的关系可以理解为,段是内存中连续的存储区域,而基址是段的起始地址
举个例子:段和基址的概念可以类比于现实中的地址索引方式
假设有一本书或者一篇文章,它被分为若干个章节,每个章节都是一个独立的段落,而每个段落都有一个起始页码。如果我们要引用这本书中的某个段落,我们通常会提供段落名称和页码,页码就是相对于该段落的起始页码的偏移量
例如,如果第一章的起始页码是10,而我们要引用第二章的某个段落,我们可以说“第二章第20页”,这里的20就是相对于第一章起始页码的偏移量
这种分段和偏移量的方式可以帮助我们更灵活地组织和引用文本内容,类似于计算机存储器中的段和基址的组织方式
执行
在开机的时候,内存刚刚通电,应该是空的吧?
在主板上,CPU旁边不远处有BIOS,BIOS是一个ROM芯片,一般一通电他就映射到地址空间中,按照CS:IP(0xF000:0xFFF0)
从F000:FFF0处,也就是0xFFFF0处取到的第一个地址一般是jmp到某处,一般是直接跳转到BIOS中央,BIOS会下达对主板上各单位进行检测,看看有没有异常情况,还有初始化CPU工作需要的中断向量表等等
而在这个时候,其他核心一般都不工作,只有一个核心工作,通常是1核,它会协助引导处理器加载硬件检测、内存初始化等
MBR
BIOS中的启动顺序第一位是硬盘,引导处理器会把第0盘第0道第1扇区的内容读取到了内存中的0x7C00位置,它叫做主引导记录MBR,一共512个字节
MBR是操作系统在安装的时候,写到硬盘里的。这个位置非常重要,假如有病毒占据了这个位置,解决办法只有重装系统
读取到了MBR后,要检查最后两个字节必须是0x55和0xAA,确认正常之后才能认为这是一个合法的MBR,这时会跳到了0x7C00的位置开始执行
操作系统
在操作系统上CPU会使用保护模式工作,MMU仍然没法做地址翻译工作,这时候CPU只能直接使用物理地址跟内存联系,把页目录和页表搞好MMU才可以
当启用内存分页后,MMU就会工作,CPU将可以使用虚拟地址访问内存了
在这之后其它核心就可以投入工作了
结语
作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
3000字,7个父项,2个子项,1个孙子项
快捷翻页
UNIX家族?Windows NT家族?一文讲清操作系统繁杂的家族史
参考文章
按下电源后的几秒钟,CPU在干嘛?
文心一言
相关文章:
从按下电源键到进入系统,CPU在干什么?
本专栏更新速度较慢,简单讲讲计算机的那些事,简单讲讲那些特别散乱杂的知识,欢迎各位朋友订阅专栏啊 感谢一路相伴的朋友们 浅淡操作系统系列第2篇 目录 通电 保护模式和实模式 内存管理单元MMU 逻辑地址?物理地址࿱…...
TypeScript初体验
1.安装编译TS工具包 npm i -g typescript 2. 查看版本号 tsc -v 3.创建ts文件 说明:创建一个index.ts文件 4.TS编译为JS tsc index.ts 5.执行JS代码 node index.js 6.简化TS的步骤 6.1安装 npm i -g ts-node 6.2执行 ts-node index.ts...
基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像
About Alpine(简介) Alpine Linux 是一款极其轻量级的 Linux 发行版,基于 busybox,多被当做 Docker 镜像的底包(基础镜像),在使用容器时或多或少都会接触到此系统,本篇文章我们以该镜…...
政府网站定期巡检:构建高效、安全与透明的数字政务
在数字时代,政府网站已不仅仅是一个信息发布窗口,更是政府与公众互动的桥梁、政务服务的主要渠道以及数字化治理的重要平台。因此,确保政府网站的高效运行、信息安全与透明公开就显得尤为重要。在此背景下,定期的网站巡检与巡查成…...
C++信息学奥赛1138:将字符串中的小写字母转换成大写字母
#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…...
leetcode1475. 商品折扣后的最终价格 【单调栈】
简单题 第一次错误做法 class Solution { public:vector<int> finalPrices(vector<int>& prices) {int n prices.size();stack<int> st;unordered_map<int, int> mp;int i 0;while(i ! prices.size()) {int t prices[i];if (st.empty() || t …...
macOS M1使用TensorFlow GPU加速
本人是在pycharm运行代码,安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速: import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…...
GNU-gcc编译选项-1
include目录 -I ,比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中,-D是一个编译选项&…...
【DEVOPS】Jenkins使用问题 - 控制台输出乱码
0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式,即作为Master节点的Jenkins只负责任务调度,具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…...
logback-spring.xml
<?xml version"1.0" encoding"UTF-8"?> <configuration> <appender name"stdout" class"ch.qos.logback.core.ConsoleAppender"> <encoder> <springProfile name"dev"> <pattern>%d{…...
华为OD机试之报文重排序【Java源码】
题目描述 对报文进行重传和重排序是常用的可靠性机制,重传缓中区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。 输入描述 输入第一行为N,表示子报文的个数,0 <N ≤ …...
回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)效…...
DPU在东数西算背景下如何赋能下一代算力基础设施 中科驭数在未来网络发展大会论道
以ChatGPT为代表的人工智能大模型的快速发展,对网络信息技术创新发展提出了新的挑战,我国东数西算重大工程也在加速布局。以确定性网络、算力网络为代表的未来网络核心技术,正成为决定未来经济和产业发展的关键。 8月23日,第七届…...
2021年12月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右…...
ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题
问题: 因未知原因Windows下的Server安装账户密码变更,但是又忘记了密码,导致,Server服务启动失败,错误1069: 解决方法: 在账户管理界面,重置对应的arcgis账户的密码,…...
React 面试题集锦
目录 如果想要在组件第一次加载后获取该组件的dom元素,应当在以下哪个生命周期中进行 React支持的键盘事件是 使用严格模式(Strict Mode)优点 React 动态引入组件 当使用ReactDOM.unmountComponentAtNode从DOM中卸载组件时 说一下useS…...
xargs命令解决“Argument list too long”
一、xargs命令概述 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。空格是其默认定界符,管道传递给xargs的输入…...
R语言中<- 的含义
一般语言的赋值是 号,但是 R 语言是数学语言,所以赋值符号与我们数学书上的伪代码很相似,是一个左箭头 <- : 举个例子: a <- 12 b <- 45 print(a b) 以上代码执行结果:57 这个赋值符号是 R …...
知识图谱Neo4j安装到实践全过程
前言: Hello大家好,我是Dream。 在本次实战中,我们将一起完成知识图谱Neo4j安装到实践全过程,探索其中的关系和属性。知识图谱是一种以三元组形式存储的数据结构,由实体、关系和属性组成,能够帮助我们更好地…...
贪心算法:简单而高效的优化策略
在计算机科学中,贪心算法是一种简单而高效的优化策略,用于解决许多组合优化问题。虽然它并不适用于所有问题,但在一些特定情况下,贪心算法能够产生近似最优解,而且计算成本较低。在本文中,我们将深入探讨贪…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
