个人编程之旅


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

初学汇编

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

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

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

再学C语言

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

   

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

 

操做系统入门

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

 

学完上述两本后,心中涌起了造轮子的欲望,因而入手了下面这本:数据结构和算法

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

网络编程

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

  

至今笔者所遇到的大部分网络编程模型依旧逃不出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的语言就是香),笔者不断探索的经历成为了平常开发中极大的助力,不少号称复杂的概念机制彻底阻挡不了笔者的脚步,多是因为笔者对未知乐此不疲的探索不知不觉跨越了不少障碍吧。

相关文章
相关标签/搜索