序言

又有两年没有写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,准备再看一边进行对比
  • 《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本了,虽然只是了解性的看了看。

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



计算机原理学习(1)相关推荐

  1. 好东西——计算机原理学习(序)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/cc_net/article/details/10418711 序言 又有两年没有写Blog了, 这2 ...

  2. 计算机原理学习(序)

    转载地址:http://blog.csdn.net/cc_net/article/details/10418711 序言 又有两年没有写Blog了, 这2年从做windows phone 到 Andr ...

  3. 计算机原理学习指导第3版,计算机组成原理学习指导与习题解析(第3版)(21世纪大学本科计算机...

    摘要: 这本<计算机组成原理学习指导与习题解析(第3版)>由蒋本珊编著,是与"十二五"普通高等教育本科国家级规划教材<计算机组成原理(第3版)>完全配套的学 ...

  4. 计算机原理学习(2)-- 存储器和I/O设备和总线

    版权声明:本文为博主原创文章,未经博主允许不得转载.    https://blog.csdn.net/cc_net/article/details/10439665 前言 前一篇文章介绍了冯诺依曼体 ...

  5. 计算机原理学习(一)

    计算机基本原理 现代计算机,大部分都是基于冯诺依曼体系结构,而我们这里谈论的也是此问前提.冯诺依曼的核心是:存储程序,顺序执行.所以不管计算机如何发展,基本原理是相同的.计算机程序实际上是告诉计算机做 ...

  6. 计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理

    前言 对于我们80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体. 依旧记得当时在同学家看同学输入几个DOS命令就成功的打开了一个游戏,当时实在是佩服的五体投地.因为对我来 ...

  7. 计算机原理学习笔记——第一章 计算机的抽象和技术——2 程序的表象之下

    程序的表象之下

  8. 【计算机原理学习】二进制和十进制转换

    目录 一.二进制转换为十进制 二.十进制转换为二进制 整数部分计算 小数部分计算 总结 一.二进制转换为十进制 二.十进制转换为二进制 由于整数部分和小数部分转换方式不同,需要将整数部分和小数部分分别 ...

  9. 计算机编译原理有必要学吗,计算机程序编译原理学习心得

    计算机程序编译原理学习心得 <编译原理>是计算机专业的一门重要课程,正如教材:第一章的引论所述,"编译程序是现代计算机系统的基本组成部分之一"."一个编译程序 ...

最新文章

  1. 对Linux文件中的多行进行注释
  2. hdu-1041(大数模板)
  3. Spring Cloud Alibaba - 12 使用Nacos的元数据实现金丝雀发布功能
  4. 消息提示框-事件冒泡
  5. python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?
  6. redis的HyperLogLog与布隆过滤器
  7. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
  8. python逐行读取txt文件readline_Python - 无法读取整个.txt文件:.readlines错误?
  9. 从实验室搬到宿舍后可以上QQ但打不开网页
  10. VMware16安装CentOS7.6虚拟机
  11. 2021年中国地下光缆市场趋势报告、技术动态创新及2027年市场预测
  12. [译]JavaScript中的属性:定义和赋值的区别
  13. mockito无效_Mockito模拟无效方法
  14. Android实现抖音无水印视频
  15. 国产商用密码与国际密码对照
  16. 把Date类型的Fri Feb 01 00:00:00 CST 2019转换成yyyy-MM-dd格式
  17. 安卓双摄像头录像_USB双摄像头app下载-USB双摄像头 安卓版v9.9.1-PC6安卓网
  18. IOS客户端接入FaceB,SSO授权
  19. 有机化学php,有机化学原理
  20. np.arange()和 range()的用法及区别

热门文章

  1. 计算机专业认知存在的问题,浅谈新形势下计算机专业存在的问题与对策
  2. Android基础-1.指南说明
  3. 用apline-linux创建的tomcat容器中查看catalina.out日志中文乱码问题解决
  4. python求满足条件的值的个数_计算列表中满足特定条件的值的数目
  5. 浅析Content Negotation在Nancy的实现和使用
  6. 为了给YiYi节省时间,写了个能自动拼图贴水印的机器人,很多bug,能用就行。
  7. ubuntu右键点击没有新建文档_苹果鼠标右键无法新建txt文档?iRightMouse :超级右键鼠标辅助工具...
  8. 港科夜闻丨香港科大获越秀集团捐赠港币一亿元支持大学发展
  9. USB连不上电脑,出现Unknown Device问题
  10. 边缘设备、系统及计算杂谈(3)—edgex-go,了解一下