2

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

 2 years ago
source link: https://www.v2ex.com/t/838115
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Linux

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

  kgdb00 · 11 小时 51 分钟前 · 1683 次点击
我在研究解决具体问题的时候看内核代码最容易看懂,但我目前还没遇到过哪些问题是必须得对内存管理非常熟悉才能解决的,学这个主要是想应付面试。

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

我目前的办法是从 x86 系统启动的第一行代码开始看,搞懂每一行代码到底干了什么,最近看懂了一点 x86 bios (kvmtool 的实现)的代码,但我感觉这种方式学习效率太低了,请教大佬有没有什么好办法?
26 条回复    2022-03-05 20:49:48 +08:00

tinmody

tinmody      11 小时 39 分钟前

我不是大佬,爱莫能助。。。

yuguorui96

yuguorui96      11 小时 11 分钟前 via iPhone

纯粹应付面试完全没必要,也确实无法深入。真是有兴趣可以写个 demo 驱动,解决问题才能深入结构。

documentzhangx66

documentzhangx66      6 小时 57 分钟前   ❤️ 4

如果你不懂数学,给你 RSA 、DES 、MD5 等加密解密与哈希算法的代码,你是看不懂的。代码,只是实现数据结构与控制流程的方法,至于为啥要设计这种数据结构、为啥要用这种流程,它与协议以及更底层的知识相关。比如驱动里的一些缓存大小、循环间隔时间,它与下层电路逻辑有关。

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

到此,有两种学习方式,一种是学院派的至下而上,比如 数学 + 物理 -> 模拟电路 -> 数字电路 -> 组成原理 -> 汇编语言 -> C/C++ -> 操作系统,另一种是自上而下,比如以某种编程语言为主,来教你网络编程的书籍。两种学习方法各有优缺点,选择你喜欢的方式就好。

hello2090

hello2090      5 小时 55 分钟前

@documentzhangx66 同学,你这就夸张了,还要物理?模电?模电就那点电容电阻啊,和编程有啥关系?

disk

disk      5 小时 42 分钟前

@hello2090 面向硬件编程也是编程。。。

hello2090

hello2090      5 小时 35 分钟前

@disk 那需要物理模电知识吗?

detached

detached      5 小时 6 分钟前

@documentzhangx66 现代计算机之所以能够如此高速的发展,起着重要作用的一个概念就是抽象( abstraction )。抽象就是为了把你从“无用”的数学、物理中解脱出来,聚焦于更 specific 、subject-oriented 的问题。所以你不需要掌握“上层、下层”的知识,你只需要明白下层为你提供的接口与描述清楚你为上层提供的接口,例子:TCP/IP 网络结构。

disk

disk      5 小时 0 分钟前

@hello2090 有些需要,特别是 dps 那块。

disk

disk      5 小时 0 分钟前

@disk dsp

thedrwu

thedrwu      4 小时 55 分钟前 via Android

自己写一遍 x86 进保护模式、设置分页的 demo ,再回头看

documentzhangx66

documentzhangx66      4 小时 36 分钟前

@hello2090 举一个例子,程序运行的性能问题,是如何产生的。

documentzhangx66

documentzhangx66      4 小时 28 分钟前

@detached
站在工作分工与快速入门的角度来看,您说的很对。

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

举个简单的例子,java 程序员,去学习如何操作文件。从您的角度来说,去谷歌一下 java 文件 io 的相关例子与代码,就能学懂。但是,当 java 同时操作海量文件时,当 java 操作不同设备上的文件时,当 java 通过不同渠道操作文件时,当 java 绕着地球一圈操作文件时,所产生的的各种性能问题、各种错误问题,要分析这些问题,如何产生,能否解决,如何解决,各种解决方案的代价如何,这就不仅仅只是 java 这一门课程能学到的。

wzxlovesy

wzxlovesy      4 小时 16 分钟前 via Android

如果从 Linux 开始太难入手的话,我推荐从 kvm-unit-tests 开始看。这个项目实现了一些内核里重要的功能,用于启动虚拟机后运行测试代码。

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

大致搞懂之后再去看 Linux 会容易很多。

hello2090

hello2090      4 小时 12 分钟前 via iPhone

@documentzhangx66 用得到什么物理知识?

hello2090

hello2090      4 小时 11 分钟前 via iPhone

@disk 我不觉得 DSP 和模电有关系。

Suddoo

Suddoo      3 小时 46 分钟前

@documentzhangx66 感觉这块跟公司里写业务代码是一样的,如果不清楚需求的话,根本不明白为什么这么写,所以,光看代码,没用的

shayuvpn0001

shayuvpn0001      3 小时 34 分钟前   ❤️ 1

@hello2090 做过音频处理,射频处理,特别是通信系统里面的东西就知道了。同一个降噪算法,可以用纯模拟电路,ADC 然后 ASIC ,DSP 编程,FPGA+Verilog ,CPU+软件来实现,各种实现路径如何取舍。不仅要考虑效果,还要考虑性能,成本。

hello2090

hello2090      3 小时 11 分钟前

@shayuvpn0001 那这里哪个需要物理呢?物理里的哪些知识呢?热胀冷缩吗?

crackhopper

crackhopper      2 小时 56 分钟前

个人提供一个思路(我不是这个方向大佬):必须得想办法能调试系统,你才能更深入的理解。比如,在虚拟机中,通过日志调试或断点调试:比如创建堆上内存的系统调用这个场景下,在系统内核的相应代码中打印堆栈(或者用调试器打断点,我不清楚是否可行,可以自行查阅)。从堆栈中分析执行流程。从整体上建立一个认知,再去逐步看代码。看的过程中,自己加日志代码打印自己的猜想和理解。

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

shayuvpn0001

shayuvpn0001      2 小时 53 分钟前

@hello2090 振幅啊,频率啊,滤波器设计(高通滤波,低通滤波,带通滤波)

你不会以为模电只是电容电阻这些吧。。。

hello2090

hello2090      2 小时 43 分钟前

@shayuvpn0001 这和物理有关吗?而且 我问的是 5 楼对楼主 linux 内存管理的回复,学编程是 数学 + 物理 -> 模拟电路 -> 数字电路 -> 组成原理 -> 汇编语言 -> C/C++ -> 操作系统, 你都已经范围缩小到 DSP 了

我也是 985 通讯本硕,模电数电通讯原理信号处理 DSP Verilog 都是专业课,这里面哪里有和物理有关的?振幅频率滤波器当然是数学啦。

detached

detached      2 小时 39 分钟前

@documentzhangx66 不矛盾,正如你自己所说,Java 一门课肯定是学不到这么多东西。但是所有的问题仍然是在 computer science 这个学科范围内,并不会延伸到数学与物理。就算是对数学与物理有要求,也不过是高中或者大学一二年级通识教育中的内容。

shayuvpn0001

shayuvpn0001      2 小时 20 分钟前

#16 @disk 我不觉得 DSP 和模电有关系。

@hello2090 我觉得我们还是不要继续讨论下去比较好。。。

basncy

basncy      1 小时 52 分钟前

做过相关工作, 抛砖引玉 https://www.zhihu.com/question/379177766
所谓内存管理, 大约是物理内存与虚拟地址之间的各种游戏规则.

iClass

iClass      9 分钟前 via Android

看图并绘图 一张图片胜过千万行代码

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK