文章也同时在简书更新
引言
本篇是关于《汇编语言-基于Linux环境》的第3章:摘下面具探索计算机的真正面目。
学习底层或许能够让自己更加深刻地理解计算机的原理,理解它每一个组成部分正在做的事情,以及它们是如何协同工作的。在使用汇编时,你与计算机的距离就最大限度地缩短了,或许只有汇编语言程序员才真正有资格声称是计算机的主人。
让我们深入底层吧,这将会很有趣~
摘录
- 硅芯片非常小且易碎,通常被放在一个长方形的塑膜外壳里,就像一块长着用于电连接的金属腿的小口香糖。
- 根据数据从地址应用到地址管脚之后到出现在数据管脚上所需的时间,我们对芯片进行分类,寄存器,高速缓存,内存,外存就这么分类得来。
- 一些较小的内存芯片集合在一起形成一个连贯的更大的存储器。
- 计算机中每个字节的存储器都有它唯一的地址,即使是在一次处理2,4或者8个字节信息的计算机中。
- Q:以32位计算机为例,为什么要一次取出32bits数据,以及这样的好处是什么?
A:每个字节都有自己的地址,当一台32为计算机访问一个字节时,它实际上一次读取从这个字节开始的4个字节。你可以使用剩余的3个字节,或者如果不需要,干脆就忽略他们——如果后来你又要决定的确需要使用剩余的3个字节,你将不得不再次访问内存以获取它们。为了节省时间,最好一次将它们都取出来。 - 是CPU在做读取和写入的工作。
- CPU芯片最重要的工作就是与计算机存储系统进行通信。
- 对于CPU从内存读取数据:当CPU需要从内存中读入一个字节(一个字,双字,四字)时,它把该字节的内存地址放到它的地址管脚上,编码形成一个二进制数,几纳秒之后,所需要的字节就出现(也是以二进制的形式)在存储器芯片的数据管脚上。
CPU写入数据也是同理。 - CPU把一个地址传到存储器系统,然后存储器系统或者接收来自CPU的数据,并将其存储到那个地址,或者把哪个地址中找到的数据放到计算机的数据总线上,供CPU处理。
- 外谁能够与CPU“谈话”(即它们传递给CPU数据或者数据从CPU中取出),有时也相互通信。这些对话发生链接地址管脚和数据管脚的电连接上,所有计算机中的设备都有通用的管脚。这些电线被称为数据总线(data bus),它们形成一种类型的合用线,把CPU连接到计算机的所有其他部件上。我们将外设地址称为I/O地址(I/O address)。
- 在大多数个人计算机中,数据总线是出现在扩展槽(extension slot)中的主要元素,很多外设(尤其是图形卡)就是这些插入扩展槽中的印刷电路板。通过数据总线在扩展槽中的电管脚实现的连接,外设可以与CPU和内存进行对话。
- CPU的即时工作过程在名为寄存器的临时存储容器中进行,寄存器是由晶体管制造的。有些寄存器拥有特殊的,其他寄存器所不具备的权利。而且大多数外设也有寄存器。
- 程序也是数据!
- 每一条指令一般情况下告诉计算机执行一个较小且有限的任务。很多指令被按顺序提交给CPU,以引导其完成更加复杂的任务。而写出那些指令序列实际上就是汇编语言编程。
- CPU执行完一条指令,就转到存储器,按顺序取出下一条指令。在CPU内部,有一个特殊的寄存器,名为指令指针寄存器(instruction pointer),它包含下一条即将从内存中取出和执行的指令的地址。
- 计算机有一个以电驱动的子系统,叫作系统时钟(system clock),它实际上是一个能够以非常精确的时间间隔发出方波脉冲的振荡器,CPU内粗的很多极小的晶体管开关根据系统时钟产生的脉冲来协调它们的行为。
- 一条极为简单的机器指令0100 0000(40H)的原理模型(AX中的值自加1,结果返回AX):
CPU从内存中取出一个字节,改字节二进制码为0100 0000,一旦这个字节完全进入CPU内部,CPU本质上就是将其压入8个晶体管寄存器。现在只有其中一个孤单的位1把它的开关以电的方式“打开”,剩下所有数字((都是为0)把它们的开关关闭。
根据连锁反应,这8个开关反转前几十个开关,然后几百个,然后几千个,甚至有些情况下数以万计的CPU内部的开关状态。在CPU内部发生的众多纳秒级电行为完全是根据intel工程师小组蚀刻在硅芯片上的模式来操纵的。最后,也许在掷了数千个单个的开关后,包含AX寄存器中的纸突然间比它原来的值大了1。 - 我们将一个计算机程序描述为一系列步骤和测试。CPU所能理解的大多数机器指令是步骤,而其余的就是测试了。测试通常是双向测试,而且实际上,关于要做什么
的选择通常相同:跳转,还是不跳转。 - Intel的32位体系结构叫IA-32,新的64位体系结构叫x86-64,它并非Intel原创,而是AMD。
- ROM不管有没有电都会保持它的内容,这钱成千上万条机器指令就不必从磁盘中加载了,因为它们总是位于一个焊接在主板上的ROM芯片中。ROM上的软件称为基本输入输出系统(Basic Input/Output System,简写为BIOS),因为它能够处理计算机的输入设备(例如键盘)和输出设备(例如显示器和打印机)。
- 内存中的所有程序在同一时间内运行。这是通过为每一个加载到内存中的程序赋予一个CPU时间片来完成的。
- 高优先级的任务获取更多的时钟周期,而低优先级任务则获取较少的时钟周期。
- Linux中,内核空间和用户空间之间的通信通过严格控制的系统调用来进行处理。只有运行在内核空间的软件才能直接访问物理硬件(包括内存,显存,外设)。希望使用系统外设的程序只能通过内核模式设备驱动来实现访问。
- 计算机是一个能够之行计划的盒子,大部分操作是在存储器中完成的,这些存储器既包括主板上的常规内存,又包括那些记忆之王——CPU寄存器。
- RAM(random access memory,随机存储器):所谓随机存取,指的是当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置或所写入的位置无关。相对的,读取或写入顺序访问(Sequential Access)存储设备中的信息时,其所需要的时间与位置就会有关系。它主要用来存放操作系统、各种应用程序、数据等。
感想
理解这些底层知识,打好基础,有利于更深的学习。