研究Linux内核的乐趣

news/2024/11/29 4:51:46/

对Linux的内核学习和研究的越多,越觉得其乐无穷。因为Linux内核的代码是由这二三十年来,世界上顶尖聪明的一群人编写的,为提高效率而做的各种设计和算法,充满着智慧的光芒。有时,在理解这些设计和算法的过程中,就像在做思维体操。

Linux操作系统是一个世界,去探索这个世界,知道它为何要这么设计,能满足人的好奇心、求知欲。有时看到一个精妙的设计,真的很想让更多的人也领略到,就像你看到了一处绝美的风景,也想让身边的人都能一睹。

有很多长跑爱好者,以跑步为快乐,以参加各种马拉松赛事为目标,这可能不被一部分人所理解。跑步多累啊,跑个一千米都那么累,别说十公里,更别说马拉松了。可是,据科学研究表明,在跑到一定的时间和距离后,人体内就会分泌内啡肽,让人镇静和愉悦。可是,如果你不经历前面那几千米相对难受的阶段,就没法体会到这种特殊的感觉。

这就像探索Linux内核一样,如果你不掌握hash表,workqueue等基础的数据结构和组件,你就无法理解众多的代码是如何实现的。一个模块的数据结构看起来枯燥,但往往是理解这个模块的入口。而当你掌握了一些基础的组件,你就可以理解一些简单的模块,在理解这些模块的过程中,又可以学会一些更综合的组件,进而理解更复杂的模块。

当你可以不借助别人的解释,仅仅通过代码和必要的注释,就能基本理解一个模块大概在做什么,为什么要这么做,就能感受到一些乐趣。稍微复杂一点的代码看多了,再去看一些相对简单的代码,就会觉得更轻松。就像那些跑过马拉松的,平时跑个三千米对他们来说只能算是热身。

读书也好,看代码也罢,真正感兴趣的东西,根本用不着坚持,常年的做下去,是很自然而然的。不给你钱你也愿意做的事,才能持久。除了日常的工作,人是需要一点长久的兴趣爱好的,在你闲下来的时候,才不会因为找不到事做而无聊空虚。

操作系统是软件,但它和硬件的联系是非常多的。如果你不了解CPU,那么你可能都分不清Linux的哪些模块其实是依托于硬件的。没有硬件的MMU,软件的page table就难以实施,虚拟地址就不易实现;不懂cache,就无法理解多核环境下的原子操作,以及spinlock等各种同步机制的原理……所以,对CPU基本的掌握对理解操作系统是很必要的。

目前主流的处理器架构主要是x86和ARM,提到x86的手册,一般会说到Intel的SDM(Software Developer’s Manual),SDM有2个版本提供,一种是有4个volumes的,一种是有10个volume的,其实它们的内容是一样的,4个volumes的是分1, 2, 3, 4,10个volume的是细分为1A, 1B, 2A, 2B, 2C,2D, 3A, 3B, 4A, 4B。

SDM全加起来好几千页,不可能都去读,也没必要都读。volume 1是概括性的描述,适合总览,volume 3是对各部分功能更detailed的描述,平时翻看频率最高。而volume 2是讲解指令的,就像字典一样,需要了解指令具体用法的时候才需要查阅。

还有一家做x86的公司AMD,它同样有一份针对x86-64的文档,叫AMD64 Architecture Programmer’s Manual ,分为两个volumes,volume 1是概述,volume2更详细。我个人的体会是,AMD的这份文档比Intel的SDM更容易理解,配图也更丰富。

至于ARM,以v8为例,基础的是Programmer’s Guide for ARMv8-A,更详细的就是ARM Architecture Reference Manual ,分别相当于Intel的volume 1的volume 3。描述指令的文档是ARM A64 Instruction Set Architecture,对应于Intel的volume 2。随着v8架构的演进,从v8.0到v8.5,还有相关的Reference Manual Supplement,介绍每个version新增的特性。


http://www.ppmy.cn/news/64872.html

相关文章

前端常用的一些编辑器库

在 Vue3 TypeScript 中可以使用一些第三方库来实现代码文本编辑器,以下是一些常用的库: CodeMirror:一个灵活、易于集成的代码编辑器,支持多种语言和主题。 Monaco Editor:由微软开发的高性能代码编辑器,支…

消息队列的实现

【前言】 游戏的主逻辑一般是单线程的,所以实现一个消息队列很简单,不像互联网开发中会涉及多线程、多进程。可以先看看这篇文章。 对回调函数和消息机制的理解_消息回调函数_永恒星的博客-CSDN博客 这里尝试先去分析一些要素,然后直接基于…

如何从小白成长为一名运维专家

运维是系统管理和维护的一部分,要从小白成长为一名运维专家,需要不断学习、实践和积累经验。以下是一些建议,可以帮助您从小白成长为运维专家。 1、学习基础知识:掌握计算机基础知识,如操作系统(如Linux、Windows等)和…

2023 年第八届数维杯数学建模挑战赛 赛题浅析

为了更好地让大家本次数维杯比赛选题,我将对本次比赛的题目进行简要浅析。本次比赛的选题中,研究生、本科组请从A、B题中任选一个 完成答卷,专科组请从B、C题中任选一个完成答卷。这也暗示了本次比赛的难度为A>B>C 选题人数初步估计也…

多尺度深度特征(上):多尺度特征学习才是目标检测精髓(干货满满,建议收藏)...

计算机视觉研究院专栏 作者:Edison_G 深度特征学习方案将重点从具有细节的具体特征转移到具有语义信息的抽象特征。它通过构建多尺度深度特征学习网络 (MDFN) 不仅考虑单个对象和局部上下文,还考虑它们之间的关系。 公众号ID|ComputerVisionG…

Cadence技巧总结学习(DRC、Annotate)持续更新~

Cadence技巧总结学习持续更新~ 你还可以再哪里看到这篇文章:知乎 1. 画叉 对于芯片上不用的引脚信号画上号,如下: 按大写X就可以了,或是双脚引脚,在跳出的界面中,Is No Connect上✔。 2. 画线快捷键&#…

IPC:匿名管道和命名管道

一 管道初级测试 写两个小程序&#xff0c;一个负责向管道发数据&#xff0c;一个从管道接收数据&#xff1b; pipe.cpp #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } pipe2.cpp #inclu…

C++类和对象(6)

类和对象 1.在谈构造函数1.1. 构造函数体赋值1.2. 初始化列表1.3. explicit关键字 2. static成员2.1. 概念2.2. 特性 3.友元函数3.2.友元类 4. 内部类5.匿名对象6.拷贝对象时的一些编译器优化7.再次理解类和对象 1.在谈构造函数 1.1. 构造函数体赋值 在创建对象时&#xff0c…