这样才能玩转Linux内核之CPU篇

news2024/9/25 21:30:51

哈喽,我是子牙,一个很卷的硬核男人 深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了三个课程:手写JVM、手写OS及带你用纯汇编写OS、手写64位多核OS及Linux内核… 上篇文章给大家分享了:Linux内核这样学才能学会之内存篇,收到了很多小伙伴的反馈,表示自己研究Linux内核很迷茫,很多代码看不懂,不知道是干啥的,需要这样的文章指明方向。今天带来的是它的兄弟篇:CPU篇

研究CPU的正确姿势

关于CPU,其实大家研究得很少,无非是:线程开销大,开销源于用户态切内核态、研究并发的时候,会研究到CPU的缓存一致性协议MESI与MOESI、有些感兴趣的小伙伴会去研究CPU的执行引擎与流水线、还有一些无法证明的概念:分支预测、乱序执行、happens-before、as-if-serial……

研究这些东西跟看懂Linux内核源码有关系吗?有,但是这些东西都是任务切换与线程并发控制那块的,所以研究明白了也只能看懂多线程及并发控制相关的代码,Linux内核启动代码、初始化CPU核及激活CPU核的代码还是看不懂。

而且因为这些都是发生在CPU内部,不好做实验证明,所以小伙伴们在研究的时候,其实也不确定自己是否真的懂了。如何证明呢?手写一个OS,无其他办法

对于一个OS来说,CPU就这么点东西吗?显然不是。要知道,CPU是大脑版的存在。可以这样说,OS是面向CPU提供的机制实现出来的

那CPU还有哪些东西需要研究呢?如果是研究多线程,就是研究上面说的这些。但是孤立的研究上面这些,其实也看不懂,因为这些是CPU的后半段,前半段包括:

1.CPU的运行模式

2.CPU核的初始化

3.CPU核的激活

4.CPU核的亲和性设置

5.CPU的特权级 就是说,你把上面这些研究明白了,Linux内核的启动代码、初始化CPU核的代码、设置CPU亲和的代码、激活CPU核抢占任务的代码,你才能看懂。有了这些CPU前置知识,多线程及并发控制相关的代码,才能真正意义上的理解。以及CPU读写数据、执行代码背后做了哪些事情,你才能如数家珍一样将它讲出来 接下来,follow me,听我娓娓道来

CPU运行模式

我们打开电脑,到看到可以交互的图形界面,其实这个过程中,OS代码经历了CPU的多种运行模式切换。如果是32位CPU,OS只经历了由实模式切入保护模式。如果是64位CPU,就复杂很多:先由实模式切入保护模式,再由保护模式切入IA32-e兼容模式,再进入正统的64位长模式。即经历了3次CPU模式切换

关于CPU的运行模式,如果你想详细了解,请看下图。系统管理模式为什么没讲?因为我们正常研究Linux内核机制,看不到这玩意,感兴趣的小伙伴可以自行chatgpt

不管是32位CPU,还是64位CPU,起始运行模式都是实模式。区别是,如果是32位CPU,OS代码中只需要做到让CPU由实模式进入保护模式就可以了。说白了就是只需要进行一次CPU模式的切到,代码类似于

如果是64位CPU,经历了三次CPU运行模式切换。由实模式切入保护模式的代码跟上面一样,由保护模式进入IA32-e模式,代码类似于:

由IA32-e兼容模式进入长模式,写法有两种,我都列出来,方便你到时看Linux内核源码能看懂 后面的代码就是在兼容模式下运行了

所以想玩明白64位CPU,就得先玩明白32位CPU,因为由于历史原因,64位CPU的很多机制不是凭空产生的,而是在32位CPU的基础上发展来的。不了解古今,何以只当下 如果是多核CPU,上面的代码其实只是让一个CPU核进入了长模式,其他CPU核还处于实模式,需要BSP(Bootstrap Processor)核给所有AP(Application Processor)核发送IPI(Inter-Processor Interrupt)信号,让这些核去执行初始化操作,进入长模式,代码类似于

所以你看,如果你不了解这个知识点,那Linux内核的启动代码你就看不懂。启动代码看不懂,就不知道Linux内核在启动的时候做了哪些初始化操作,那后面各大模块的代码要么看不懂,要么读起来非常吃力,前后没办法关联起来理解

用户态切内核态

上面说的是CPU的运行模式,下面再谈谈CPU的特权级。CPU运行模式相信你看了上一啪应该已经基本了解了吧(瓦特?还不了解!那我就打个比方,实模式相当于你刚出生,保护模式相当于你长大了,IA32-e模式相当于你有两把刷子了,长模式相当于你成熟了),那如何理解CPU的特权级呢?

相信你肯定听过用户态、内核态,这个就是由CPU的特权级引申出来的。如图,CPU被设计成四个特权级:r0、r1、r2、r3,数字越大,权限越小。我们都知道OS内核需要有最高权限,所以运行在CPU的0特权级。r1、r2没用。我们的用户程序运行在CPU的3特权级

所以你可以这样理解,CPU的0特权级,就是我们常说的内核态。CPU的3特权级,就是我们常说的用户态。我们常说的用户态切内核态,其实说的就是编码实现CPU由3特权级切入0特权级。当在内核态将任务执行完,这时候一般说回到用户态,而不会说内核态切用户态 那关于态的切换,CPU提供了哪些方式呢?三种:

1.CPU的门机制:中断门、调用门、任务门、陷阱门

2.x86架构下的sysenter与sysexit

3.x64架构下的syscall与sysret 这个就不展开讲了,感兴趣的自行研究。这些东西研究明白,用户态切内核态相关的代码、系统调用相关的代码、中断处理相关的代码就可以看懂了

上面说的是主动触发由用户态切内核态,其实还有被动的,比如:

1软中断如除零异常、调试中断、内存错误…

2硬中断如键盘鼠标触发、读写硬盘上的数据、网卡有数据包到来… 那自实现OS的时候,代码层面是如何体现CPU特权级的呢?是由CPU的段机制控制的

与DPL关联的,还有两个名词:CPL、RPL。DPL设置的是访问内核段的条件,得有东西和它比较,就是CPL,那CPL从哪来?取值自RPL。这块你可能听不懂了。所以其实研究Linux内核,最难的是研究CPU,因为讲CPU的书几乎没有,大家都是啃Intel手册啃出来的

CPU如何读写数据

接下来我通过一个案例,把前面讲的所有知识点串起来,让大家能够更清晰的了解CPU是如何利用这些机制运行的。考虑到大家的基础,以32位CPU为前提吧。

当我们按下开机键,这时候CPU处于实模式下运行。我们自实现OS的时候,这时候要做的事情就是准备好让CPU进入保护模式需要的所有数据。我们自实现OS如此,Linux内核、Windows内核,乃至所有运行在Intel CPU上的OS,都需要这样做。这就是学底层一通百通的本质所在

进入保护模式以后,我们需要设置页表,开启虚拟内存分页模式。这时候的CPU的环境是:开启虚拟内存分页模式下的保护模式。这时候在读写数据的时候,CPU中的段部件、页部件需要参与进来

再详细点,当我们代码中有读写内存的代码时,无论你是什么语言,最终一层一层向下编译,到CPU层面,就是这样。其实CPU执行的是机器码,这里为了让大家能看懂,我用的是汇编

代码的意思就是将虚拟地址为0x1100处的内存中的数据读入寄存器eax。接下来我展开讲讲这个过程

当我们让CPU读数据的时候,CPU会这样一步步实现:

1.读数据操作的是数据段,所以CPU会从cs段寄存器中取到段选择子,从段选择子中解析出RPL、数据段描述符在GDT表中的索引。这个时候的RPL就是CPL,即CPU的当前请求特权级

2.拿着索引去GDT中拿到数据段描述符,进行一系列的验证,这个验证我就不展开了,我们这里假设验证通过,就可以计算出线性地址=base+0x1100。到这里,段部件的工作就结束了

3.CPU拿到线性地址,需要读cr3寄存器,拿到当前进程的页表地址,一层一层解析,最后计算出真实的物理地址。这中间其实还有很多小部件参与工作,比如高速缓存器、TLB

4.当CPU拿到物理地址,就可以去读内存了,然后写入CPU内部的eax寄存器

这个过程中有很多新名词,给大家准备好了

看到这里,你是什么样的心情呢?这个人怎么这么牛哇(玩笑玩笑)!我怎么这么菜呀(太真实了有木有)!我也想有这样的技术实力!送给你卖油翁的:无他,唯手熟尔。需要学习哪些东西我已经告诉你了,学习的节奏通过这个案例你应该也能看出来,自己找资料学习吧。当然,也欢迎你跟我学习,如果你感兴趣,你能坚持

enjoy·题外话

我们的实战Linux内核小班还在招生,文章中讲到的所有关于CPU的知识点都会讲到,并且会提供实战环境,告诉你做实验的思路,让你彻底掌握。

为了保证课程质量,所有课程内容由子牙老师亲自授课!整个课程大概三个月左右,50+课时,每节课都超硬核,干货满满,欢迎前来咨询

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

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

相关文章

【AutoLayout案例04-游戏图片-按钮适配 Objective-C语言】

一、好,我们再看一个案例, 刚才,这个案例, 这么一个案例 这个案例,是什么意思呢, 这里给大家做一个3.5英寸、4.0英寸的屏幕适配, 因为我们这里图片,只有一个,就是4英寸的这么一个图片 什么意思呢,要求我们在3.5英寸的屏幕、和4英寸的屏幕的时候,都能正常显示这个图…

从零开始的Hadoop学习(一) | 大数据概念、特点、应用场景、发展前景

1. 大数据概念 大数据(Big Data):指 无法在一定时间范围 内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的 海量、高增长率和多样化 的 信息资产。 大数据主要解决,海量…

创新生物药-创新药物研发-发展趋势分析(一文看懂)

随着科技的不断进步和生物医学领域的快速发展,生物创新药研发成为了推动医学进步和改善人类健康的重要领域。目前生物药包含了蛋白类药物、基因疗法、抗原、细菌、病毒、真菌、酵母、生物类似药、外泌体药物、免疫疗法、可溶性受体、克隆技术、微生物技术等药物&…

【Cortex-M3权威指南】学习笔记1 - 概览与基础

介绍 三种主流 Cortex 款式 款式 A:设计用于高性能的“开放应用平台” 款式 R:用于高端的嵌入式系统,尤其是那些带有实时要求的 款式 M:用于深度嵌入的,单片机风格的系统中 指令集发展 ARM 处理器一直支持两种形式上…

10个最好的云GPU服务

随着深度学习、人工智能和机器学习等新技术的出现,云 GPU 的需求量很大。 GPU(图形处理单元)是专用处理器,用于处理计算机图形和游戏等活动所需的大量数据集和复杂计算。不过,它们现在对人工智能(A.I.&…

我们在深圳聊了聊娱乐产品怎么“玩”!

伴随着移动互联网的普及,国内娱乐社交产品呈现出多元化发展趋势。 根据相关调研显示,一般普通用户通常会同时选择至少 3 款同类娱乐社交应用作为日常休闲、社交工具。可以说,各类垂直赛道聚集了大量新老“玩家”。 在如此激烈的竞争环境下&am…

Openlayers实战:启动、取消事件的监测

在Openlayers的实际项目中,我们会用到各种地图事件,比如click,dblclick,change,loadstart … 监测的时候往往用on(‘事件名称’,回调函数)来操作,但是取消这些事件的监控怎么做呢,请参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师…

Java百度提前批面试题

今天分享百度提前批的 Java 后端开发面经,整体上考察的点挺多的,主要重点考察了网络i/o、网络协议、linux系统、mysql,Java 问的不多,可能是百度的后端开发的语言不是主要以 Java 为主,所以重点看面试者的计算机基础是…

删除重复记录但保留其中一行数据的sql写法

欢迎关注微信公众号:互联网全栈架构 数据库表中存在重复记录的场景并不罕见,导致这种情况的原因可能是进行了数据迁移,或者程序代码有bug(比如并发情况没有处理好),或者在测试库中手动插入了重复数据&#…

问道管理:证券代码是什么?有什么用?

交流炒股经历时,有些股民一时忘了股票发行公司的全称,会直接报一串数字来代替,这串数字的内容是证券代码,那么,证券代码是什么?它又起什么作用?关于这些,为大家准备了以下参考内容。…

Python-主线程控制子线程-4

需求:在Python-主线程控制子线程-3的基础上,新增使用UDP接收指令功能,代替从键盘输入指令 # 修改后的程序,主线程可以获取子线程的结果 import threading import time import queue import tracebackfrom loguru import logger i…

齐聚众力,中国移动以“百川”定乾坤

近日,由工业和信息化部、宁夏回族自治区人民政府主办的2023中国算力大会在宁夏银川举办。中国移动党组书记、董事长杨杰参加开幕式,并在大会主论坛作题为《算网筑基锻引擎 数实融合创未来》的主旨演讲。在演讲中,杨杰表示:未来&am…

牛客OJ 把字符串转换成整数

⭐️ 题目描述 🌟 O链接 https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId13&&tqId11202&rp6&ru/activity/oj&qru/ta/coding-interviews/question-ranking 思路: 首先需要检查第一位是否有符号位&#x…

【EA-ISET协会】Elsevier|2区智慧农业类SCIEI, 进展顺,3个月左右录用~

一、期刊简介 2区智慧农业类SCI&EI 【期刊简介】IF: 3.0-4.0, JCR2区, 中科院4区; 【检索情况】SCI&EI双检,正刊; 【终审周期】走期刊部系统,3个月左右录用; 二、征稿范围 大数据和遥感技术在智慧农业中…

Blender文件云端GPU渲染

本文介绍如何在 GPU云平台vast.ai 上渲染Blender动画的技术指南,假设你已使用 vast.ai 并知道如何启动实例,这里的重要步骤是为实例选择正确的映像。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 使用 nvidia/cuda:11.4.1-cudnn8-devel-ubuntu2…

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…

AI教学赋能计划(大模型特辑)2023秋季学期启动申请!

AI教学赋能计划是由百度飞桨发起&#xff0c;面向高校提供产教融合人才培养方案&#xff0c;一站式助力高校复合型人才培养&#xff0c;截至目前已经培养5200名AI专业师资&#xff0c;助力484所高校开设人工智能与AIX特色课程。 2023年随着文心一言等预训练大语言模型发展&…

中国平台软件市场研究报告:OceanBase为金融行业国产分布式数据库销售额第一

近日&#xff0c;《2022-2023年度中国平台软件市场研究报告》&#xff08;以下简称“报告”&#xff09;发布&#xff0c;报告对包括数据库、操作系统等在内的平台软件市场发展进行了分析。报告指出&#xff0c;在对平台软件需求增长最快的金融行业&#xff0c;OceanBase已占据…

一文看懂 ISP pipeline

文章目录 概述什么是ISPISP实现方案 ISP PipelineISP输入行缓冲数据对齐 难理解的关键算法WDR图像压缩色调映射 Tone MappingRAW域处理镜头阴影校正 LSC降噪&#xff1a;空域滤波器 Spatial FilterBayer Demosaic 概述 什么是ISP 主流的CMOS和CCD sensor基本都是输出Bayer Mo…

金佰利Kimberly-Clark直连EDI解决方案

Kimberly-Clark 金佰利是全球健康卫生护理领域的领导者。 成立于1872年的金佰利公司是全球健康卫生护理领域的行业领导者。个人健康护理用品、家庭生活用纸和商用消费产品是金佰利公司三大核心业务。金佰利在全球35个国家设有生产设施&#xff0c;产品销往超过175个国家和地区…