1.环境配置

  • 开发环境:

    • ubuntu20.04.5 WSL
    • sudo apt install nasm: 安装汇编编译器 nasm
    • sudo apt install bochs-x: 安装虚拟机 bochs
    • sudo apt-get install qemu-system :下载安装可以模拟全部硬件的qemu
    • sudo apt install gdb :安装gdb调试器
    • sudo apt-get install gcc-multilib&&sudo apt-get install g++-multilib: 安装在64位的机器上产生32位的程序
  • 参考书籍:

    • 操作系统真相还原
    • 30天自制操作系统
    • Orange’S:一个操作系统的实现

源码地址:yanglianoo/Onix: 基于X86的操作系统,C语言 (github.com)

2.操作系统大纲

  • 系统引导
    • 自写bootloader
    • grub 引导
  • 硬件及驱动
    • CPU : 32位X86架构
    • 显示器:VGA
    • 中断控制器:8259A
    • 键盘
    • 硬盘
    • 时钟:内部时钟,外部时钟
    • 网卡
  • 任务调度:内核进程,用户态线程
  • 中断系统:外部中断、软中断、异常
  • 内存管理
  • 文件系统
  • 系统调用
  • shell
  • 网络

3.计算机组成概述

通常,计算机由以下几部分组成:

  • 负责计算和处理数据的 CPU
  • 负责存储程序和数据的存储器
  • 和外部进行数据交换的 I/O(Input/Output,输入输出装置)。

各部分通过总线连接就构成了一台计算机

img

CPU在运行程序的逻辑如下:

  • 1.将磁盘上的程序加载到内存中

  • 2.读取内存中的指令

    首先,CPU 要把即将执行的指令从内存中读取出来。CPU 中有个 PC(Program Counter,程序计数器)寄存器,其中保存着即将执行的指令的地址。指令的读取是通过将 PC 寄存器的值输出给内存,由内存返回该值对应地址中的指令

  • 3.对指令进行解码

    然后,CPU 对读取的指令所对应的操作进行解码。指令有很多种,有进行各种运算的指令、控制下一条命令的指令、对内存和 I/O 进行读写的指令,还有对 CPU 进行控制的指令。这些指令由 CPU 中被称为指令解码器的模块进行解码。可以用来保存地址和运算结果的寄存器称为通用寄存器(General Purpose Register)

  • 4.执行指令

    最后,CPU 对解码器确定的操作进行处理。CPU 可以从内部存储装置——寄存器或外部的内存读取数据并处理,然后将结果写回寄存器或内存。

img

CPU 执行的指令,由代表操作种类的操作码和代表操作对象的操作数两部分组成。指令本身用特定的二进制序列来表示,这种二进制序列称为机器语言。

img

操作数:通常为寄存器地址、内存地址、立即数等

操作码:对应为cpu具体的操作,如加法、减法等

根据执行的指令的特征,CPU 分为 RISC(Reduced Instruction Set Computer,精简指令集计算机)和 CISC(Complex Instruction Set Computer,复杂指令集计算机)两种

3.1 内存和地址

所有能够存储数据的存储器都可称为内存,内存是用来存放运行时指令(程序)和数据的存储器。

我们一般说的电脑的内存条为DRAM,就是用来保存程序运行时的指令和数据。像固态硬盘、机械硬盘等存储介质也可用于存储指令和数据,但由于其访问速度实在是太慢,因此适用于计算机长期保存数据和程序的存储器。

内存使用地址的概念来管理存储的数据。地址表示的是数据存储的位置,如同数据的住所一样。每个数据单元都有一个地址。大多情况下数据单元是一个字节(8 位)长度。这种方式称为字节编址。不同架构的CPU有不同的编址方式。

img

如上图,CPU可通过总线寻址找到内存空间每个数据单元,并从中取出每个数据单元存储的数据。

内存等存储器的特点是速度越快成本越高。因此通常使用“高速小容量”、“中速中等容量”到“低速大容量”等多种存储器组合的混合型架构。这种构造称为存储器层级。

img

在存储层面,速度最快的是 CPU 中的寄存器。CPU 比内存速度快很多,由 CPU 直 接访问内存效率较低。为了提高内存访问速度,在 CPU 和内存间增加了被称为缓存的高速小容量存储器。

缓存可以暂时性地缓冲存储从内存中读取的数据。CPU 在访问内存时,如果需要的数据已经保存在缓存中,则可直接从缓存中读取,以提高访问效率。根据容量和速度的不同,缓存也分为多个层级,通常为一级缓存、二级缓存等多个级别。

3.2 IO

I/O(Input/Output)是进行数据输入输出的装置。计算机通过 I/O 和外部实现数据交换。计算机的处理操作按照从外部读取数据、在内部处理数据、再向外部输出结果的顺序进行。以个人电脑为例,如下图所示,它从鼠标或键盘输入数据,处理器根据程序处理数据,通过显示器等向外部输出结果。

img

访问 I/O 的方式大致分为存储器映射 I/O端口映射 I/O 两种。

  • 存储器映射 I/O :存储器映射 I/O 方式中,I/O 也和内存一样使用地址进行管理,可以和访问内存一样的方式进行访问

img

  • 端口映射访问:端口映射 I/O 方式中,CPU 含有支持访问 I/O 的专用指令。

img

3.3 字节序

将多字节数据存储在内存中时,各字节的存储顺序称为字节序。比如,将 4 字节数据 0x12345678 放入内存时,地址 0 中放 0x12、地址 1 中放 0x34、地址 2 中放 0x56、地址 3 中放 0x78 的方式,称为大端序。相对地,地址 0 中放 0x78、地址 1 中放 0x56、地址 2 中放 0x34、地址 3 中放 0x12 的方式,称为小端序。不同CPU采用的字节序不尽相同

img

3.4 总线

总线是 CPU、内存和 I/O 之间交换数据的共同通道。总线将一根信号线在多个模块间共享进行通信。

总线包括地址总线、数据总线、控制总线、IO总线,顾名思义数据线是用于数据读取、地址总线用于地址寻址、控制总线用于控制cpu行为。

img

当计算机中的各个组件之间需要进行数据传输和控制信号传递时,总线起到了关键的作用。下面是对四种主要总线的简要介绍:

  1. 地址总线(Address Bus):
    • 作用:地址总线用于传输CPU或其他设备发出的内存或外设的地址信息。
    • 功能:它决定了CPU或其他设备要访问的内存单元或外设的位置。地址总线的宽度决定了系统能够寻址的内存空间大小。例如,32位地址总线可以寻址的内存空间大小为2^32个字节(4GB)。
  2. 数据总线(Data Bus):
    • 作用:数据总线用于传输CPU或其他设备之间的数据。
    • 功能:数据总线承载着实际的数据传输,包括指令、操作数、计算结果等。数据总线的宽度决定了一次可以传输的数据位数,例如,32位数据总线可以一次传输32位(4字节)的数据。
  3. 控制总线(Control Bus):
    • 作用:控制总线用于传输各种控制信号,包括指令控制、时序控制和状态信号等。
    • 功能:控制总线通过不同的信号线传递各种控制信号,例如,读取(Read)和写入(Write)信号用于指示数据传输的方向,时钟信号用于同步操作,中断信号用于通知CPU有外部事件需要处理等。
  4. I/O总线(I/O Bus):
    • 作用:I/O总线用于连接CPU和外部设备之间进行输入输出操作。
    • 功能:I/O总线是一种专门用于输入输出的总线,它提供了一种通信通道,使得CPU能够与外部设备进行数据交换。通过I/O总线,CPU可以发送读取(IN)和写入(OUT)指令来控制外部设备的数据读取和写入。

这四种总线相互配合,构成了计算机系统中各个组件之间的连接和通信桥梁。它们共同工作,使得CPU能够与内存和外设进行数据传输、控制信号传递和输入输出操作,实现计算机的功能。