计算机原理学习(序)

 

序言

 

 

又有两年没有写Blog了, 这2年从做windows phone 到 Android C++, 慢慢的很多观念也有所改变了。以前一心想做C#相关的工作,现在却感觉,什么语言都无所谓了。公司项目挺忙,加班比较多,不忙的时候又想休息休息。 所以blog又荒废了好久。也很少有时间早学习, 加上年纪越来越大,学习动力和热情也越来越小了。最近一个月不是特别忙,抽空看了看《深入理解计算机系统》、《程序员的自我修养》、《现代操作系统》三本书,然后顺带看了看编译,汇编相关的知识, 也在网上查了不少资料。突然发现好多东西其实是大学里都学过,这也算是工作6年对以前知识的一个总体的复习吧。在不同时期看相同的书,总会有不同的收获。

 

对于一个应用层的开发者来说,不了解CPU是如何工作的,内存是如何布局的,多进程是怎么实现的并不会影响他写出好的应用程序。就好像一个武术演员,不懂九阳神功一样可以拍出很好的动作电影。但是看了那么多武侠剧,那些路人甲,宋兵乙为什么总是被大侠们狂虐?原因很简单,他们木有内功。套路只是一方面,拼的还是内功啊。大侠们内功那里来的?不是武二代就是出师名门,说白了还是看背景而不是背影。这种东西不是随便教的,当然也不是谁都能学会的。恩,有点扯远了。对于我们来说,这些知识就是我们要学习的计算机内功的一部分。虽然这些知识并不能交我们怎么写一个Android APP,也不能帮我们学习Web开发,就好像虚竹有了内功不会招式也是没用的,所以要内外兼修。对于我们这些已经掌握了招式的宋兵乙来说,在没有干爹的情况下,就只能靠自己来修炼内功了。不奢求称为大侠,只求3招内不被打倒。

 

对于计算机专业毕业的人来说,后面大部分都是学校都学过,从纯硬件的模拟电路,数字电路,到软硬件相关的计算机组成原理,计算机体系结构,再就是最底层的操作系统,编译原理,汇编,C语言,到上层存软件的开发语言。但是很多人都觉得是枯燥的理论知识,实际这真是挺有用的东西。但是工作后基本不会接触,所以都忘记的差不多了,看下书一段时间又忘记了,所以这次决定写下来,算是学习笔记,也算是为一些朋友提供一个参考。

但是对于这些知识,我也纯粹是一个现学现卖的理论派,我可以给你介绍一些基本的汇编命令。你就不要为难我要我用汇编写个完整程序;我可以说说Linux设备驱动结构,你克别要我给你的自行车也写个驱动。 所谓术业有专攻,我们不是为了能去做硬件,写汇编,写驱动,所以也不要奇怪为什么我有时还会看看Linux驱动开发的书,我可能也就是随便翻翻,找想了解的重点看,可能1天就看完了。我们学习这个只是为了了解相关的知识和原理,帮助我们更好的做开发。有一层的九阳神功足以保命了,练得太多小心走火入魔。大笑

 

 

 

问题

 

 

作为一个IT工程师,用现在流行的话来说,这也是个高端大气上档次的工作。但是你是否真的了解你每天都在用的计算机,你又是否真的了解你自己写的程序呢?当一个人问你计算机是怎么工作的时候,你会不会一脸茫然的想,我怎么从来没想过这个问题?

  1. 我们的代码是如何被编译成可执行文件的?
  2. 程序是如何被CPU执行的?
  3. 进程和线程到底是什么东西?
  4. CPU的指令和汇编语言和程序库和开发语言有什么关系?
  5. 为什么系统可以同时运行多个程序,是如何做到的?
  6. .NET的编译出来的是托管代码,和C++的Native代码执行有区别吗?
  7. 为什么我new了1G的内存空间,实际内存却没变化?

 

如果你能很确定的回答这些问题,那么我有不懂的问题就应该可以向你请教了。那也麻烦你帮我找找文章中的错误。如果你不太清楚甚至是完全说不清,那我们就一起来学习学习。

 

 

 

大纲

 

 

这个系列是介绍计算机的原理,主要涉及的是软件方面的,硬件原理只会简单的从体系结构方面进行介绍。每一个点都不会特别深入,一方面是没这个能力,另一方面是没必要,因为每一个点可能都是厚厚的一本书。而且对于我这种基本和应用程序打交道的码农来说,这个程度的了解也是比较合适的。整个学习过程也就是看书,查资料,再重新看书,再查资料,最后总结。里面也会结合自己有点一点点经验,把比较零散的点结合起来方便理解。 文章里肯定会存在很多错误,希望可以指出来。

 

另外我把有读到相关的书列出来:

  • 《深入理解计算机系统》– 这是外国大学的教材,可以多花点时间看,总体理解计算机体系结构和原理
  • 《现代操作系统》 — 挺不错,帮助理解操作系统运作方式
  • 《Linux内核设计与实现》–《linux kernel development》简称lkd ,先大概看一遍,很多地方不懂,学习了其他在重新看
  • 《程序员的自我修养》 — 相当好的一本书,主要介绍程序编译和加载,了解程序到底怎么开始运行
  • 《Windows核心编程》 — 《Windows Programming》 以前看过2遍了,看过了lkd,准备再看一边进行对比
  • 《80×86汇编语言程序设计教程》 — 回一下寻址方式,寄存器的作用
  • 《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本了,虽然只是了解性的看了看。偷笑

 

计算机原理学习(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


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

4 评论

familyshizhouna进行回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注