又有两年没有写Blog了, 这2年从做windows phone 到 Android C++, 慢慢的很多观念也有所改变了。以前一心想做C#相关的工作,现在却感觉,什么语言都无所谓了。公司项目挺忙,加班比较多,不忙的时候又想休息休息。 所以blog又荒废了好久。也很少有时间早学习, 加上年纪越来越大,学习动力和热情也越来越小了。最近一个月不是特别忙,抽空看了看《深入理解计算机系统》、《程序员的自我修养》、《现代操作系统》三本书,然后顺带看了看编译,汇编相关的知识, 也在网上查了不少资料。突然发现好多东西其实是大学里都学过,这也算是工作6年对以前知识的一个总体的复习吧。在不同时期看相同的书,总会有不同的收获。
对于一个应用层的开发者来说,不了解CPU是如何工作的,内存是如何布局的,多进程是怎么实现的并不会影响他写出好的应用程序。就好像一个武术演员,不懂九阳神功一样可以拍出很好的动作电影。但是看了那么多武侠剧,那些路人甲,宋兵乙为什么总是被大侠们狂虐?原因很简单,他们木有内功。套路只是一方面,拼的还是内功啊。大侠们内功那里来的?不是武二代就是出师名门,说白了还是看背景而不是背影。这种东西不是随便教的,当然也不是谁都能学会的。恩,有点扯远了。对于我们来说,这些知识就是我们要学习的计算机内功的一部分。虽然这些知识并不能交我们怎么写一个Android APP,也不能帮我们学习Web开发,就好像虚竹有了内功不会招式也是没用的,所以要内外兼修。对于我们这些已经掌握了招式的宋兵乙来说,在没有干爹的情况下,就只能靠自己来修炼内功了。不奢求称为大侠,只求3招内不被打倒。
对于计算机专业毕业的人来说,后面大部分都是学校都学过,从纯硬件的模拟电路,数字电路,到软硬件相关的计算机组成原理,计算机体系结构,再就是最底层的操作系统,编译原理,汇编,C语言,到上层存软件的开发语言。但是很多人都觉得是枯燥的理论知识,实际这真是挺有用的东西。但是工作后基本不会接触,所以都忘记的差不多了,看下书一段时间又忘记了,所以这次决定写下来,算是学习笔记,也算是为一些朋友提供一个参考。
但是对于这些知识,我也纯粹是一个现学现卖的理论派,我可以给你介绍一些基本的汇编命令。你就不要为难我要我用汇编写个完整程序;我可以说说Linux设备驱动结构,你克别要我给你的自行车也写个驱动。 所谓术业有专攻,我们不是为了能去做硬件,写汇编,写驱动,所以也不要奇怪为什么我有时还会看看Linux驱动开发的书,我可能也就是随便翻翻,找想了解的重点看,可能1天就看完了。我们学习这个只是为了了解相关的知识和原理,帮助我们更好的做开发。有一层的九阳神功足以保命了,练得太多小心走火入魔。
作为一个IT工程师,用现在流行的话来说,这也是个高端大气上档次的工作。但是你是否真的了解你每天都在用的计算机,你又是否真的了解你自己写的程序呢?当一个人问你计算机是怎么工作的时候,你会不会一脸茫然的想,我怎么从来没想过这个问题?
如果你能很确定的回答这些问题,那么我有不懂的问题就应该可以向你请教了。那也麻烦你帮我找找文章中的错误。如果你不太清楚甚至是完全说不清,那我们就一起来学习学习。
这个系列是介绍计算机的原理,主要涉及的是软件方面的,硬件原理只会简单的从体系结构方面进行介绍。每一个点都不会特别深入,一方面是没这个能力,另一方面是没必要,因为每一个点可能都是厚厚的一本书。而且对于我这种基本和应用程序打交道的码农来说,这个程度的了解也是比较合适的。整个学习过程也就是看书,查资料,再重新看书,再查资料,最后总结。里面也会结合自己有点一点点经验,把比较零散的点结合起来方便理解。 文章里肯定会存在很多错误,希望可以指出来。
另外我把有读到相关的书列出来:
还有一些没读的
主要是Linux相关的书比较多,但是后续文章中一些内容都是比较通用的,有些地方会写出Windows和Linux的差异。其中ldd,lkd,utk三本经常看到论坛大神回答问题是说你看那看utk那里那里就知道了,我后来搜索发现我也看了2本了,虽然只是了解性的看了看。
计算机原理学习(1)-- 计算机基本工作原理
计算机原理学习(2)-- 存储器和I/O设备和总线
计算机原理学习(3)-- 内存工作原理
计算机原理学习(4)-- 操作系统发展和程序编译
计算机原理学习(5)-- x86-16 CPU和内存管理
计算机原理学习(6)-- x86-32 CPU和内存管理之分页管理
计算机原理学习(7)-- x86-32 CPU和内存管理之分段管理
计算机原理学习(8)-- 进程的内存映射和内存共享
计算机原理学习(9)-- 可执行文件的编译和结构
计算机原理学习(10)-- 可执行文件的加载和运行
计算机原理学习(11)-- 进程的内存布局
(TBD) 2014.4.26 Update