给你们说一个学计算机的邪修方法吧。硬件入手。
很多人一提学计算机,脑子里马上浮现出算法,力扣,操作系统三件套,好像只有啃完红黑树、搞懂进程调度、手撕个LRU才能拿到大厂Offer,走上人生巅峰。你真以为所有计算机高手都是这么学出来的吗?
不,邪修路线一直存在,而且比你想象得更硬核,那就是从硬件逆向推软件逻辑。
我第一次意识到这个路线能通天,是在多年前面试一家做工业控制和高性能计算的公司的时候。当时我刚拿了几个互联网大厂的Offer,自我感觉良好,满脑子都是Python的骚操作、数据库的索引优化、如何设计高并发系统。
结果面试官(后来成了我的一位良师益友)上来就问:你知道PCle总线的通道带宽怎么算吗?
我当场就懵了。
我能跟你聊半天Redis的RDB和AOF,能画出完整的TCP三次握手,甚至能白板手撕快排。但PCIe?带宽?这玩意儿不是插上就能用吗?
后来我工作久了才体会到,只会软件的人,其实只在计算机这个巨大冰山的水上部分活动。 你看似在操作系统上指点江山,设计着精妙的软件架构,但在硬件的眼里,你只是个连电信号怎么跑都不知道的上层用户。
你写的每一行代码,最终都要变成一连串高低电平,在硅片上跑。你不懂它的物理规律,就永远无法真正掌控它。
传统的学习方法,是从抽象层往具体层走,学Java、学Python,然后学操作系统、学计网,一层层往下挖,最后(可能)会看一眼汇编和计算机组成。这条路没错,但容易让你对底层产生敬畏,觉得那是不可触碰的黑箱。
而邪修的精髓恰恰相反:你不从抽象层往上爬,而是从物理层往上打通全链路。
当你的同学还在死背OS原理,纠结进程和线程到底有啥区别时,你要从硬件角度去解释:
为什么NVMe SSD的IOPS能比SATA SSD高十倍?
别人只会说:协议不一样。但是你知道,SATA走的是AHCI协议,总线一次只能处理一条命令,队列深度撑死32;而NVMe直连PCIe总线,可以建立最多65535个队列,每个队列深度65535,并行能力是刻在骨子里的,CPU可以直接和它对话,延迟低到令人发指。这根本就是降维打击。
说白了,当你从硬件出发,你就看得见那些别人看不见的数据流动。代码在屏幕上是字符,在内存里是01,但在总线上就是活生生的、有电压、有时序、会拥堵的电信号。
这就是你要达到的境界:万物皆为电路。
怎么邪修,直接看工业计算机硬件技术支持手册。
这个不是特指某一本书,而是一类文档,是硬件工程师的案头必备。比如研华(Advantech)、凌华(ADLINK)这类工控机大厂,或者超微(Supermicro)**这种服务器主板厂商,他们官网上给出的主板技术手册(Technical Manual / User Guide)。
这类手册,尤其是给服务器和嵌入式设备准备的,其实完全是计算机体系结构的活教材。它会把一块主板给你拆了喂给你:
- 系统架构图(Block Diagram): 一张图告诉你CPU、PCH(南桥)、内存、PCIe插槽、SATA口、M.2口之间是怎么连的,谁听谁的,数据走哪条路。这是上帝视角。
- 接口协议详解: 它会明确告诉你这个M.2口支持SATA模式还是NVMe模式,那个PCIe插槽是CPU直出还是PCH绕出来的,带宽分别是多少。
- 电气与信号特性: 它甚至会讲到某些跳线(Jumper)的设置会如何改变某个接口的电气属性,告诉你不同内存插槽的优先级。
- Datasheet解读: 很多手册还会引用芯片组(如Intel Z系列、C系列)的官方Datasheet,带你理解这些控制器的核心功能。
怎么读?
- 第一步: 找一块你感兴趣的服务器主板(比如超微的X12系列)或者一块树莓派/Jetson Nano的开发板,去官网下载它的技术手册。
- 第二步: 对着那张系统架构图(Block Diagram),把CPU、内存、各个总线和外设的关系理清楚。
- 第三步: 看到不懂的协议名词(如PCIe, DMI, SATA, SPI, I2C),立刻去Google,把它是什么、用来干嘛、基本原理搞懂。
- 第四步: 当你把这块板子在脑子里“点亮”后,你以前学的那些软件黑箱,突然就有了实体。
当你啃完几本这样的手册,再回头看那些经典的软件问题,你会发现世界豁然开朗:
为什么内核I/O调度要区分同步/异步?
从硬件看,同步I/O就是CPU死等那个慢吞吞的机械硬盘转到指定位置;异步I/O就是CPU跟DMA控制器说:“喂,把这1GB数据从内存搬到硬盘,搞定了再叫我(中断)”,然后CPU就去忙别的了。硬件层面的分工,决定了软件层面的设计模式。
为什么DMA(直接内存访问)能直接搬数据,CPU却要装看不见?
因为CPU是万能但昂贵的“大脑”,让它去干“搬砖”这种重复性劳动太浪费了。DMA就是个专职“搬砖工”,虽然只会搬,但效率奇高,能解放CPU。它们通过总线仲裁机制协调工作,CPU把总线控制权暂时让给DMA,自己可以处理寄存器里的其他计算任务。
为什么一个烂驱动就能让Windows直接蓝屏(BSOD)?
因为驱动程序运行在内核态(Ring 0),它拥有直接访问和操作硬件的最高权限。用户程序(Ring 3)写错了地址,操作系统会把它一巴掌拍死,系统安然无恙。但驱动写错了,它可能直接改写了某个关键的硬件控制器寄存器,或者访问了不该碰的物理内存,整个系统的根基都动摇了。操作系统除了拉闸重启(蓝屏),别无他法,这是由CPU的保护模式决定的。
这些问题的答案,教科书上也许有,但它们都飘在空中。只有当你脑海里浮现出那块电路板,看到CPU、DMA控制器、内存、硬盘在总线上互相“通信”的画面时,这些知识才会真正长在你的脑子里。
所以这条邪修路线,本质上是把计算机还原成一个物理系统。这条路不好走,很硬核,甚至有点枯燥。但一旦你走通了,你会建立起一套无比坚固的知识体系。那时,你看整个计算机世界,眼光就不一样了。
程序员必读的四本硬核底层的计算机书籍(附PDF下载)
作者:Cv大法代码酱
链接:https://www.zhihu.com/question/664426087/answer/1974427654305374263
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。