有精通 Linux 内核内存管理的老哥能说说你是怎么学这一块的知识的吗?

2022-03-05 09:07:29 +08:00
 kgdb00
我在研究解决具体问题的时候看内核代码最容易看懂,但我目前还没遇到过哪些问题是必须得对内存管理非常熟悉才能解决的,学这个主要是想应付面试。

目前我已经看懂了《深入理解 Linux 内核》这本书讲内存的第 2 ,8 ,9 章以及 Intel SDM 讲分段分页的部分,想继续深入研究只能靠看代码了,但我感觉看代码没有个方向,泛泛的看就只能有个很浅的了解,不知道怎么看才能达到精通的程度。

我目前的办法是从 x86 系统启动的第一行代码开始看,搞懂每一行代码到底干了什么,最近看懂了一点 x86 bios (kvmtool 的实现)的代码,但我感觉这种方式学习效率太低了,请教大佬有没有什么好办法?
5956 次点击
所在节点    Linux
50 条回复
shayuvpn0001
2022-03-05 18:05:56 +08:00
@hello2090 振幅啊,频率啊,滤波器设计(高通滤波,低通滤波,带通滤波)

你不会以为模电只是电容电阻这些吧。。。
hello2090
2022-03-05 18:15:59 +08:00
@shayuvpn0001 这和物理有关吗?而且 我问的是 5 楼对楼主 linux 内存管理的回复,学编程是 数学 + 物理 -> 模拟电路 -> 数字电路 -> 组成原理 -> 汇编语言 -> C/C++ -> 操作系统, 你都已经范围缩小到 DSP 了

我也是 985 通讯本硕,模电数电通讯原理信号处理 DSP Verilog 都是专业课,这里面哪里有和物理有关的?振幅频率滤波器当然是数学啦。
detached
2022-03-05 18:19:19 +08:00
@documentzhangx66 不矛盾,正如你自己所说,Java 一门课肯定是学不到这么多东西。但是所有的问题仍然是在 computer science 这个学科范围内,并不会延伸到数学与物理。就算是对数学与物理有要求,也不过是高中或者大学一二年级通识教育中的内容。
shayuvpn0001
2022-03-05 18:39:13 +08:00
#16 @disk 我不觉得 DSP 和模电有关系。

@hello2090 我觉得我们还是不要继续讨论下去比较好。。。
basncy
2022-03-05 19:06:43 +08:00
做过相关工作, 抛砖引玉 https://www.zhihu.com/question/379177766
所谓内存管理, 大约是物理内存与虚拟地址之间的各种游戏规则.
iClass
2022-03-05 20:49:48 +08:00
看图并绘图 一张图片胜过千万行代码
xsen
2022-03-06 07:48:21 +08:00
你需要先看 X86 体系结构——主要是涉及内存部分,然后结合代码你才看得懂
简单点,Linux 内存管理部分可以当成是针对特定硬件(如 X86 )内存管理方面的驱动,那你就需要先阅读相应硬件的 datasheet ,不然很多概念你是无法理解的

体系结构相当是操作硬件的规范,那你要操作管理内存,自然要根据规范
documentzhangx66
2022-03-06 19:10:42 +08:00
@hello2090 我已经在前面举例子了,程序运行的性能问题,是如何产生的,你可以尝试逐层解析这个问题。

如果觉得这个话题太宽泛,那你可以研究一下,一条指令的性能,是怎么产生的。
hello2090
2022-03-06 19:17:17 +08:00
@documentzhangx66 那研究一条指令的性能,需要哪些物理知识呢?
documentzhangx66
2022-03-06 20:31:14 +08:00
@hello2090 你可能不太懂指令与物理知识之间的关系,所以建议你先研究试试。
hello2090
2022-03-06 21:00:26 +08:00
@documentzhangx66 你可以说说是哪方面的物理知识,我可以有的放矢嘛。热胀冷缩?速度加速度?作用力和反作用力?
documentzhangx66
2022-03-06 21:10:08 +08:00
@hello2090

请问你学过 C 语言吗?
hello2090
2022-03-06 21:23:04 +08:00
documentzhangx66
2022-03-06 21:33:02 +08:00
@hello2090
已知 int a = 0;
你有没有想过,对于 a++; 这行代码,每秒可以运行多少次,取决于什么?
hello2090
2022-03-06 21:48:56 +08:00
@documentzhangx66 取决于哪款 CPU ?而且还要考虑电脑是不是失重状态?加速度是多少? CPU 是 100%纯硅还是 99%硅? CPU 封装什么方式,阵脚散热性能够不够?太多知识点了

没想到一句 int i = 0; 蕴含了这么多体系化结构性思维

那 int i = 9 这行代码为什么在 X86 架构下运行速度比 int i = 0 快 0.00000781% 但是在 M1 下只快 0.00000663% 呢。确实架构的力量太有魔力了。

你看 就理解 int i = 0 的性能方面,我的物理知识够了吗?还有哪些方面需要补充。相对论我没好好学过,对我分析性能是不是影响比较大,我是不是该把这门课啃下来?
documentzhangx66
2022-03-06 22:30:07 +08:00
@hello2090
1.取决于哪一款 CPU ,并不重要。你可以选一款你最熟悉、最常见的 CPU 进行分析,比如就选择你现在上网用的电脑的 CPU 。

2.我说的不是 int a = 0;我说的是 a++; 因为这一行更简单,更容易分析。

3.你可以想想,对于你现在手头上的电脑,执行 a++ ,每秒可以运行多少次,它的底层是怎么运行的?
hello2090
2022-03-07 09:30:22 +08:00
@documentzhangx66 可你不是说需要物理知识才能分析吗?我就是想问问需要具备哪些物理知识啊,指点指点我吧!
documentzhangx66
2022-03-07 11:50:24 +08:00
@hello2090

别急,先看看我上一条评论。
hello2090
2022-03-07 12:50:04 +08:00
@documentzhangx66 没有物理知识你让我怎么想嘛,想不出来啊!
hhjuteman
2022-03-07 13:28:32 +08:00
既然你已经看了 ULK ,那么看代码已经是一个比较好的选择了。
https://www.kernel.org/doc/gorman/html/understand/

这里有一份材料,相比 ULK 更加深入的介绍了 mm 的各个部分,但因为材料基于 2.6 ,作为看代码的辅料进行。

https://github.com/chenshuo/linux-study

我这里推荐使用这个项目来学习 Linux 内核,这个项目抽离 Linux 代码,使得 Linux 可以像程序一样编译调试,这样看起来会更加的清晰。

后面是学习 Linux 内核最最最最重要的部分了:

学习 Linux 内核,到底是在学习什么?什么是 Kernel ,我的理解是内核是一系列算法和模型的集合,这些算法和模型是用来调配硬件的,调配硬件不一定要懂硬件模型,因为内核中的算法和模型集合抽象程度已经相当高了。

学习内核,及学习其中的算法,我举个例子,比如说学习 zfs ,我们吧 zfs 中的加到数据库的容灾中去,改造数据库,这是一个例子。比如说学习 mm ,mm 中的 slab 内存分配原理,再看看市面上另外优秀的内存分配算法实现,如 mimalloc ,从而定制更加精细的内存分配算法,这是一个点。你说从什么启动,什么 bootloader 开始学起,没有意义,舍近求远,因为 mm 和这些完全无关,这就是独立的算法和设计模块。很多市面上所谓的那种简易操作系统书,总喜欢大篇幅再 loader 上做文章,这也是舍近求远的做法。我们学习的是 modern os ,"modern"这个词至关重要。

你可以根据我给的第一个 link ,结合第二个连接源码看看 Nodes ,Zones ,TLB ,Slab 等等结构,更多的精细算法我就没研究过了,我研究过 net 和 ext 部分。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX