百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ahcoder 2025-02-09 11:13 54 浏览

哈喽,我是子牙,一个很卷的硬核男人 深入研究计算机底层、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+课时,每节课都超硬核,干货满满,欢迎前来咨询

?

相关推荐

linux服务器--PVE(一)简介及安装(pve安装ifupdown2)

1.PVE(ProxmoxVirtualEnvironment)简介ProxmoxVirtualEnvironment基于debian,是一个完整的、开源的企业虚拟化服务器管理平台。它在一个平...

手把手教你!如何在 Linux 服务器中搭建 Sentinel 环境?

你在Linux服务器上搭建Sentinel环境时,是不是也遇到过各种报错,要么是启动失败,要么是配置后无法正常访问控制台?看着同事顺利搭建好,自己却一头雾水,别提多着急了!其实,很多互联网大厂...

Linux高性能服务器技术总结(linux高性能服务器编程怎么样)

1服务器简介服务器是提供计算服务的设备,由于服务器需要响应用户请求,因此在处理能力、稳定性、安全性、可扩展性、可管理性等方面提出了较高要求。随着虚拟化技术的进步,云服务器(ECS)已经快速的在...

从 0 到 1:使用 Ansible 自动化运维 Linux 服务器全流程

Ansible是一款强大的IT自动化工具,广泛用于服务器配置管理、软件部署和任务自动化。本文将带你从零开始,学习如何使用Ansible对Linux服务器进行自动化运维,涵盖Ansibl...

诡异!Win11 “此电脑” 莫名现 Linux 图标,啥情况?

我这电脑出了个怪事儿,“此电脑”下面莫名其妙多了个Linux的图标,可我压根儿就没装过Linux系统啊!琢磨了一下,估计是系统可选功能里那个“适用于Linux的Windows子系统”插件搞的鬼。实例系...

Linux基础运维篇:Linux 终端与 Shell 基础(第006课)

一、啥是终端?先搞懂「人和电脑对话的窗口」你可以把终端(Terminal)理解成一个「文字版的电脑操作台」。在Windows里,类似「命令提示符」或PowerShell;在Linux里,...

2025罗技大师系列智「简」大赛-罗技大师系列-MX KEYS S键盘评测

在2025罗技大师系列智「简」大赛中,MXKEYSS键盘凭借其卓越的设计与智能化体验,成为众多创作者的理想之选。本篇文章将深入评测这款键盘的核心功能、使用体验及创新亮点,帮助你了解它如何提升...

Linux编辑命令vim(linux使用vim编辑文件)

1、vi编辑器简介vim是一个全屏幕纯文本编辑器,是vi编辑器的增强版,我们主要讲解的是vim编辑器。可以利用别名让输入vi命令的时候,实际上执行vim编辑器,例如:#定义别名...

全选是ctrl加什么?全选的快捷键是什么介绍

如何高效使用「全选」快捷键(Ctrl+A/A)提升工作效率在日常电脑操作中,"全选"是最基础却至关重要的功能之一。无论您是文字工作者、程序员还是普通用户,掌握全选快捷键都能极大提升操作...

Linux命令大全(linux命令大全书)

个人博客:https://chunyu.work/文章较长,可以收藏备用常用快捷键(1)ctrl+c:停止进程(2)ctrl+l:清屏(3)善于用tab键(4)上下键:查找执行过的命令文件目录类(...

Xshell是做什么用的?Xshell使用教程分享

Xshell是一款功能强大的终端模拟器,支持SSH1,SSH2,SFTP,TELNET,RLOGIN和SERIAL。通过提供业界先进的性能,Xshell包含了其他SSH客户端无法发现的功能和优势,作为...

Java 开发者线上问题排查常用的 15 个 Linux 命令

作为Java开发者,线上环境的问题排查是日常工作的重要组成部分。熟练掌握Linux命令能大幅提升排查效率,快速定位进程异常、日志错误、性能瓶颈等核心问题。本文结合Java应用特点,整理1...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

别再乱学 Linux 了!这 5 个核心技巧,让你效率飙升 10 倍!

在Linux学习的漫漫长路上,不少人犹如在黑暗中摸索的行者,四处碰壁,学习效果却不尽如人意。你是不是也曾在海量的Linux知识面前迷失方向,感觉自己投入了大量时间,却收效甚微?其实,掌握Li...

Linux终端神器Terminator时隔1年回归,2.1.5新版发布

IT之家5月23日消息,科技媒体linuxiac今天(5月23日)发布博文,报道称Terminator在沉寂一年后,最新发布了2.1.5版本,在分割终端窗格时支持克隆SSH...