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