模拟电路部分

在了解基本电路的原理基础上理解电子管(上过初中高中并学过物理和化学):

电子管

爱迪生效应的发现:在19世纪末期,当爱迪生正在研究电灯泡的时候,他注意到了一个现象:在一个由两个金属片构成的真空空间中,如果一个金属片被加热至高温(比如灯丝),那么在两片金属之间会有一个电流产生,即使另一个金属片没有外加电压也能够吸引带电粒子(但是小爱同学未进行深入研究因为赚不到马内,只是申请了一个专利)

img

弗莱明的科学解释:这是因为热金属片发射了电子,这些电子随后可以被另一个金属片收集起来,即加热的灯丝发射电子,被带正电的金属板吸引,从而产生单向电流这一发现后来成为了热电子发射的基础,并且对电子管的发展起到了重要作用。

img

若上板带正电电子被吸引就可以形成电流:

img

反过来上极板带负电则无法形成电流:

img

显然可以起到整流的作用,第一个二极管由此诞生,开启了电子工业的大门;(看来1%的灵感的确不够用啊)

李·德·弗雷斯特(搞无线电的)的改进:

img

img

第一个三极管由此诞生

img

第三级带正电 加强电子移动

img

第三个极板带负电会削弱电场

img

在第三极发生微小的变化,都会在上极板产生很大的变化: 可以用来放大信号

借此李·德·弗罗斯特改进了意大利马可尼的无线电,解决了信号衰减的问题;

后来他发明了真空电子管;

电子管具有抗电磁干扰,工作温度范围广,在高端音响设备中仍有电子管的身影,也就是HIFI发烧友口中的胆机;

电子管的缺点:

  1. 体积大、重量重:电子管通常比晶体管更大、更重,这限制了它们在便携式或空间受限设备中的使用。
  2. 能耗高:电子管需要较高的电压来工作,且会消耗更多的电力,这导致效率较低。
  3. 寿命较短:电子管的工作寿命通常不如固态器件长,而且它们可能会因灯丝烧断或其他原因失效。
  4. 启动时间较长:电子管需要一段时间预热才能达到正常工作状态,这使得它们不适合需要立即响应的应用。
  5. 稳定性较差:电子管的性能可能会随温度变化而变化,这影响了其稳定性和可靠性。

电子管的缺点显然无法满足电子工业的需求:于是晶体管诞生了

晶体管

三位二战老兵的故事(老兵创业??)

约翰·巴丁(John Bardeen)、沃尔特·布拉顿(Walter Brattain)和威廉·肖克利(William Shockley)。他们在1947年发明了第一个点接触型晶体管,获得诺贝尔物理学奖 这一发明标志着固态电子学时代的开始,并为后来的微电子革命奠定了基础。

我们知道当原子核外电子小于四时容易失去电子,大于4容易得电子,当等于4时就是半导体

img

纯净的半导体 称为本征半导体;

在本征半导体中掺入

img

多了一个电子带负电 不如叫negative半导体吧 简称N型半导体;(需要说明这里的P/N型半导体都是电中性,命名只是便于表诉,不涉及电性)

掺入硼

img

电子少了 就叫Positive半导体吧,简称P型半导体吧

PN节

img

N型半导体中电子浓度高 P型半导体电子浓度低,电子会从N型半导体中跑到P型中去,img

在这过程中电场建立

img

电场建立会约束电子的移动,会将电子往N型那边拉,称为漂移运动,然后当电子达到一定浓度电子又会向P区迁移如此往复,动态平衡 。本质上是中间电场力与质子对电子的电场力之间主次矛盾的相互转换

img

中间的电场区称为PN节。

PN节的导通与截断:

img

当外部电源负极在P区时,电子不断被吸引,中间电场被拉长,电子无法移动,电流截断;

img

反向通电时,电子到N区,随着电子的不断累积,当达到一定值时,就可以克服内电场,电流导通 ! (晶体二极管)导通电压 硅管>=0.7v,锗管>=0.3v

晶体二极管都有了晶体三级管还会远吗?

晶体三极管:

NPN型img

1号区N型 边缘掺入较多P电子较多;发射电子(发射极)

2号区P型 较薄;控制一号电子流入速度(基极)

3号区N型 较厚 电子较少;收集电子(集电极)

1 2号之间导通,大量电子流入2号,2号较薄,无法留住大量电子,电子涌入3号,3号接正极,电子迅速流入正极,2号与3号导通。

电子实际来源于1号,所以1,3号导通。

img

2号较薄消耗的电子比较少,电流小;3号,比较厚消耗电子比较多,电流大;(I=nqvs)

当2号有微小改变时,1号区电子流入速度就会有较大变化,从而引起电子涌入3号速度的巨大变化,从而放大信号。(晶体三极管)

img

  1. PNP型晶体管

发射极为P型半导体、基极为N型半导体、集电极为P型半导体的晶体管称为“PNP型晶体管”。PNP型三极管的电流流向为:发射极流入、集电极流出,电流关系为:IE=IC+IB可以看到正负电荷与“NPN型晶体管”的正负电荷相反。

因为正电荷从P型半导体的发射极流向基极。一部分正电荷被N型半导体的基极电子俘获,成为“基极电流”,其余大部分成为“集电极电流”,成为P型半导体的集电极。

NPN晶体管带有自由电子电荷,PNP晶体管带有正电荷,实际制造的晶体管的性能用“NPN型晶体管”比用“PNP型晶体管”要好。因此,在高频性能方面,“NPN型晶体管”普遍具有优势。

img

场效应管(以cmos为例):

img

二号区域下面形成一个等效电容,在电场力的作用下,P型半导体的电子聚集在2号区域下,电子不断聚集就会向3号区反向扩散(这个区域叫反型层),3号链接的是正极,电子不断流入正极,1号区域链接负极释放电子不断流入2号区形成电流回路

img

img

img

栅极的正负控制电流的通断;

img

将正电为1,负电为0 ,就是01控制着电路的通断,0和1就是计算机开始的地方img

场效应管是各类门电路,集成电路的结构基础;

那么欢迎来到数字电路!

数字电路部分

组合逻辑电路

1854乔治·布尔创造布尔代数将逻辑推理符号化,

1938年香农在硕士论文中将布尔代数与电路结合。

研究如图电路 输出端Y的电压

img

img

img

img

img

在数字电路中对电压的具体值没有要求,只区分高低电平。

img

该电路就是一个与门电路

img

分析该电路,当输入为1时输出为0,相当于一个非门,也可以认为一个反相器

img这些门电路封装一般都封装起来使用如经典的74系列芯片

半加器img img

电路设计的方法:明确需求 画真值表 写出输出方程 化简(公式或者卡诺图)

全加器

img

8个全加器相互组合就可以计算8位二进制的运算

img

那么有减法器吗,显然是可以设计出来的,但是有更好的解决方案,所以提出补码的概念

img

补码表示法在计算机科学中有许多优势

  1. 简化硬件设计:补码使得加法器电路可以同时用于执行加法和减法操作。这是因为补码允许将减法操作转换为加法操作加上求补操作。这减少了处理器中所需的硬件复杂性,并且提高了效率。
  2. 零的唯一表示:在补码中,零只有一种表示形式(例如,8位系统中的0表示为 00000000),这避免了原码或反码中存在的零的两种表示形式(正零和负零)的问题。
  3. 溢出处理简单:当两个补码数相加导致溢出时,结果依然是正确的模数结果。例如,在8位系统中,如果两个正数相加的结果超过了 11111111(十进制255),或者两个负数相加的结果低于 00000000(十进制0),结果会自动“环绕”,并且可以继续用作后续计算的一部分。
  4. 便于实现:补码的编码规则简单明了,易于硬件和软件实现。对于负数,只需要找到该数的绝对值的原码,然后对其按位取反并加一即可得到它的补码。
  5. 自然排序:在补码表示下,数值按照它们的二进制代码自然排序,这意味着你可以直接比较两个补码数的大小,而不需要考虑符号位。
  6. 与无符号整数兼容:补码的表示方式使得有符号整数和无符号整数在内存中的表示是一样的,这有助于简化数据处理和存储。

在计算机领域中我们还需要其他的原件:

img

把多路信号转变为二进制编码;

img

二进制转换为8路信号;

img

在工控领域广泛使用的7447数码管

img

数据选择器,通过输入xx的值选择Y的输出,如xx=00时,输出A路的值,在计算机中可以用它完成内存寄存器的寻址功能

img

时序逻辑电路

img

img

img

两个非门连接,不论输入0还是1都是稳定状态

img

连接两个或非门

img

发现输入不完全由我们确定。

img

输出不变,给输入,输出端取名

img

分析得出当R =0 S=0时,保持上一个输出不变。

img

img

当R=1 S=0 时,Q=1,R=S=0 Q不变 可以认为存入了一位数据,

同样的 当R=0 S=1 时,Q=0,R=S=0 Q不变

img

现在讨论R=S=1,相当于同时撤离两个信号,在现实中由于电路的响应不可能达到决定同时,这与电路在制作时的微小误差有关,所以结果是随机的。下图是在理想状态下模拟:

img

Logism显示震荡发生

同步触发器

img

img

img

让多个触发器都链接同一个CLK,就可以同时写入

img

R与S之间加一个非门就可以只用一个信号完成赋值,也避免了非法输入

img

这就是D触发器

img

只有电平变化时才发生一次动作成为脉冲触发器或叫边缘触发器

img

触发器的应用:寄存器

img

当clk下降沿到来数据被写入

移位寄存器:

img

节省了硬件空间,八位并行可以改为以为串行,在计算机中移位是乘法的重要的作用;

存储器

非易失性存储器:

img

磁盘的写入:img电信号改变磁盘微粒的极性实现写入,读取则是由极性转换成电信号

img

提高了存储密度

img

叠瓦式:写入时容易影响附近的磁密度,所以会利用缓存来暂时存储不应该被修改的数据;

img

还记得cmos管吗?W导通时,cmos导通,电流流向GND;当W不导通时,B导通;起到存储一位比特的目的

img

img

这就是掩膜rom

img

在CMOS间加入一个低熔点的导线,写入时加高压,导丝熔断这就是PROM(可编程ROM)这就是烧录一词的由来;

在原有cmos管上再加入一个浮置栅,浮置栅代电子是,控制栅产生的电场被消除,管子断开,而浮置栅处于二氧化硅中,电子不会离开;可以起到有目的存储的作用

img

img

穿透过程用热电子击穿

img

擦除使用紫外线

这就是Erasable Programmable Read-Only Memory(EPROM)

现在的ROM利用电搽除(EEPROM)

img

颗粒分类:

  1. SLC (Single-Level Cell):

    - 每个存储单元只能存储1位数据(二进制位)。

    - 特点是速度快、寿命长,具有更高的稳定性和更低的错误率。

    - 因此,SLC NAND 通常用于高性能的企业级应用。

    - 由于成本较高,现在比较少见于消费市场。

  2. MLC (Multi-Level Cell):

    - 每个存储单元可以存储2位数据。

    - 相比SLC,它的容量加倍,但速度稍慢,寿命也较短。

    - MLC NAND 提供了一个较好的性价比平衡点,常用于高端消费者SSD和一些企业应用中。

  3. TLC (Triple-Level Cell):

    - 每个存储单元可以存储3位数据。

    - 这种类型的NAND提供了更大的容量,但是其写入速度、擦写周期寿命都低于MLC。

    - TLC NAND 成本较低,因此广泛应用于消费级SSD和其他大容量存储设备。

  4. QLC (Quad-Level Cell):

    - 每个存储单元可以存储4位数据。

    - 它提供了最大的存储密度,但同时拥有最短的使用寿命和最低的写入速度。

    - QLC NAND 主要用于对成本敏感的大容量存储解决方案,如高密度SSD或数据中心中的冷数据存储。

本质是开启电压分为不同精度,如slc只分为开启和断开就只能存储一位,TLC如下图

img

RAM

img

4个mos管组成的 一位存储器;

img

存储单元;

img

等于1导通,0时断开,在内存中选择xy线确定内存单元

img

img

读写控制器 cs’=0 可读可写,=1时被锁死(应用于高速缓存)

img

X=1时,mos导通可以控制电容的充电与放电(数据的写入)x=0,电容被封锁数据就被保存;

读取时,x=1,电容数据流向左侧的电容,被读取但右侧电容电荷流失,所以需要定期刷新(所以称为动态RAM DRAM,前者称为SRAM,静态RAM)补充电荷,读取时还需要放大微弱的电流信号所以,外围电路更加复杂。

DDR

在同步脉冲信号工作的RAM称为 SDRAM(在异步脉冲信号工作的RAM称为 ADRAM)是现在的主流,一开始只有上升沿是驱动信号,在上升和下降沿都可以工作称为 double date rate (DDR)不同改进就是不同的ddr型号

img

img

计算机组成原理

冯诺依曼和哈弗

冯诺依曼架构:不区分程序和数据,灵活性高,调用程序时ROM中程序调入到RAM

img

哈佛架构:简单,一般用于嵌入式设备

img

下面我们来设计基于哈佛架构的8位计算机:

ROM存储器

想像存储器是一个抽屉,每一格可以存储8位数据;地址线就是2的8次方(00000000到11111111),数据线就是2的3次方(比如想知道某个格子的数据就让地址线等于几)

img

RAM

多一个读写控制线

读写控制线=0,读模式

img

写时 读写控制线=1 当有一个脉冲信号时,写入数据;

img

CPU:

寄存器组(锁存器结构)与RAM大致相似

img

img

数据读写都必须经过寄存器组;在RAM中写了两个2个数据相当于(int x = 4;

int y = 4;)

img

运算器:

进行加1运算

img

运算器可以进行多种运算,一位的控制信号显然不够,所以控制信号有4位

img

运算结果不能直接送回RAM,CPU与RAM的交互必须经过寄存器组(MIPS架构的要求)

img

这才是符合MIPS架构的输出方式(but RAM的输出与加法器的输出冲突了)

img

记得数电中有一个叫数选的东西;

img

读取RAM时选择信号为1

img

运算器把运算结果传递到寄存器中时 发现地址线在读取RAM时已经被占用 所以读写地址线分开;

img

img

所以读写控制线就不需要了改为写允许控制线;

img

为1时允许写,为0时不允许写(相当于int x=x+1;)

img

寄存器输出的结果输出到RAM的1号中,但寄存器的读写控制线为0防止其他数据写入寄存器

img

img

运算器和加法器的电气原理:

多路选择器为1时,输出B的原码值

A+B的运算

img

=0时,输出 B取反的值与1在全加器下运算结果

A-B的运算(A+B补)

img

把这个模块封装起来

img

逻辑运算时相似

img

img

ALU

img

img

寄存器组的电气原理

MUX选择 输出哪个寄存器的值 在这里遵循MIPS架构32位的原则为5位

同样的写入数据通过3-8译码器就可以选择需要输入的寄存器,3-8译码器与一个与门相连接,这样就可以实现写允许控制线

img

指令集:

在我们在CPU进行某一运算时,CPU的每一个控制线就会有相应的值,把这些值按一定格式记录下来就形成了指令集(如图展示的是MIPS指令集)

img

img

img

以下内容来自AI

MIPS(Microprocessor without Interlocked Pipelined Stages)指令集是一种采用精简指令集计算(RISC)架构的处理器指令集。MIPS架构最初由斯坦福大学的研究项目发展而来,并于1984年由MIPS计算机公司商业化。MIPS架构以其简单性和规律性而著称,这使得它在计算机架构课程中广受欢迎,因为它在ISA(指令集架构)和实现方面都比较容易理解。

MIPS架构属于RISC(Reduced Instruction Set Computer)架构,与CISC(Complex Instruction Set Computer)架构相比,MIPS架构的指令集更小,指令更简单,这使得它的执行效率更高。MIPS架构的特点是固定长度的32位编码格式,这意味着每条指令都是32位长,这简化了指令的获取和解码过程。

MIPS处理器通常包含以下组件:

  1. 程序计数器(PC):存储下一条要获取的指令的地址。
  2. 指令寄存器(IR):保存当前正在解码的指令。
  3. 寄存器堆:包含32个通用寄存器,用于存储数据和地址。
  4. 算术逻辑单元(ALU):执行算术和逻辑运算。
  5. 内存:用于存储程序和数据。

MIPS指令集包括三种基本类型的指令:

  1. R类型(寄存器类型):这类指令主要用于寄存器之间的操作,如加减乘除和逻辑运算。
  2. I类型(立即数类型):这类指令通常用于涉及立即数的操作,如加载和存储。
  3. J类型(跳转类型):这类指令用于实现程序的跳转操作。

MIPS架构的一个关键特点是其加载/存储架构,这意味着除了加载和存储指令外,所有指令都需要寄存器或常量(立即数)操作数。要操作内存中的数据,MIPS程序必须先将内存值加载到寄存器中,然后使用寄存器操作指令处理这些值,最后将这些值存储回内存。

MIPS处理器的执行过程遵循典型的取指-解码-执行周期(FDX)。在这个周期中,处理器从内存中获取指令,解码指令,然后执行指令。解码过程确定了要执行的操作、使用哪些参数以及结果将存储在哪里。执行过程执行操作并确定获取下一条指令的位置。

MIPS架构的实现通常涉及流水线技术,这使得指令的获取、解码、执行、内存访问和写回可以并行进行,从而提高了处理器的性能。流水线技术允许多个指令同时在不同的阶段被处理,从而提高了指令的吞吐量。

汇编

将人类语言转化为机器语言就是汇编器

img

在程序运行之初,寄存器在等待RAM的输入,RAM也在等待寄存器的输入,这时需要Din1直接输入一个立即数

img

这里本质上就是寄存器赋值,r7寄存器的值一直存0;

PC计数器:

电气原理:

img

我们知道指令存在ROM中,目前为止我们需要执行的每台指令需要我们手动输入,这与计算机自动机要求不符合,我们在ROM的地址线中加入一个PC计算器,在每一个时钟信号的边沿,PC实现加1,则自动执行下一条指令 当然这一部分也在CPU中;

img

目前为止我们的计算机可以自动运行了;

图形化:

IO线路:

img

目前北桥一般被集成到CPU中了

例如我们可以把需要输出的数据储存到几个寄存器中,在把它输出到CPU外部上

img

把指令烧录到ROM中就可以实现输出到显示器

跳转:

比如Jump 7 (不论当前在哪条指令强行到某条指令即PC强行赋值)那么现在来改造PC计数器:

我们的老朋友多路选择器

img

img

这里这个的jump指令与RAM,寄存器组无关 MIPS的高6位为操作码,除此之外26位都可以作为地址码;

img

MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,由MIPS Technologies(前身为MIPS Computer Systems)开发。MIPS指令集以其简洁、高效的设计而闻名,广泛应用于嵌入式系统、网络设备、游戏机等领域。

精简指令集计算机(RISC,Reduced Instruction Set Computer)是一种计算机处理器设计理念,其核心思想是通过简化指令集来提高处理器的执行效率。RISC架构的设计目标是减少每条指令的执行时间,从而在相同的主频下实现更高的性能。

以下内容来自书籍《编码:隐匿在计算机软硬件背后的语言》

汇编语言

汇编语言(Assembly Language)是一种低级编程语言,它与计算机的机器语言(Machine Language)直接对应,是机器语言的一种人类可读的表示形式。汇编语言的来历可以追溯到计算机发展的早期阶段,它的出现是为了解决直接编写机器语言的困难。


1. 机器语言的局限性

在计算机发展的早期,程序员直接使用机器语言编写程序。机器语言是由二进制代码(0和1)组成的,每条指令对应一个特定的操作。例如,早期的计算机程序可能是这样的:

1
00101110 00000001 00000010  ; 某种操作

这种编程方式存在以下问题:

  • 难以阅读和编写:二进制代码对人类来说非常不直观,容易出错。
  • 难以维护:修改和调试机器语言程序非常困难。
  • 移植性差:不同计算机的机器语言指令集不同,程序无法直接移植。

2. 汇编语言的诞生

为了解决机器语言的局限性,汇编语言应运而生。汇编语言使用助记符(Mnemonics)代替二进制代码,使程序更易于阅读和编写。例如:

1
MOV AX, 1  ; 将值1移动到寄存器AX

汇编语言的出现极大地简化了编程过程:

  • 助记符:用简短的英文单词表示操作(如 MOV 表示移动,ADD 表示加法)。
  • 符号化地址:用符号代替内存地址,使程序更易读。
  • 注释:允许程序员添加注释,解释代码的功能。

汇编语言通过 汇编器(Assembler)将助记符转换为机器语言。汇编器是一种工具,它将人类可读的汇编代码翻译成计算机可执行的机器代码。


3. 汇编语言的发展

随着计算机体系结构的演变,汇编语言也在不断发展:

  • 早期汇编语言:20世纪40年代末到50年代初,汇编语言首次出现,用于早期计算机如EDSAC和UNIVAC。
  • 通用汇编语言:20世纪50年代到60年代,随着计算机的普及,汇编语言逐渐标准化,出现了适用于不同计算机的汇编语言。
  • 现代汇编语言:20世纪70年代以后,随着微处理器的出现(如Intel 8086、Motorola 68000),汇编语言进一步发展,支持更复杂的指令集和寻址模式。

4. 汇编语言的特点

汇编语言具有以下特点:

  1. 与硬件紧密相关
  • 汇编语言直接操作CPU寄存器、内存和I/O设备。
  • 不同架构的计算机(如x86、ARM、MIPS)有不同的汇编语言。
  1. 高效性
  • 汇编语言编写的程序通常比高级语言编写的程序更高效,因为程序员可以精确控制硬件资源。
  1. 可移植性差
  • 汇编语言与硬件架构紧密绑定,不同架构的汇编语言不兼容。
  1. 开发效率低
  • 编写汇编语言程序需要更多的时间和精力,适合对性能要求极高的场景。

5. 汇编语言的应用

尽管现代编程更多地使用高级语言(如C、Python),汇编语言仍然在以下领域有重要应用:

  1. 操作系统开发
  • 操作系统的底层代码(如引导程序、中断处理)通常用汇编语言编写。
  1. 嵌入式系统
  • 嵌入式设备(如单片机、传感器)的资源有限,汇编语言可以最大限度地优化性能。
  1. 驱动程序开发
  • 硬件驱动程序需要直接操作硬件,汇编语言是理想的选择。
  1. 性能优化
  • 在性能关键的场景(如游戏引擎、科学计算),部分代码可能用汇编语言编写。
  1. 逆向工程
  • 分析二进制程序时,通常需要将机器代码反汇编为汇编代码。

6. 汇编语言的示例

以下是一个简单的x86汇编语言程序,用于在屏幕上显示“Hello, World!”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
section .data
msg db 'Hello, World!', 0xA ; 定义字符串
len equ $ - msg ; 计算字符串长度

section .text
global _start

_start:
; 写入字符串到标准输出
mov eax, 4 ; 系统调用号(sys_write)
mov ebx, 1 ; 文件描述符(stdout)
mov ecx, msg ; 字符串地址
mov edx, len ; 字符串长度
int 0x80 ; 调用内核

; 退出程序
mov eax, 1 ; 系统调用号(sys_exit)
xor ebx, ebx ; 返回码0
int 0x80 ; 调用内核

补码

补码(Two’s Complement)是计算机科学中表示有符号整数的核心方法

一、补码的定义与基本特性

二进制表示规则

正数:与原码相同,符号位为0。例如,8位系统中+5表示为00000101

负数:符号位为1,其余位为原码取反后加1。例如,-5的原码是10000101,补码为11111011

符号位的作用
最高位(MSB)作为符号位,0表示正数,1表示负数。但补码的符号位同时参与数值运算,而不仅是标识符。


二、数学原理:模运算与同余

模运算的定义
补码的本质是将负数映射到模数(2ⁿ,n为二进制位数)的正数域中。例如,在8位系统中,模为256,-1的补码为255(即11111111),满足:

img

这种映射使得减法可转换为加法运算。

同余的直观解释
类似于时钟的12小时制:

顺时针转3小时(+3)与逆时针转9小时(-9)最终位置相同,即 img

计算机中,补码通过模2ⁿ实现类似“循环”效果,例如8位系统中计算5-3等价于5+253(-3的补码),结果对256取模后得到2。


三、补码的优势与设计逻辑

统一加减法运算
计算机无需单独设计减法器,例如5-3可转换为5+(-3)的补码运算:

00000101 (+5)
+11111101 (-3补码)

(1)00000010 → 舍去溢出位后结果为2

1
这一特性大幅简化了硬件电路设计。
  1. 消除±0歧义
    原码中+0(00000000)和-0(10000000)存在两种表示,而补码中仅保留00000000,-0被映射为模数本身(如8位系统中-0对应100000000,超出位数限制被舍去)。
  2. 连续性与溢出处理
    补码的表示范围对称且连续,例如8位系统范围为-128(10000000)至+127(01111111)。溢出时直接舍弃高位,结果仍符合模运算逻辑。

四、应用场景与限制

  1. 实际应用
  • 数据存储:所有现代计算机均采用补码存储整数。
  • 位运算优化:如位掩码操作、网络字节序转换(Big-Endian与Little-Endian)。
  • 加密与压缩算法:依赖补码的数值循环特性提升效率。
  1. 局限性
  • 范围限制:n位补码仅能表示 imgimg 的整数,超出范围会导致溢出错误。
  • 硬件依赖:补码运算依赖于固定位数,跨平台数据传输时需注意字节对齐。

ASCII码

结合《计算机软硬件背后的语言》中关于计算机底层通信逻辑的论述,ASCII码的诞生与表示可解析如下:

一、ASCII码的诞生背景与技术需求

  1. 早期计算机通信的混乱
    20世纪50年代,不同厂商计算机采用自定义字符编码(如IBM的EBCDIC),导致数据交换时出现乱码和协议冲突。这种“巴别塔困境”迫使行业寻求统一标准。
  2. 标准化组织的推动
    美国国家标准学会(ANSI)联合IBM、AT&T等企业,于1963年发布ASCII初版,1967年完成修订并成为国际标准ISO 646。书籍中强调,这是“硬件抽象层与软件协议首次达成全球共识”。

二、ASCII码的数学本质与硬件实现

  1. 二进制映射逻辑
  • 基于7位二进制数(后扩展为8位)表示128/256种字符,例如:

  • 空格:00100000(十进制32)

  • 数字0:00110000(48)

  • 大写字母A:01000001(65)

  • 书籍指出:“每个字符对应一个唯一的整数编码,本质上是通过模运算建立离散符号与连续电路的桥梁。”

  1. 硬件电路协同设计
  • 输入设备:键盘将物理按键转换为ASCII码(如回车键对应13);
  • 存储系统:磁芯存储器以字节为单位保存ASCII值;
  • 输出设备:点阵打印机根据ASCII码驱动针脚打印字符。

三、ASCII码的分层结构解析

  1. 控制字符(0-31及127)
  • 用于硬件设备控制而非显示,例如:

  • BEL(7):触发蜂鸣器报警

  • LF(10):驱动打印机换行

  • 书籍比喻为“机器间的密语”,实现人机交互之外的设备协同。

  1. 可打印字符(32-126)
  • 包含数字、字母及标点符号,其排列规律体现设计智慧:

  • 数字0-9连续排列(48-57),便于算术运算;

  • 大写字母A-Z(65-90)与小写字母a-z(97-122)间隔排列,通过第六位(bit 5)切换大小写。

  1. 扩展ASCII码(128-255)
  • 加入带音标的欧洲字母、制表符等,书籍批评其“暴露了早期技术对文化多样性的忽视”,为后来的Unicode埋下伏笔。

四、ASCII码对计算机体系结构的影响

  1. 硬件简化设计
  • 7位编码兼容早期6位存储系统(最高位用作奇偶校验),例如:

  • 奇校验:A(65)→ 01000001(含3个1,奇数为1)

  • 偶校验:B(66)→ 11000010(含3个1,补1成偶数)。

  1. 软件生态奠基
  • 编程语言(如C)直接用ASCII码处理字符;
  • 文件格式(如.txt)依赖ASCII定义换行(LF/CR);
  • 网络协议(如HTTP)用ASCII传输头信息。

五、历史局限与现代演进

  1. 缺陷与挑战
  • 仅支持拉丁字母,无法表示中文、阿拉伯语等;
  • 控制字符(如DEL)在现代系统中语义变迁。
  1. Unicode的继承与超越
    如书籍末章所述,Unicode保留ASCII的0-127编码,并通过UTF-8实现兼容,标志着“从机器中心到人类文明的编码哲学转变”。


总线

一、总线的核心功能与设计哲学

  1. 三位一体的通道划分
  • 地址总线:单向传输目标位置信息(如CPU向内存指定读取地址),书中以Intel 8086为例,其20位地址总线可寻址1MB空间。
  • 数据总线:双向传输实际内容(如内存返回的指令或数据),早期计算机(如PDP-11)采用16位数据总线,每次传输2字节。
  • 控制总线:传递时序信号(如读写使能、中断请求),例如Z80 CPU通过MREQ引脚通知外设进入内存访问周期。
  1. 同步机制与带宽瓶颈
    书中对比了两种设计:
  • 同步总线:依赖全局时钟(如ISA总线),时钟频率限制在8.33MHz,导致传输延迟。
  • 异步总线:采用握手协议(如PCI总线),通过FRAME#IRDY#信号协调传输速度,适应不同设备性能。

二、经典总线架构案例解析

  1. IBM PC/AT的ISA总线(1984)
  • 16位数据总线+24位地址总线,最高传输率5.33MB/s。书中批评其“以兼容性之名牺牲性能”,例如保留8位扩展槽导致硬件设计冗余。
  • 典型案例:声卡与显卡争夺总线带宽时,常因DMA(直接内存访问)冲突产生爆音或画面撕裂。
  1. Apple II的扩展总线(1977)
  • 采用“开放式插槽”设计,允许第三方开发扩展卡(如SoftCard Z80卡实现CP/M系统)。书中赞誉其为“个人计算机生态繁荣的基石”。
  • 硬件缺陷:无中断优先级控制,插入多块卡时可能因IRQ冲突死机。
  1. 现代PCI Express分层总线
  • 通过差分信号(LVDS)和串行传输突破并行总线频率瓶颈,如PCIe 4.0 x16带宽达31.51GB/s。书中以NVIDIA GPU与CPU通信为例,说明高速总线对实时渲染的关键作用。
  • 协议栈分层:事务层(TLP包)、数据链路层(CRC校验)、物理层(8b/10b编码),体现“抽象化封装”设计思想。

8位微处理器,例如8080 ,有16位地址,可用来寻址64KB的存储空间。如
果你制作了一个包含4个存体、大小为4KB的存储器板,则存储器板上的16位地址
信号就有如下所示的功能。

img

将4位地址信号与4位开关结合形成一个比较器,

img

根据真值表,只有当一个高电平输入时输出才为高电平,同时输入高电平或同时输入低电平输出都为低电平。

例如将A13和A15对应的开关闭合,就意味着存储器板上能够响应的存储范围为 A000h~Afffh

img

操作系统

定点数和浮点数

一、定点数(Fixed-Point Number)

  1. 设计逻辑与硬件实现
  • 固定小数位分配:通过预定义小数点位置(如16位二进制中,前12位为整数,后4位为小数),将实数离散化为整数处理。例如,二进制00001111 11110000在小数点定位于中间时,表示15.9375。
  • 硬件简化:加减法直接使用整数运算电路,乘法需额外移位操作(如4位小数相乘后右移4位),除法同理。书籍指出:“这是早期计算机在晶体管匮乏时代的经济选择。”

二、浮点数(Floating-Point Number)

  1. IEEE 754标准的核心思想
  • 科学计数法映射:数值表示为 img,其中:

  • 符号位(s):1位,0正1负;

  • 指数(E):8位(单精度)或11位(双精度),采用偏移码(Bias)表示负数;

  • 尾数(M):隐含前导1的规范化形式(如1.xxxxx)。

  • 特殊值处理:定义NaN(非数)、±Infinity(无穷大)等,避免运算崩溃。

  1. 硬件协同设计
  • 专用运算单元:现代CPU集成浮点运算器(FPU),支持并行乘法累加(FMA)指令,例如Intel AVX-512指令集。
  • 精度分级:单精度(32位)、双精度(64位)满足不同场景需求,如单精度用于图形渲染,双精度用于科学计算。

CP/M操作系统

CP/M(Control Program for Microcomputers) 是由加里·基尔代尔(Gary Kildall)于1974年开发的一种早期操作系统,主要用于8位微处理器(如Intel 8080和Zilog Z80)。CP/M 是个人计算机发展史上的重要里程碑,为后来的操作系统(如MS-DOS)奠定了基础。


CP/M 的历史背景

  1. 开发背景
  • 20世纪70年代,微处理器(如Intel 8080)的出现推动了个人计算机的发展。
  • 加里·基尔代尔在开发PL/M编程语言时,意识到需要一个操作系统来管理硬件资源和程序运行,于是开发了CP/M。

CP/M 的架构

CP/M 是一个单用户、单任务的操作系统,其架构分为以下几个部分:

  1. BIOS(Basic Input/Output System)
  • 提供硬件抽象层,负责与硬件设备(如磁盘驱动器、键盘、显示器)交互。
  • BIOS 是CP/M中唯一与硬件相关的部分,其他部分可以移植到不同的硬件平台上。
  1. BDOS(Basic Disk Operating System)
  • 提供文件系统和磁盘管理功能,如文件的创建、读取、写入和删除。
  • BDOS 还提供了一些系统调用(API),供应用程序使用。
  1. CCP(Console Command Processor)
  • 提供命令行界面,用户可以通过输入命令与系统交互。
  • 常见的命令包括 DIR(列出目录)、TYPE(显示文件内容)、COPY(复制文件)等。

CP/M 的文件系统

CP/M 使用一种简单的文件系统,具有以下特点:

  1. 文件命名
  • 文件名由两部分组成:文件名(最多8个字符)和扩展名(最多3个字符),例如 FILE.TXT
  1. 目录结构
  • CP/M 使用扁平目录结构,不支持子目录。
  1. 磁盘格式
  • 磁盘被划分为多个扇区,每个扇区通常为128字节。
  • 文件系统使用文件分配表(FAT)来管理磁盘空间。

CP/M 的命令

CP/M 提供了一系列命令行工具,以下是一些常见的命令:

  1. DIR
  • 列出当前目录中的文件。
  • 示例:DIR
  1. TYPE
  • 显示文件内容。
  • 示例:TYPE FILE.TXT
  1. COPY
  • 复制文件。
  • 示例:COPY FILE1.TXT TO FILE2.TXT
  1. ERA
  • 删除文件。
  • 示例:ERA FILE.TXT
  1. REN
  • 重命名文件。
  • 示例:REN FILE1.TXT TO FILE2.TXT

CP/M 的影响与遗产

  1. 对MS-DOS的影响
  • MS-DOS 的设计借鉴了CP/M的许多特性,包括文件命名规则、命令行界面和API。
  • 早期的MS-DOS 甚至可以通过转换工具运行CP/M程序。
  1. 对个人计算机的推动
  • CP/M 是早期个人计算机的重要操作系统,为许多应用程序(如文字处理、电子表格)提供了运行环境。
  1. 开源与复兴
  • 1980年代后期,CP/M 逐渐被MS-DOS和其他操作系统取代。
  • 近年来,CP/M 的开源版本(如CP/M 2.2)被重新发布,供历史爱好者和开发者研究。

CP/M 的引导过程 是指从计算机启动到加载 CP/M 操作系统的完整流程。由于 CP/M 是为早期 8 位微处理器(如 Intel 8080 和 Zilog Z80)设计的操作系统,其引导过程相对简单,但包含了操作系统启动的核心逻辑。


CP/M 引导过程的步骤

CP/M 的引导过程可以分为以下几个阶段:

1. 硬件初始化

  • 计算机加电后,硬件(如 CPU、内存、磁盘控制器)会进行自检和初始化。
  • CPU 从固定的内存地址(通常是 0x0000)开始执行指令。

2. 加载引导程序(Bootstrap Loader)

  • 在 CP/M 系统中,磁盘的第一个扇区(称为引导扇区)存储了一个小型引导程序。
  • 硬件会从磁盘的引导扇区加载 128 字节的引导程序到内存的固定位置(通常是 0x00000x007F)。
  • 引导程序的主要任务是加载 CP/M 的核心组件(如 BIOS 和 BDOS)。

3. 加载 BIOS 和 BDOS

  • 引导程序从磁盘中加载 CP/M 的 BIOS(Basic Input/Output System)和 BDOS(Basic Disk Operating System)到内存中。
  • BIOS 和 BDOS 通常存储在磁盘的固定位置(如第 2 到第 16 扇区)。
  • BIOS 提供了硬件抽象层,负责与硬件设备(如磁盘驱动器、键盘、显示器)交互。
  • BDOS 提供了文件系统和磁盘管理功能。

4. 加载 CCP(Console Command Processor)

  • 在 BIOS 和 BDOS 加载完成后,引导程序会加载 CCP(Console Command Processor)到内存中。
  • CCP 是 CP/M 的命令行解释器,负责接收用户输入并执行相应的命令。
  • CCP 通常存储在磁盘的固定位置(如第 17 到第 32 扇区)。

5. 启动完成

  • 当 CCP 加载完成后,CP/M 的引导过程结束,系统会显示命令行提示符(通常是 A>),等待用户输入命令。

CP/M 引导过程的详细流程

以下是 CP/M 引导过程的详细步骤:

  1. 硬件初始化
  • 计算机加电后,CPU 从内存地址 0x0000 开始执行指令。
  • 硬件从磁盘的引导扇区加载 128 字节的引导程序到内存地址 0x00000x007F
  1. 引导程序执行
  • 引导程序从磁盘的第 2 到第 16 扇区加载 BIOS 和 BDOS 到内存中。
  • BIOS 和 BDOS 被加载到内存的高地址区域(通常是 0x01000x1FFF)。
  1. CCP 加载
  • 引导程序从磁盘的第 17 到第 32 扇区加载 CCP 到内存中。
  • CCP 被加载到内存的低地址区域(通常是 0x01000x1FFF)。
  1. 系统启动完成
  • 当 CCP 加载完成后,系统会显示命令行提示符(如 A>),等待用户输入命令。

CP/M 引导过程的代码示例

以下是一个简化的 CP/M 引导程序的伪代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
ORG 0x0000  ; 引导程序从内存地址 0x0000 开始

START:
LD HL, BIOS_START ; 加载 BIOS 的起始地址
LD DE, BIOS_LOAD ; 加载 BIOS 的目标地址
LD BC, BIOS_SIZE ; 加载 BIOS 的大小
CALL LOAD_SECTOR ; 调用加载扇区的子程序

LD HL, BDOS_START ; 加载 BDOS 的起始地址
LD DE, BDOS_LOAD ; 加载 BDOS 的目标地址
LD BC, BDOS_SIZE ; 加载 BDOS 的大小
CALL LOAD_SECTOR ; 调用加载扇区的子程序

LD HL, CCP_START ; 加载 CCP 的起始地址
LD DE, CCP_LOAD ; 加载 CCP 的目标地址
LD BC, CCP_SIZE ; 加载 CCP 的大小
CALL LOAD_SECTOR ; 调用加载扇区的子程序

JP CCP_LOAD ; 跳转到 CCP 的入口点

LOAD_SECTOR:
; 从磁盘加载指定扇区到内存
; HL: 扇区起始地址
; DE: 目标内存地址
; BC: 扇区大小
RET

BIOS_START EQU 0x0002 ; BIOS 的起始扇区
BIOS_LOAD EQU 0x0100 ; BIOS 的加载地址
BIOS_SIZE EQU 0x1000 ; BIOS 的大小

BDOS_START EQU 0x0010 ; BDOS 的起始扇区
BDOS_LOAD EQU 0x1100 ; BDOS 的加载地址
BDOS_SIZE EQU 0x1000 ; BDOS 的大小

CCP_START EQU 0x0017 ; CCP 的起始扇区
CCP_LOAD EQU 0x0100 ; CCP 的加载地址
CCP_SIZE EQU 0x1000 ; CCP 的大小

API

操作系统API(Application Programming Interface)是操作系统提供给应用程序的一组函数或系统调用,用于执行以下任务:

  1. 文件操作:创建、读取、写入、删除文件。
  2. 内存管理:分配和释放内存。
  3. 进程管理:创建、终止和管理进程。
  4. 设备管理:访问硬件设备(如键盘、显示器、磁盘)。
  5. 网络通信:发送和接收网络数据。

CP/M中的API

CP/M 的API主要通过 BDOS(Basic Disk Operating System) 提供。BDOS 提供了一组系统调用(称为BDOS函数),应用程序可以通过这些函数访问文件系统、控制台输入输出等资源。

CP/M API 的使用方式

在CP/M中,应用程序通过以下步骤调用API:

  1. 设置寄存器
  • 将函数号(Function Number)放入寄存器 C
  • 将参数放入寄存器对 DE
  1. 调用BDOS
  • 使用 CALL 5 指令调用BDOS入口点(通常位于内存地址 0x0005)。
  1. 处理返回值
  • 返回值通常存储在寄存器 AHL 中。

CP/M的文件操作

CP/M 的文件系统 是 CP/M 操作系统的核心组成部分,负责管理磁盘上的文件和目录。尽管 CP/M 的文件系统相对简单,但它为早期个人计算机提供了基本的文件管理功能,并为后来的文件系统(如 FAT)奠定了基础。


CP/M 文件系统的特点

  1. 扁平目录结构
  • CP/M 不支持子目录,所有文件都存储在一个单一的目录中。
  1. 文件命名规则
  • 文件名由两部分组成:文件名(最多8个字符)和扩展名(最多3个字符),例如 FILE.TXT
  1. 文件分配表(FAT)
  • CP/M 使用文件分配表来管理磁盘空间,记录哪些扇区被哪些文件占用。
  1. 磁盘格式
  • 磁盘被划分为多个扇区,每个扇区通常为128字节。
  • 磁盘的容量通常为 160KB 到 1MB。

CP/M 文件系统的组成

CP/M 文件系统由以下几个部分组成:

  1. 目录区(Directory Area)
  • 目录区存储文件的元数据(如文件名、大小、位置)。

  • 每个目录项占用 32 字节,包含以下信息:

  • 文件名和扩展名(11 字节)。

  • 文件属性(1 字节)。

  • 文件大小(2 字节)。

  • 文件分配的扇区列表(16 字节)。

  1. 数据区(Data Area)
  • 数据区存储文件的实际内容。
  • 文件被划分为多个扇区,每个扇区通常为128字节。
  1. 文件控制块(FCB,File Control Block)
  • FCB 是 CP/M 中用于文件操作的数据结构,包含文件的元数据和状态信息。
  • 应用程序通过 FCB 与文件系统交互,例如打开、读取、写入文件。

CP/M 文件系统的操作

CP/M 提供了一组 BDOS 函数(通过 CALL 5 调用)来操作文件系统。以下是一些常见的文件操作:

1. 打开文件

  • 使用 BDOS 函数 15(打开文件)。
  • 参数:FCB 地址(DE 寄存器)。
  • 返回值:状态码(A 寄存器),0 表示成功。

2. 关闭文件

  • 使用 BDOS 函数 16(关闭文件)。
  • 参数:FCB 地址(DE 寄存器)。
  • 返回值:状态码(A 寄存器),0 表示成功。

3. 读取文件

  • 使用 BDOS 函数 20(顺序读取文件)。
  • 参数:FCB 地址(DE 寄存器)。
  • 返回值:状态码(A 寄存器),0 表示成功。

4. 写入文件

  • 使用 BDOS 函数 21(顺序写入文件)。
  • 参数:FCB 地址(DE 寄存器)。
  • 返回值:状态码(A 寄存器),0 表示成功。

5. 删除文件

  • 使用 BDOS 函数 19(删除文件)。
  • 参数:FCB 地址(DE 寄存器)。
  • 返回值:状态码(A 寄存器),0 表示成功。

CP/M 文件系统的示例

以下是一个简单的 CP/M 程序,用于打开文件、读取内容并显示到控制台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
BDOS_ENTRY EQU 0x0005  ; BDOS 入口点
OPEN_FILE EQU 15 ; 打开文件函数号
READ_FILE EQU 20 ; 读取文件函数号
CONSOLE_OUTPUT EQU 2 ; 控制台输出函数号
FCB_ADDR EQU 0x005C ; FCB 地址(默认位置)

ORG 0x0100 ; CP/M 程序从 0x0100 开始

START:
LD C, OPEN_FILE ; 设置函数号(打开文件)
LD DE, FCB_ADDR ; 设置参数(FCB 地址)
CALL BDOS_ENTRY ; 调用 BDOS

CP 0 ; 检查返回值
JP NZ, ERROR ; 如果失败,跳转到错误处理

READ_LOOP:
LD C, READ_FILE ; 设置函数号(读取文件)
LD DE, FCB_ADDR ; 设置参数(FCB 地址)
CALL BDOS_ENTRY ; 调用 BDOS

CP 0 ; 检查返回值
JP NZ, DONE ; 如果失败,跳转到结束

LD HL, FCB_ADDR+32 ; 数据缓冲区地址
LD B, 128 ; 读取128字节

DISPLAY_LOOP:
LD A, (HL) ; 读取一个字节
LD C, CONSOLE_OUTPUT ; 设置函数号(控制台输出)
LD E, A ; 设置参数(字符)
CALL BDOS_ENTRY ; 调用 BDOS

INC HL ; 移动到下一个字节
DJNZ DISPLAY_LOOP ; 循环显示所有字节

JP READ_LOOP ; 继续读取下一块

DONE:
RET ; 返回 CP/M

ERROR:
LD DE, ERROR_MSG ; 设置错误消息地址
LD C, 9 ; 设置函数号(显示字符串)
CALL BDOS_ENTRY ; 调用 BDOS

RET ; 返回 CP/M

ERROR_MSG:
DB 'Error opening file!$' ; 错误消息

END

MS-DOS 和 UNIX 的发展过程与特点

一、MS-DOS(Microsoft Disk Operating System)

1. 发展过程
  • 起源(1980-1981)
    MS-DOS 的雏形是 QDOS(Quick and Dirty Operating System),由西雅图计算机公司的蒂姆·帕特森开发。1980年,微软以5万美元购得QDOS的授权,并修改为 86-DOS,最终命名为 MS-DOS
    1981年,IBM推出首款个人计算机 IBM PC,选择MS-DOS作为其操作系统,命名为 PC-DOS,从此MS-DOS成为个人计算机的主流操作系统。

  • 版本迭代(1981-1995)

  • MS-DOS 1.0(1981):支持单面软盘(160KB),仅提供基本文件管理功能。

  • MS-DOS 2.0(1983):支持硬盘和子目录,引入树形文件结构,借鉴了UNIX的设计理念。

  • MS-DOS 3.0(1984):支持1.2MB软盘和更大容量硬盘,新增网络功能。

  • MS-DOS 5.0(1991):引入内存管理工具(如HIMEM.SYS),支持扩展内存。

  • MS-DOS 6.22(1994):最后一个独立版本,集成磁盘压缩工具(DriveSpace)和反病毒程序。

  • 逐渐退出历史舞台
    随着 Windows 95 的发布(1995),MS-DOS被整合为Windows的底层子系统,最终被基于NT内核的Windows系统取代。

2. 核心特点
  • 单用户单任务:同一时间只能运行一个程序。
  • 命令行界面(CLI):用户通过输入文本命令(如DIRCOPY)操作系统。
  • 文件系统(FAT):采用 FAT12/FAT16 文件系统,支持8.3格式文件名(主名8字符+扩展名3字符)。
  • 硬件依赖性强:直接操作硬件(如BIOS调用),缺乏现代操作系统的内存保护机制。
  • 轻量高效:系统占用资源少,适合早期低配置PC。
3. 历史意义

MS-DOS推动了个人计算机的普及,为Windows的崛起奠定了基础,其命令行工具(如批处理脚本)至今仍在Windows中保留。


二、UNIX

1. 发展过程
  • 诞生(1969-1970)
    由贝尔实验室的 肯·汤普森(Ken Thompson)丹尼斯·里奇(Dennis Ritchie) 开发,最初用汇编语言编写,后改用C语言重写(1973),成为首个可移植操作系统。

  • 分支与标准化(1970s-1980s)

  • BSD UNIX(1977):加州大学伯克利分校开发,加入TCP/IP协议栈和虚拟内存管理,衍生出FreeBSD、NetBSD等。

  • System V(1983):AT&T的商业化版本,成为UNIX的主流分支之一。

  • POSIX标准(1988):为解决碎片化问题,IEEE制定UNIX兼容性标准,统一系统接口。

  • 开源与衍生(1990s至今)

  • Linux(1991):林纳斯·托瓦兹受Minix启发开发的开源内核,结合GNU工具链后成为完整的类UNIX系统。

  • macOS(2001):苹果基于BSD开发的桌面系统,内核为 Darwin(XNU)

  • 移动端扩展:Android和iOS均间接继承UNIX设计理念(如权限管理、文件系统)。

2. 核心特点
  • 多用户多任务:支持多个用户同时登录并运行多个进程。
  • 模块化设计:遵循“小工具组合”哲学,通过管道(|)和脚本整合简单程序。
  • 一切皆文件:设备、进程、网络接口等均抽象为文件,通过统一接口操作。
  • 可移植性:用C语言编写,可跨硬件平台移植。
  • 强大的网络功能:早期集成TCP/IP协议,成为互联网基础设施的核心。
3. 哲学与影响
  • KISS原则(Keep It Simple, Stupid):强调简洁和功能单一的工具组合。
  • 开源文化:BSD和Linux推动了开源运动,催生Apache、MySQL等关键软件。
  • 现代操作系统基石:macOS、Linux、Android均直接或间接基于UNIX,服务器市场中Linux占主导地位。

三、MS-DOS 与 UNIX 的对比

维度 MS-DOS UNIX
设计目标 个人用户简单操作 多用户、多任务的高可靠性系统
用户界面 命令行(CLI) 命令行(CLI) + 图形界面(X Window)
文件系统 FAT12/FAT16(扁平目录) UFS/EXT/ZFS(树形目录,权限控制)
多任务支持 单任务(TSR程序有限支持多任务) 原生多任务,支持进程调度
源码开放性 闭源 早期开源(BSD)/ 商业闭源(System V)
应用场景 个人计算机 服务器、工作站、嵌入式系统

四、遗产与延续

  • MS-DOS:通过Windows的CMD和PowerShell延续命令行传统,FAT文件系统仍在嵌入式设备中使用。
  • UNIX:Linux成为服务器和云计算的主流系统,macOS和iOS继承UNIX基因,Android通过Linux间接延续。

MS-DOS和UNIX分别代表了个人计算与多用户系统的两大技术路线,它们的演进深刻塑造了现代计算机生态。

键盘(这里以4X4为例说明)

4位计数器的输出同样也是2-4译码器和4-1数据选择器的输入。在没有按键接下的

情况下,选择器的输入全都不为1,因此,其输出也不为1;一旦有某个按键被接下,而

且与4位计数器某一特定输出相对应,那么选择器的输出就为1。例如,如果右上角对角

线方向的第二个开关被按下,且计数器的输出是0110,选择器就会输出1

img

语言

机器语言

计算机是不能直接识别我们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。

早期计算机就是指可以执行机器指令,进行运算的机器。在我们常用的PC机中,有一个芯片,就是我们常说的CPU(Central Processing Unit,中央处理单元)可以完成前面所说的计算机的功能,但是每一种这样的微处理器(CPU)由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。

早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是实际运行时间的几十倍或几百倍,而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。

那么该怎么办呢?这时候汇编语言便产生了。

需要注意的是现在除了计算机生产厂家的专业人员外,一般是不需要学习机器语言了。

2、汇编语言

是一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。 在不同的设备中,汇编语言对应着不同的机器语言指令集。 一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。汇编语言的主体是汇编指令,汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是 ADD。

1
2
3
4
5
操作:寄存器BX的内容送到AX中

1000100111011000 机器指令

mov ax,bx 汇编指令

我们能很明显的从上面两条指令看出区别,汇编指令相对于机器指令是很容易记住的。

可能有人会问,我们用汇编语言编写程序,可是计算机只认识机器指令,那该怎么办?这时候就需要一个能将汇编语言转换成机器指令的工具,我们称其为汇编器(有别于编译器)。程序员用汇编语言写出源代码,再用汇编汇编器将其编译为机器码,最后由计算机执行。

汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。

汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。

再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。

高级语言:

编译器的编译性语言逐字读取源文件识别为短语符号与数字,将其转换成多个机器码指令,而且解释性语言不同,采用边读边执行的方式,不会产生新的文件,解释器要比编写原理简洁,因此更加容易编写,但运输速率更加的缓慢,需要注意的是,Java语言是介于两者之间的语言,它需要通过编译,但编译的结果不是机器码,而是Java字节码,Java字节码与机器码在结构上相似,Java字节码是在虚拟计算机系统环境下被解释即JAVA虚拟机(JVM),因此,Java代码具有平台无关性。

图形化革命

《编码:隐匿在计算机软硬件背后的语言》通过独特的“自底向上”视角,从二进制、电路逻辑等基础概念出发,逐步揭示计算机软硬件的协同设计原理。在探讨“图形化革命”时,作者查尔斯·佩措尔德(Charles Petzold)以技术演进为脉络,结合硬件发展与软件创新,展现了计算机从命令行界面到图形化操作系统的革命性跨越。以下是书中对图形化革命历程的核心阐述:


1. 图形显示技术的演进

图形化革命的基础是显示技术的突破。书中提到,早期的计算机仅能通过文本界面(如ASCII字符)与用户交互,而图形化显示需要硬件和算法的双重支持:

  • 图形显示器的诞生:阴极射线管(CRT)技术使像素点阵显示成为可能,计算机开始支持位图(Bitmap)和矢量图形(Vector Graphics),允许通过编程控制屏幕上的每个像素。
  • 图形加速硬件:图形卡(GPU前身)的出现将图形渲染任务从CPU分离,提升了处理效率,为复杂图形界面奠定了基础。

2. 图形操作系统的诞生

从命令行到图形界面的转变是操作系统领域的关键突破:

  • MS-DOS与早期局限:MS-DOS作为文本界面的代表,依赖命令行输入,用户需记忆复杂指令,操作门槛高。
  • 图形化操作系统的兴起:苹果Macintosh和微软Windows引入“窗口、图标、菜单、指针”(WIMP)交互范式,通过鼠标点击和拖拽简化操作,极大提升了用户体验。
  • 用户接口的哲学:图形界面不仅是技术革新,更体现了“以人为本”的设计理念,使计算机从专业工具变为大众化设备。

3. 面向对象编程的推动

图形化革命与编程范式的演进密不可分:

  • 面向对象语言(OOP)的崛起:如Smalltalk、C++等语言将“对象”概念引入编程,允许将图形元素(如按钮、窗口)封装为可复用的代码模块,简化了图形界面的开发。
  • 事件驱动模型:用户点击、键盘输入等操作通过事件响应机制与程序逻辑绑定,实现了交互式图形应用的设计。

4. 多媒体技术的革新

图形化革命不仅限于视觉,还推动了音频、图像等多媒体技术的标准化:

  • 图像压缩技术:书中以JPEG(有损压缩)、GIF(支持动画)和PNG(无损压缩)为例,解释了不同格式如何平衡图像质量与存储效率。
  • 数字化声音与视频:模拟信号通过模数转换(ADC)变为数字信号,实现了声音和视频的精确存储与编辑,CD、MP3等格式的普及即源于此。

5. 互联网与Web技术的融合

图形化革命最终扩展至全球通信领域:

  • 图形化Web的诞生:HTML与HTTP协议支持超文本和图像嵌入,浏览器(如Netscape)通过渲染引擎将代码转换为可视化页面,万维网(WWW)成为图形化信息共享的核心平台。
  • 跨平台交互技术:Java语言通过“一次编写,到处运行”的理念,借助JVM(Java虚拟机)实现图形应用的跨平台兼容性,进一步推动了图形化应用的普及。