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

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

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

我目前的办法是从 x86 系统启动的第一行代码开始看,搞懂每一行代码到底干了什么,最近看懂了一点 x86 bios (kvmtool 的实现)的代码,但我感觉这种方式学习效率太低了,请教大佬有没有什么好办法?
5926 次点击
所在节点    Linux
50 条回复
tinmody
2022-03-05 09:20:02 +08:00
我不是大佬,爱莫能助。。。
yuguorui96
2022-03-05 09:47:55 +08:00
纯粹应付面试完全没必要,也确实无法深入。真是有兴趣可以写个 demo 驱动,解决问题才能深入结构。
mons
2022-03-05 10:05:27 +08:00
documentzhangx66
2022-03-05 14:01:26 +08:00
如果你不懂数学,给你 RSA 、DES 、MD5 等加密解密与哈希算法的代码,你是看不懂的。代码,只是实现数据结构与控制流程的方法,至于为啥要设计这种数据结构、为啥要用这种流程,它与协议以及更底层的知识相关。比如驱动里的一些缓存大小、循环间隔时间,它与下层电路逻辑有关。

所以,你要学懂某一层次的东西,可能需要掌握其上层或下层的知识才行。

到此,有两种学习方式,一种是学院派的至下而上,比如 数学 + 物理 -> 模拟电路 -> 数字电路 -> 组成原理 -> 汇编语言 -> C/C++ -> 操作系统,另一种是自上而下,比如以某种编程语言为主,来教你网络编程的书籍。两种学习方法各有优缺点,选择你喜欢的方式就好。
hello2090
2022-03-05 15:03:45 +08:00
@documentzhangx66 同学,你这就夸张了,还要物理?模电?模电就那点电容电阻啊,和编程有啥关系?
disk
2022-03-05 15:16:23 +08:00
@hello2090 面向硬件编程也是编程。。。
hello2090
2022-03-05 15:23:32 +08:00
@disk 那需要物理模电知识吗?
detached
2022-03-05 15:52:37 +08:00
@documentzhangx66 现代计算机之所以能够如此高速的发展,起着重要作用的一个概念就是抽象( abstraction )。抽象就是为了把你从“无用”的数学、物理中解脱出来,聚焦于更 specific 、subject-oriented 的问题。所以你不需要掌握“上层、下层”的知识,你只需要明白下层为你提供的接口与描述清楚你为上层提供的接口,例子:TCP/IP 网络结构。
disk
2022-03-05 15:58:21 +08:00
@hello2090 有些需要,特别是 dps 那块。
disk
2022-03-05 15:58:40 +08:00
@disk dsp
thedrwu
2022-03-05 16:03:44 +08:00
自己写一遍 x86 进保护模式、设置分页的 demo ,再回头看
documentzhangx66
2022-03-05 16:23:13 +08:00
@hello2090 举一个例子,程序运行的性能问题,是如何产生的。
documentzhangx66
2022-03-05 16:30:59 +08:00
@detached
站在工作分工与快速入门的角度来看,您说的很对。

但如果是站在学习的角度,想学地透彻,就需要去学习其发展史,需要学习底层的构成,需要了解其上层的发展、应用与案例。

举个简单的例子,java 程序员,去学习如何操作文件。从您的角度来说,去谷歌一下 java 文件 io 的相关例子与代码,就能学懂。但是,当 java 同时操作海量文件时,当 java 操作不同设备上的文件时,当 java 通过不同渠道操作文件时,当 java 绕着地球一圈操作文件时,所产生的的各种性能问题、各种错误问题,要分析这些问题,如何产生,能否解决,如何解决,各种解决方案的代价如何,这就不仅仅只是 java 这一门课程能学到的。
wzxlovesy
2022-03-05 16:42:33 +08:00
如果从 Linux 开始太难入手的话,我推荐从 kvm-unit-tests 开始看。这个项目实现了一些内核里重要的功能,用于启动虚拟机后运行测试代码。

这些功能的实现很大程度上来源于 Linux 内核,从这里你可以快速学到 page table, tlb 等等基础知识。

大致搞懂之后再去看 Linux 会容易很多。
hello2090
2022-03-05 16:46:20 +08:00
@documentzhangx66 用得到什么物理知识?
hello2090
2022-03-05 16:47:24 +08:00
@disk 我不觉得 DSP 和模电有关系。
Suddoo
2022-03-05 17:12:56 +08:00
@documentzhangx66 感觉这块跟公司里写业务代码是一样的,如果不清楚需求的话,根本不明白为什么这么写,所以,光看代码,没用的
shayuvpn0001
2022-03-05 17:25:08 +08:00
@hello2090 做过音频处理,射频处理,特别是通信系统里面的东西就知道了。同一个降噪算法,可以用纯模拟电路,ADC 然后 ASIC ,DSP 编程,FPGA+Verilog ,CPU+软件来实现,各种实现路径如何取舍。不仅要考虑效果,还要考虑性能,成本。
hello2090
2022-03-05 17:47:22 +08:00
@shayuvpn0001 那这里哪个需要物理呢?物理里的哪些知识呢?热胀冷缩吗?
crackhopper
2022-03-05 18:02:56 +08:00
个人提供一个思路(我不是这个方向大佬):必须得想办法能调试系统,你才能更深入的理解。比如,在虚拟机中,通过日志调试或断点调试:比如创建堆上内存的系统调用这个场景下,在系统内核的相应代码中打印堆栈(或者用调试器打断点,我不清楚是否可行,可以自行查阅)。从堆栈中分析执行流程。从整体上建立一个认知,再去逐步看代码。看的过程中,自己加日志代码打印自己的猜想和理解。

上来就用纯阅读的模式看代码,确实低效。

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

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

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

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

© 2021 V2EX