系统结构

计算机最早的结构是由冯·诺依曼提出的冯·诺依曼结构,而现代计算机中使用的是总线结构

冯·诺依曼结构

冯·诺依曼提出的冯·诺依曼结构是最早的计算机结构,它明确了计算机的5大部件(储存器,运算器,控制器,输入设备,输出设备)其中运算器和控制器组成了CPU, 储存器又是由内存储器(内存),外存储器(硬盘),Cache(在现代计算机中被集成在CPU中)。此处发散一下,CPU能操作直接操作的外设只有内存(寄存器不是外设),操作其他外设时需要通过IO进行操作或操作设备在内存中的映射

内存映射

这个更简单,显示器的相关操作就是这样的。 在古早时期,计算机中没有显卡,由CPU来直接控制显示器,此处由两种模式,文字模式和图形模式。文字模式就是只能显示文字,想想cmd窗口,那时的电脑就是那样的,全屏黑窗口。而图形模式更为现代,就类似于我们看到的windows系统,可以显示图形化的界面。 无疑文字模式的实现更为简单,在文字模式中内存的0xB8000-oxBFFFF(真实地址)的部分就是显存在内存中的映射。只要我们将要输出的文字信息以ascii码+样式信息的方式写入到这段内存中,显示器就会出现想要的文字
如下代码便是汇编中hello world的实现

mov ax,0xB800  
mov es,ax   
  
mov byte [es:0x0000],'h'  
mov byte [es:0x0001],0x07  
   
mov byte [es:0x0002],'e'  
mov byte [es:0x0003],0x07   
   
mov byte [es:0x0004],'l'  
mov byte [es:0x0005],0x07   
   
mov byte [es:0x0006],'l'  
mov byte [es:0x0007],0x07   
   
mov byte [es:0x0008],'o'  
mov byte [es:0x0009],0x07   
   
mov byte [es:0x000A],' '  
mov byte [es:0x000B],0x07   
   
mov byte [es:0x000C],'w'  
mov byte [es:0x000D],0x07   
   
mov byte [es:0x000E],'o'  
mov byte [es:0x000F],0x07   
   
mov byte [es:0x0010],'r'  
mov byte [es:0x0011],0x07   
   
mov byte [es:0x0012],'l'  
mov byte [es:0x0013],0x07   
   
mov byte [es:0x0014],'d'  
mov byte [es:0x0015],0x07 

Tips:当然通过[[BIOS中断]]进行更简单的实现

冯·诺依曼结构的示意图如下:

冯诺依曼结构.png

总线结构

总线结构的计算机以总线为中心,将五大部件连接。是现代计算机的常见结构。
tips:总线是为多个功能部件提供服务的一组公用信息线,包括地址线,数据线和控制线

IO操作

在汇编中表示为IN,OUT命令,如下是8086汇编读取硬盘中数据的代码:
读取第二个扇区的内容到内存为0x1000的地方


mov edi, 0x1000; 读取的目标内存
mov ecx, 2; 起始扇区
mov bl, 1; 扇区数量

read_disk:

    ; 设置读写扇区的数量
    mov dx, 0x1f2
    mov al, bl
    out dx, al
// ax = 12345678 ah=1234 al=5678
    inc dx; 0x1f3
    mov al, cl; 起始扇区的前八位
    out dx, al

    inc dx; 0x1f4
    shr ecx, 8
    mov al, cl; 起始扇区的中八位
    out dx, al

    inc dx; 0x1f5
    shr ecx, 8
    mov al, cl; 起始扇区的高八位
    out dx, al

    inc dx; 0x1f6
    shr ecx, 8
    and cl, 0b1111; 将高四位置为 0

    mov al, 0b1110_0000;
    or al, cl
    out dx, al; 主盘 - LBA 模式

    inc dx; 0x1f7
    mov al, 0x20; 读硬盘
    out dx, al

    xor ecx, ecx; 将 ecx 清空
    mov cl, bl; 得到读写扇区的数量

    .read:
        push cx; 保存 cx
        call .waits; 等待数据准备完毕
        call .reads; 读取一个扇区
        pop cx; 恢复 cx
        loop .read

    ret

    .waits:
        mov dx, 0x1f7
        .check:
            in al, dx
            jmp $+2; nop 直接跳转到下一行
            jmp $+2; 一点点延迟
            jmp $+2
            and al, 0b1000_1000
            cmp al, 0b0000_1000
            jnz .check
        ret

    .reads:
        mov dx, 0x1f0
        mov cx, 256; 一个扇区 256 字
        .readw:
            in ax, dx
            jmp $+2; 一点点延迟
            jmp $+2
            jmp $+2
            mov [edi], ax
            add edi, 2
            loop .readw
        ret

Tips:以上程序节选自我的操作系统的[[Boot]]程序

辨析

在嵌入式中IIC是一种常见的通信协议,由是一种双线协议,由时钟总线,地址总线组成。这符合总线的定义但与PC上的总线有一定区别。

总线结构的示意图如下:

总线结构.png

五大部件

CPU

由三个部分组成运算器,控制器,Cache(属于储存器)。

运算器又称算数逻辑部件(缩写ALU)主要功能是完成对数据的算术运算,逻辑运算和逻辑判断等操作。

控制器(缩写CU)是整个计算机的指挥中心,负责根据事先给定的命令,发出各种控制信号指挥计算机各部分的工作。

储存器

  • 内存储器

    • Cache
    • 主存
    • 寄存器(在CPU上)
  • 外存储器(属于输入输出设备)

主存

主存就是内存条 缩写RAM
寻址空间=2的位数次方B,e.g.32未电脑的寻址空间为2的32次方B=4,294,967,296B=4GB
此处附上换算方式:1B(字节)=8b(位) 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB 1TB = 1024GB

Cache

Cache是为解决CPU与主存之间,速度不匹配而采用的一种技术,也称高速缓存。分为1级缓存(L1),2级缓存(L2),3级缓存(L3)等。
它的工作原理是基于程序访问的局部性,

Tips: 程序访问的局部性是指在一个较短的时间间隔内,由程序产生的地址通常集中在存储器逻辑地址的很小的范围内

0x01 -> 0x1234
0x02 -> 0x4321

输入/输出设备(I/O设备)

  • 输入设备:程序和数据等信息都需要通过输入设备送入计算机
  • 输出设备:计算的结果或各种控制信号需要通过输出设备传送出去。 计算机的I/O设备或装置统称为外部设备,简称外设。 CPU与外设连接的电路称之为I/O接口

程序运行示意图:

微信图片_20230719151630.jpg