第一课----从开关到电子管的变化
逻辑运算
&(与), |(或), ^(亦或), ~(非),
电流控制器件
真空三极管
半导体
#### 硅----核心: 在半导体内部电流只能从N向P跑
最外层电子是四个, 硅单质之间形成一组共价键.当从外界掺杂元素时:
N形掺杂 : 掺杂磷元素, 载流子是多出来的电子
P形掺杂: 掺杂B后, 少一个电子, 形成空穴, 可以使电流移动
如果一半是N形掺杂, 一半是P形掺杂, 点在会向P形区域移动。此时P区多出电子,N区少电子,此时N区形成正电,P区形成负电, 形成电场。最终会形成一种平衡,即在P/N区域中间形成一个耗尽层。 如果从N区接负极, P区接正级, 则可正常导流。 如果反接则不可导流。
Chat_Gpt:
N形掺杂(N-type doping):
当硅中掺入五价元素如磷(P)时,磷原子将取代硅原子的位置,由于磷有五个价电子,多出的一个电子成为自由电子,增加了导电性。这种掺杂后的硅被称为N型硅,其中的自由电子是主要的电荷载体。
P形掺杂(P-type doping):
当硅中掺入三价元素如硼(B)时,硼原子也取代硅原子的位置。由于硼只有三个价电子,相对于硅的四个价电子来说,会形成一个电子空穴。这个空穴可以作为载体移动,从而使电流流动。这种掺杂后的硅被称为P型硅,其中的空穴是主要的电荷载体。
PN结和耗尽层:
当N型硅和P型硅结合时,会在接触界面附近形成PN结。在这个区域,自由电子和空穴相遇会发生复合,导致这个区域内形成一个电荷载体较少的耗尽层。耗尽层内部会形成内建电场,阻止电子和空穴的随机扩散。
PN结的导电性:
当外部电压正确极化PN结(正向偏置,即N区接负极,P区接正极)时,耗尽层减小,电子可以从N区跨越到P区,空穴也能从P区移动到N区,因此导通。若反向偏置(N区接正极,P区接负极),耗尽层加宽,阻止载流子通过,因此不导电。
这种控制导电性的能力使得PN结成为许多半导体设备的基础,包括二极管和晶体管。您的解释非常适用于理解半导体器件的工作原理。
MOSFET工作原理
在P区和绝缘层施加电场后, 电子向上移动, 使得两个N区之间形成导通层(被称为N沟道)。 此时 左上方N 叫做 源极S,绝缘层 被称为栅极G,右上方N 即被称为 漏极D 。
当电压高于阈值电压 可以导通, 当电压低于阈值电压 不能导通。 这种结构被称为NMOS管。
当互换上图的N/P位置,此时小电源反接, 则会形成P沟道。此时这种结构被称为PMOS管。
箭头方向代表栅极和衬底之间的电场方向。
CMOS管:
特性
- 电压控制
- 高输入阻抗
- 响应速度快
- 能耗低
- 有N型和P型, 工作方式相反, 组合起来工作
第二课----计算机架构
冯诺依曼架构
冯诺依曼架构组成
两个重要思想
- 采用存储程序原理
- 数据以二进制形式编码
明确计算机组成结构
- 1.运算器, 控制器
- 2.存储器
- 3.输入设备和输出设备
冯诺依曼架构特点
- 1.以运算单元为中心
- 2.采用存储程序原理
- 3.存储器是按地址访问, 线性编址的空间
- 4.控制流由指令流产生
- 5.指令由操作码和地址码组成
- 6.数据以二进制编码
- 7.能自动从存储器中取出指令, 处理后执行
第三课----现代CPU的内部架构与特点
现代CPU特点
- 1.多核多线程
- 2.高频率高性能
- 3.能效优化
- 4.高级缓存系统
- 5.向量化和SIMD指令, 虚拟化支持
- 6.安全性和可靠性
- 7.集成和片上系统(SoC)
CPU执行程序
CPU执行指令流的流程
- 运算数据来源于编译生成的可执行机器码
注: ALU是运算器, 算数逻辑单元的意思
; 指令格式:
Operation Address1, Address2, Address3 ; 3地址指令
三地址指令格式
Addr2和Addr3是元数据地址, Addr1是目的数的地址
; Registrer Transfer Language(RTL)
[8000] = 100 ; 将100 存储到8000地址
[8000] = [8000] + 1 ; 将8000地址中的数据+1
; []表示里面的值所对应的存储空间, 例如[P]代表P值所对应的存储空间
; = 或者 <- 代表赋值. 因此第一条也可写作 [8000] <- 100
两地址指令格式
Operation Address1, Address2
前者是源数据地址也是目的数地址, 后者是源数据地址
单地址指令
Operation Address1
常见于测试指令, 跳转指令
计算机的六大类指令
MOV A, B
; 将B的值赋给A(一般来说是直接赋值到寄存器去. MOV R1, #10 这句话意思是直接将整数10赋值给R1寄存器)
LOAD A, B
; 从B地址取出一个数据将其装在到A寄存器
STORE A, B
; 把A寄存器中的内容存储到B地址(内存)
ADD A, B, C # ADD A, B
; 将B,C中的数据取出, 运算后放入A
TEST A
; 测试分支
BEQ Z
; 函数调用
在线编译器: https://godbolt.org
“PC”通常指的是“程序计数器”(Program Counter),它是计算机中的一个特殊的寄存器,用于存储即将被执行的指令在内存中的地址。程序计数器的功能和重要性可以从以下几个方面来理解:
- 指令定位: 程序计数器存储着当前正在执行的指令的位置或下一条指令的位置。当一条指令执行完成后,PC会更新为下一条指令的地址,这样CPU就可以知道接下来要从哪里获取指令。
- 指令顺序控制: 程序计数器帮助确保指令按正确的顺序执行。在大多数情况下,PC的值会递增,指向下一条连续的指令。但在执行跳转(例如条件分支或循环)等控制流指令时,PC的值会改变到一个非连续的地址。
- 支持循环和分支: 通过修改程序计数器的值,CPU可以实现代码中的循环和条件分支操作。例如,在一个条件语句或循环语句中,程序计数器可以根据条件的评估结果跳转到不同的代码段。
- 中断和异常处理: 在中断或异常发生时,程序计数器的当前值通常会被保存在特定的寄存器或内存位置。这允许处理器暂停当前程序的执行,转而处理中断或异常事件,事件处理完成后再恢复程序的执行。
总的来说,程序计数器是确保程序正确执行的关键组件,它连续地追踪指令执行的顺序和位置。在计算机架构的学习中,理解和掌握程序计数器的工作原理是非常重要的。
总结
- 1.CPU只能执行机器码
- 2.高级语言程序需要编译生成机器码才能执行
- 3.CPU所执行指令全部来自存储器
- 4.指令中包含操作和数据
- 5.执行过程需要借助CPU内的寄存器
- 6.CPU内部的PC寄存器的特殊作用
条件判断指令处理(ARM汇编指令和标签不区分大小写)
★ARM内核中典型的寄存器
后五行都是专用寄存器。
R13是sp栈寄存器, 其中存储的内容是栈空间栈的地址.
R14就是lr返回寄存器(链接寄存器)
R15 就是PC(program count)寄存器, CPSR状态寄存器,用于保存当前指令执行完毕后的状态。SPSR状态寄存器,用于保存当前程序状态, 常用于异常处理中的状态恢复
CPSR寄存器
1.条件标志位(Flags):
- N(Negative): 当结果为负时置位
- Z(Zero): 当结果为0时复位
- C(Carry): 算数运算中, 如果最后一次操作产生了进位或错位, 则置位
- V(overflow): 当发生有符号数运算溢出时置位
CPU循环处理
ARM内核中的可用条件语句
影响循环处理的部分因素
- 1.数据依赖性
- 2.分支预测
- 3.寄存器分配
回顾
- 1.跳转指令其实就是改变PC寄存器(R15)
- 2.如果要带条件就看CPSR寄存器的NZCV
- 3.条件执行的区域取决于CPSR的条件变化
- 4.指令的条件码根据不同的数据的比较选择
函数调用的底层处理
没有参数的返回和调用
- 1.bl指令同时影响两个寄存器pc(r15)和lr(r14)
- 2.mov r15,r14指令将把lr里保存的指令地址恢复到PC中, 实现函数的返回
START
mov r0, #8
mov r1, #6
bl GCD
mov r0, #118
mov r1, #223
bl GCD
b START
GCD
cmp r0, r1
moveq pc, lr
subgt r0, r0, r1
suble r1, r1, r0
b GCD
STOP
函数参数传递
- 1.少于等于三个参数时, 直接使用r0,r1,r2存放第一第二第三个参数
- 2.再多的参数通过保存到栈空间, 使用时从栈空间取出。
函数返回数据的处理
- 1.有返回值,通过r0寄存器传递
寄存器中的数据保存
- 1.为了避免影响, 在函数内使用的寄存器, 使用前要先保存, 使用后返回前要恢复
- 2.如果函数内还要调用函数, 要先对lr进行保存, 然后再进行bl跳转, 第二级调用返回后先恢复lr, 再进行第一季调用的返回
START
mov r0, #8
mov r1, #6
mov r2, #10
mov r3, #15
bl ADD_GCD
b STOP
ADD_GCD
mov r6, lr ;保存程序入口, 因为在ADD_GCD函数中调用其他函数会引起lr被覆盖
bl MYADD
mov r7, r0 ;将返回值保存在r7
mov r0, r2
mov r1, r3
bl MYADD
mov r1, r0
mov r0, r7
bl GCD
mov lr, r6 ;装载程序入口
mov pc, lr
MYADD ; ADD函数
add r0, r0, r1
mov pc, lr
GCD
cmp r0, r1
moveq pc, lr
subgt r0, r0, r1
suble r1, r1, r0
b GCD
STOP
数据保存到内存
- 1.先要知道保存到内存的位置(即地址) ---- sp中的栈地址必须是4的整数倍
- 2.使用str可以把寄存器中的数据保存到指定内存
- 3.使用ldr可以将指定内存中的数据读取到寄存器中
- 4.注意:2, 3 条必须对寄存器和内存操作, 不能直接把一个常数保存到内存中
总结
- 1.使用bl指令在跳转的同时会保存跳转前将要执行的下一条指令
- 2.函数返回, 其实就是将bl跳转时保存的地址给PC
- 3.如果要在函数中使用寄存器, 需要先保存原来的值, 并在返回前恢复这些值
- 4.一般情况下, 在处理C语言函数的返回值时, 默认使用r0保存返回值。
CPU如何使用内存空间
函数内常规操作流程
-
1.如果需要, 保存必要的寄存器内容
-
2.操作sp, 分配需要的内容空间
-
3.运行函数相关功能
-
4.释放分配的空间
-
5.恢复保存过的寄存器的值, 并使程序返回
START
mov sp, #1000
bl MAIN
b START
MAIN
sub sp, sp, #4 ; 栈空间降低
str lr, [sp]
mov r0, #10
bl FUNCA
mov r0,#20
mov r1,#30
bl FUNCB
ldr pc,[sp] ;这一句相当于C语言中的main函数的return 0;
;mov pc, lr
FUNCA
sub sp, sp, #4
str r0 , [sp]
add r0, r0, r0
str r0,[sp]
add r0, r0, r0
str r0,[sp]
sub sp, sp, #12
mov r1,#100
str r1,[sp,#8]
add r1, r1, #10
str r1, [sp,#4]
add r1,r1,#10
str r1, [sp]
add sp,sp, #16
mov pc, lr
FUNCB
sub sp,sp,#8
str r0, [sp, #4]
str r1, [sp]
add r0, r0, r1
add sp, sp, #8
mov pc, lr
STOP
栈所分配的空间局部有效
- 1.不可以在退出函数后继续使用, 对应的存储空间会有别的函数使用
全局变量
- 1.全局变量的定义DCD或DCB
- 2.全局变量的内容会一直存在
- 3.全局变量所有函数都可以访问
- 4.全局变量太多了不方便管理
START
mov sp, #1000
mov r0, #G_X
ldr r1, [r0]
mov r2, #123
str r2, [r0]
mov r0,#G_Y
str r2,[r0,#8]
ldr r1, [r0, #12]
b START
STOP
G_X DCD 1
G_Y DCD 2,3,4,5 ; DCD定义, 每个单元都是4个字节
G_Z DCB 100,0,0,0 ; DCB定义4个字节, 对于每个字节进行赋值, 这种方式定义的全局变量实际值与大端系统或者小端系统有关
总结
- 1.函数内对存储空间的使用都是通过sp进行减操作,返回时用加恢复到原来的值。
- 2.也可以把sp保存在寄存器当中, 在函数返回前从对应的寄存器中恢复。
- 3.进入函数时的sp和退出时需保持一致。
- 4.函数内的局部变量,退出后无法再使用。
- 5.全局变量对应的地址空间的可见性是整个程序
第一章全部内容总结
- 1.计算机的核心处理单元处理都是由晶体管构建的门电路组合而成。
- 2.现在计算机整体结构接近冯诺依曼提出的存储型计算机,包括五部分组成:运算器、控制器、存储器、输入设备、输出设备。
- 3.CPU内在通用寄存器, 也有专用寄存器,要掌握这些寄存器的典型用途,NZCV条件码可以控制指令有条件进行。
- 4.CPU主要运行过程是通过读取PC指向的指令后进行译码和执行,PC自动指向下一条指令,或者有指令强制跳转,如果是函数调用,要记得能正常返回。
- 5.在函数内使用内存主要依赖sp的动态变化。
- 6.全局变量,在程序运行前就会分配好地址,只要能拿到这个地址,就可以访问