新冠疫情让笔者不禁回忆起10多年前甲流流行的那段过往。也就是那时,在封闭的大学宿舍里,笔者开启了自己的编程之旅。

初学汇编

初涉编程时那个C语言展示hello world的黑框并没有激起笔者的任何兴趣。为什么寥寥几句就可在屏幕上展示输出成为萦绕笔者心头的一个疑问。在全校封闭、无法组团dota、百无聊赖的境遇下,笔者开始着手去探索这一谜题。在学校书店入手了王爽编写的<<汇编语言>>

读完并实践之后,揭开了计算机原理的冰山一角,从此一发不可收拾的爱上编程,尤其享受那种努力探索后恍然大悟的快感! 紧接着,开始汇编的第二本书:

使笔者学到了win32汇编的各种知识,意识到汇编的强大和其直接操纵底层的犀利。

再学C语言

在实际编写汇编时,深感其表现力方面的不便,例如一个浮点操作就需要专门的指令。于是又老老实实滚回去修炼C语言,入手了基本经典的书籍进行学习:

这次修炼毫无障碍,对于汇编的学习让笔者不知不觉突破了指针这个大关。当然与C语言配套的必须还有数据结构和算法:

操作系统入门

学完C语言后,也到了大学里教授操作系统课的时候,课上用的教材是<<操作系统-
精髓与设计原理>>,同时笔者自己也搞了本<<现代操作系统>>研读。

学完上述两本后,心中涌起了造轮子的欲望,于是入手了下面这本:

书中事无巨细的讲解让笔者一步一步从保护模式到进程实现再到键盘输入等完成了一个简单的toyos。这本书满足了笔者造轮子的愿望,就像书中说的那样,这一切的探索仅仅是从最原始的好奇心开始。

网络编程

笔者读的是通信工程专业。自然的在下一步的学习中选择了网络编程。而网络编程书籍当中最经典的必须是UNP(配合APUE的前置学习效果更佳)。

至今笔者所遇到的大部分网络编程模型依旧逃不出UNP的藩篱。
(注:APUE->UNIX环境高级编程,UNP->UNIX网络编程)

协议栈

学完上述书籍后,自然又有了新的疑问,套接字(socket)底层是如何实现的?tcp/ip又是怎样工作的?于是笔者又开始探索起关于协议栈的内容。最先阅读的是Douglas E.Comer的<<用TCP/IP进行网际互联>>三卷,笔者个人觉得非常适合入门。

就着上面书中的第二卷,笔者完成了第一个协议栈(XINU)的分析。
阅读完上面三卷后,意犹未尽,毕竟XINU是个并不流行的操作系统,于是捧起了TCPIP详解三卷。

其中卷二的tcpip实现基于BSD4.4-lite源码,无疑是tcpip最为广泛的实现,更加贴近现实。笔者花了大量的时间阅读了tcpip详解卷二,同时分析了BSD4.4的网络子系统。在此基础上,还顺带分析了专用于嵌入式的lwip协议栈。同时小试牛刀,解决了raw-os(某实时操作系统)适配lwip协议时关于free arp的一个初始化bug。Debug lwip协议栈的那个下午现在回想起来依旧令人心潮澎湃。

Linux

Linux内核

工作后基本都在和linux打交道。按笔者一探到底的精神必然研读起linux内核。首先是啃了好几本大部头的linux内核著作。

第一本,<<linux内核设计与实现>>(缩写lkd)比较薄,用来入门比较合适,能够建立起基本的linux内核图景。
第二本,<<深入理解Linux内核>>(缩写ulk)很厚,囊括了linux各个基本的子系统模块和其具体的实现机制,确实做到了深入理解这几个字。
第三本,<<深入linux内核架构>>(缩写PLKA)更厚。其于上面的<<深入linux内核>>相辅相成,ulk详细阐述的其一笔带过,ulk遗漏但重要的PLKA对其做了详细解释。
最后一本<<Linux内核源代码情景分析>>是国人写的,也非常不错,只是内核版本(2.4)有点老了,不过也是非常不错的补充。

Linux内核子模块

读完上述三本,应该算对内核应该有个基本的入门了吧。下面就是深入到内核的各个子模块的代码实现里了,于是笔者又读了:

第一本<<Linux网络技术内幕>>帮笔者梳理了linux内核网络子模块的各种关键代码路径。
第二本<<深入理解Linux虚拟内存管理>>虽然中文翻译的不太好,但确实是本好书,配合英文版帮笔者夯实了虚拟内存的基础。
第三本<<Linux设备驱动程序>>算是一个补充吧,由于笔者并不搞驱动,所以通过这本书了解下Linux驱动到底是怎么运行的。

Source Code

书籍只能带你走进内核,而深入内核则必须阅读the fucking source code!不同操作系统以及同操作系统不同内核版本间实现的各种细节会导致一些细微的差别,而这些差别真是书中得来的知识和实践的距离,剖析疑难问题有时必须在源码中寻觅才能抓住关键的线索。
笔者日常工作中很大一部分精力是解决疑难杂症,在遇到一些很底层的问题时往往会从内核源码着手,于是便有了博客里的一篇篇博文。

最后

看到这里,大家会以为笔者一直在用C语言。其实笔者在工作中用到最多的是用JAVA写中间件(带gc的语言就是香),笔者不断探索的经历成为了日常开发中极大的助力,很多号称复杂的概念机制完全阻挡不了笔者的脚步,可能是由于笔者对未知乐此不疲的探索不知不觉跨越了很多障碍吧。


关注笔者公众号,获取更多干货文章:

 

武汉加油!湖北加油!中国加油!

GITHUB链接

https://github.com/alchemystar

分类:

技术点:

编程