2016.06.30 - 07.12
《计算机是怎样跑起来的》1-3 章。
- 矢泽久雄 / 着
- 胡屹 / 译
个人学习笔记。
05.30
0 前言目录
兴趣。年轻计算机成为计算机专家的年轻工程师认为计算机无聊。
学习方法(参考)。
[1] 划出一个知识范围,精通一门必须知道的知识。
[2] 掌握范围内每个知识点的基础知识。
[3] 目标的目标 —— 掌握这些知识能做什么?
这本书的目的。让你了解计算机技术的知识范围,掌握基础知识,设定目标;同时希望那些计划用计算机做什么,但因为困难而犹豫,虽然在计算机行业工作,但无法赶上最新技术,能理解计算机的本质。
[基础知识(开始)]
1 计算机的三大原则
07.04
0 问题 & 重点
初级问题。硬件和软件有什么区别?
[1] 用于存储/传输/执行软件(相应的电信号/指令)的硬件结构固定;软件是存储在内存硬件中的信号序列。[读前]
[2] 硬件是一种可见的设备,如计算机主机、显示器、键盘等。软件是计算机执行的程序,即指令和数据。软件本身是看不见的。[阅读后]
[我觉得我回答得不好,虽然我回答得不好]
中级问题。存储字符串中国需要多少字节?
[1] 如果需要4字节才能存储一个汉字,那么中国需要9字节(字符串结束标志\0需要1字节。[读前]
[2] 在GBK在字符编码下,存储中国需要四个字节。[读后]
(UTF-8字符编码下,一个汉字占用3个字节)
[虽然比我准确,但感觉没有我回答的好(我从C的角度)]
高级问题。编码是什么?(Code)?
[1] 编码是给集合中的每个元素一个(在计算机中)唯一的编号。[读前]
[2] 数字化处理的信息通常称为编码,以便于计算机处理。[阅读后]
(尽管有些信息不是数字,但所有的信息都将在计算机内部作为数字处理。用于表示字符的数字为字符编码,用于表示颜色的数字为颜色编码)
[答案比我更专业,纠正我的片面理解]
重点。认识计算机,需要把握的最基础的要点只有三个 —— 计算机的三个原则。无论最新技术多么先进和困难,都可以根据这三个原则进行解释。本书基于本章介绍的计算机的三个原则,扩展到硬件和软件、编程、数据库、网络和计算机系统。
1.1 计算机的三个根本问题
计算机三大原则
[1] 计算机是执行输入、计算和输出的机器
[2] 程序是指令和数据的集合
[3] 计算机的处理有时与人们的思维习惯不同
[我们都知道这三点,但我们没有把握把它归纳为计算机的三个原则,并将这三点延伸到计算机的其他方面 —— 本来是从事计算机行业20多年的作者的深刻理解,]
1.2 硬件的基础是输入、运算和输出
精彩的计算机输入、运算和输出论证段落
输入、运算、输出三者必须成套出现,缺一不可。这样说的原因有三。首先,计算机还没有发展到通过自发思考创造信息的地步。因此,计算机不入信息就不能工作。因此,输入是必不可少的。其次,计算机不能执行任何操作。如果输入信息只是绕过计算环节直接输出,那么这就是电线而不是计算机。可以说计算机没有运算就没有存在的意义。最后,如果输入信息已经计算,则必须输出计算结果。如果不输出结果,那么这不是一个计算机,而是一个堆积信息的垃圾箱。因此,输出也是必不可少的。
1.3 该软件是指令和数据的集合
指令。控制计算机输入、计算和输出的命令。发送给计算机的指令对应于计算机硬件上的行为。[这个指令解释得很新颖]
程序。列出向计算机发出的指令,获得程序[**数据呢 ——程序是指令与数据的结合。
程序中的数据。程序中的数据分为两类,一类是作为指令执行对象的输入数据,另一类是从指令执行结果中获得的输出数据。[程序中的数据段属于前者吗?有严格的区别吗?如何区分它? —— 两者都应属于程序中数据段的内容]
1.4 对于计算机来说,一切都是数字
07.05
在用计算机代替手工操作的过程中,有时会违背人们的思维习惯,以遵循计算机的处理方法。[用数字表示所有信息 —— 颜色编码;字符编码(如蓝色:0, 0, 255”)]
1.5 只要你理解三个原则,即使你遇到最新的技术,你也可以很容易地处理它们
为了达到这一点,我偷偷地想,
[1] 深刻理解三大原则
[2] 多识广,经验丰富
1.6 为了接近人类,计算机在不断变化
计算机进化的目的只有一个 —— 更接近人类。[为人们提供使用/计算机性能的角度]
进化编程方法。编程方法的进化产生了两种编程方法:面向组件编程(Component Based Programming)编程面向对象(Object Oriented Programming)。这两种进化目标是一致的,这是程序员在编程中继续使用人类创造事物的方法。面向组件编程的方法是将组件(程序部件)组装在一起完成程序;面向对象编程的方法是在将模型转移到程序之前,如实建模现实世界的业务。
然而,有这样的程序员,他们远离组件编程,显然有各种现成的组件可以使用,但他们必须自己做任何功能,好像编程不舒服。其他程序员误认为面向对象的编程很难理解。有很多这样的程序员,尤其是在以前的电脑爱好者中。简而言之,由于他们过于习惯于配合计算机的处理,他们认为计算机接近人类的发展趋势正在增加混乱。[作者对编程方法的看法]
[硬件和软件]
2 试着制造一台计算机吧
07.06
0 问题 & 重点
初级问题。CPU缩写是什么?
[1] Center Processor Unit。[读前]
[2] Central Processing Unit。[读后]
[为什么CPU不是Central Processor Unit的缩写]
中级问题。Hz是什么单位?
频率。
高级问题。Z80 CPU有多少比特?CPU?
[1] 没听过Z80 CPU。[读前]
[2] Z80 CPU是8比特的CPU。[读后]
CPU上数据总线的条数,或CPU参与内部操作的寄存器的容量可以作为衡量CPU性能比特数。
重点。纸上(原理图)谈微型计算机的制作过程。
2.1 制作微型计算机所需元件
制作微型计算机所需的基本元件:CPU、内存、I/O辅助元件(时钟发生器,输入程序装置 —— 指拨开关,输出程序执行结果的装置,其他细碎元件)。[组装层/组件原理]
时钟发生器。时钟发生器具有晶体振动,根据自身频率产生时钟信号。
2.2 读电路图
07.07
[NULL]
2.3 连接电源、数据和地址总线
使用微型计算机IC属于数字IC。在数字IC每个引脚上的电压是0V,要么是5V,通过这两个电压和其他电压IC收发电信号。用于给IC供电的Vcc引脚和GND引脚上的电压是恒定的5V和0V,但是其他引脚上的电压,会随着计算机的操作在5V和0V不断变化。[即,若5V对应二进制数1,0V对应二进制数0,其他引脚上的电压为5V或0V]
2.4 连接I/O
07.08
端口。端口是I/O输入输出数据的到外部设备之间。
2.5 连接时钟信号
2.6 连接用于区分读写对象是内存还是内存I/O的引脚
2.7 连接剩余的控制引脚
总线。总线连接CPU中数据引脚、地址引脚、控制引脚上电路的总称。
DMA。不经过CPU直接从外部设备读写内存的行为称为DMA(Direct Memory Access,直接访问存储器)。读写内存时使用硬盘等设备DMA。
2.8 连接外部设备,通过DMA输入程序,连接输入输出的外部设备
[如果将开关直接连接到TC5517的各个引脚上,在程序执行时,开关的状态就会对电路产生影响]
2.9 输入测试程序并进行调试
在单片机广泛应用的几天,CPU、I/O、内存都被集成到了一块IC上。[纸上画画,没有用电路软件绘图,故而不能输入程序仿真(也略)]
3 体验一次手工汇编
07.11
0 问题 & 重点
初级问题。什么是机器语言?
[1] 能直接驱动(输入给)CPU工作的高低电平序列集。[读前]
[2] 由二进制数字构成的程序,CPU可以直接对其解释、执行。[读后]
中级问题。通常把标识内存或I/O中存储单元的数字称作什么?
[1] 端口。[读前]
[2] 标识内存或I/O中存储单元的数字叫作“地址”。[读后]
高级问题。CPU中的标志寄存器(Flags Register)有什么作用?
[1] 配置;记录某些结果。[读前]
[2] 用于在运算指令执行后,存储运算结果的某些状态。[读后]
[一旦执行了算术运算、逻辑运算、比较运算等指令后,标志寄存器并不会存放运算结果的值,而是会把运算后的某些状态存储起来,例如运算结果是否为0、是否产生了负数、是否有移除等。没提供直接修改标志寄存器的指令?记不清了]
重点。通过编写程序亲身体验计算机的运行机制。为达到这个目的,就需要使用一种叫作“汇编语言”的编程语言来编写程序,然后再把编好的程序通过手工作业转换成CPU可以直接执行的机器语言。这样的转换工作叫 “手工汇编”。
3.1 从程序员的角度看硬件
编程时必须要先了解微型计算机的硬件信息(真正需要了解的硬件信息只有7种):
【CPU信息】
[1] CPU的种类(不同CPU对应不同的机器语言 —— 原生代码)
[2] 时钟信号的频率
【内存信息】
[3] 地址空间
[4] 每个地址中可以存储多少比特的信息
【I/O信息】
[5] I/O的种类
[6] 地址空间
[7] 连接着何种周边设备
时钟信号。时钟信号是在0和1两个数(电平)之间反复变换的电信号。(指令执行时所需的时钟周期数取决于指令的类型)
内存的地址空间。每个地址都标示一个内存中的数据存储单元,而这些地址所构成的范围就是内存的地址空间。[《CSAPP》《程序员的自我修养》《Linux C编程一站式学习》中可能也有关于内存地址空间的解释]
I/O地址空间。指用于指定I/O寄存器(端口)的地址范围。[在内存中,每个地址的功能都一样(不具OS),既可以用于存储指令又可以用于存储数据。而I/O不同,地址编号不同即寄存器的类型不同,功能也就不同]
CPU控制I/O。CPU控制I/O设备是通过端口来实现的(《汇编语言》),只要CPU控制I/O的寄存器,就可以设定I/O的功能,与周边设备进行数据的输入输出。
3.2 机器语言和汇编语言
机器语言。机器是语言是(能够直接驱动)CPU或CPU能够直接解释、执行的高低电平(二进制)序列。
汇编语言。汇编语言是机器语言的“助记符”(便于人的记忆、编程、理解)。汇编语言由(CPU执行的)汇编指令(和编译器处理的伪指令)组成。汇编指令由“操作码”和“操作数”组成,操作码就是“做什么”的指令,操作数就是指令执行的对象(CPU的寄存器、内存地址、I/O地址或者直接给出的数字都可以作为操作数)。[《汇编语言》对汇编语言有解释]
3.3 Z80 CPU的寄存器结构
计算机的三要素。CPU、内存和I/O。CPU负责解释、执行程序,从内存或I/O输入数据,在内部进行运算,再把运算结果输出到内存或I/O。内存中存放着程序,程序是指令和数据的集合。I/O中临时存放着用于与周边设备进行输入输出的数据。
寄存器。CPU中存储数据的地方,且CPU中的寄存器还具备对数据进行运算的能力(移位寄存器等,见《自己动手设计制作CPU与单片机》中各种寄存器的设计)。[cache可存储指令和数据]
[汇编指令(的含义)可以作为理解计算机工作的原理,还可以更小的执行单位(如微操作)来理解计算机的工作原理(见《自己动手设计制作CPU与单片机》或《计算机组成原理》)]
3.4 追踪程序的运行过程
07.12
[NULL]
这一节其实是(从组成原理层面)在描述CPU从内存取指并执行指令得到结果的原理(《汇编语言》《计算机组成原理》等书也有涉及;透入到芯片、内存内描述取指、解释、执行指令过程的在《自己动手设计制作CPU和单片机》一书中有描述)。
3.5 尝试手工汇编
汇编语言和机器语言对照资料所在。在CPU的资料中,明确写有所有可以使用的助记符,以及助记符转换成机器语言后的数值。只要查看这些资料,就可以把汇编语言编写的程序手工转换成机器语言的程序(编译器也要查看这些资料),这样的工作称为手工汇编。[在《自己动手设计制作CPU和单片机》一书中也有涉及手工汇编 —— 汇编语言和机器语言对照表]
3.6 尝试估算程序的执行时间
通过时钟周期估算程序的执行时间。将所有指令的时钟周期累积起来,再根据晶振的频率计算出每个时钟周期所对应的时间,再用这个时间乘以累积的时钟周期数就差不多得到程序的执行时间(以及某一段程序执行的时间)。
总结
[1] 作者从事计算机行业20余年的深切领悟,晚生不能与之共鸣很正常。可将类似的领悟当成目标。
[2] 要是根据第二章介绍,收集元件(繁琐)来焊一块单片机(先画PCB)会加深对组装计算机的理解。
[3] 书中所介绍的内容基本都知道,但作者所作的像计算机三要素、从程序员角度看硬件的7个信息、学问学习方法等是新手有用的参考。
[2016.07.01 - 0:08]