手写操作系统(2)——代码是怎么运行的?(下)

简介: 手写操作系统(2)——代码是怎么运行的?

手写操作系统(2)——代码是怎么运行的?(中):https://developer.aliyun.com/article/1508452

分析一下“或非”门电路构成的锁存器的工作原理,这其中涉及稳定态和不稳定状态,假设输入之前的Q为1,杠Q为0

  • 当输入R、S都为0,诶?好像这Q和杠Q不会变?是的,此时锁存器输出不变,这有什么用?那就保存了之前数据!比如此时Q一直输出1。
  • 当输入R为0,S为1,此时输出Q也没变,仍为1。难道跟上一个输出一样?不是的。更改一下前提:若之前的Q为0,杠Q为1,这个输入之后,输出Q是多少?是1!这就是所谓的置位。
  • 当输入R为1,S为0,不管之前的Q是多少,最终的Q都是0,也就是复位。
  • 当输入R、S都为1,输出状态不定,因此这个输入是会被电路所规避的。

不太明白?那就祭出真值表吧!下图是RS锁存器的真值表:

139c362f821ad002a5caee5f9df587f0.png 由S-R锁存器派生出各类其他的锁存器和触发器,比如D锁存器、S-R触发器、D触发器等等,有兴趣的可以看看文末的参考链接。


顺带一提,触发器引入了时钟信号的概念,这有什么意义?


其实时钟信号是为了规范计算机中的各类电路的执行时机,就像小时候玩的“321不许动”,只有当固定的时钟信号来临时,各元件才会改变自身的状态。如果没有时钟信号来管理时序,那么各元件的变化就会杂乱无章,极不稳定。


有了锁存器和寄存器,就可以并联构成寄存器,一个锁存器可以存储1位,4个并联就可以存储4位…总之,我们获得了一个可以存储数据的东西了。

译码器与选择器

突然发现我们现在手头可用的元件越来越多的,这就有一个问题,我们如何控制使用哪个元件呢?总不能自己手动更改线路连接吧?

注:以前真的是手动更改。

我们能不能通过输入几位二进制数,就可以实现使用对应的元件呢?就以3位举例。

3位二进制数最多可以表示8个输出(2^3)。


内部怎么实现的?3位的太复杂,找了个2位的将就看看。

上面介绍的这个东西被称作译码器,它将输入的二进制码译成对应的输出高、低电平信号,实现选择逻辑电路的作用。

还有一个问题,**那就是这么多的元件,我们到底选择哪一个的输出呢?就好比水坝放水选择哪一个闸门一样,引出****选择器的概念。**选择器可以根据输入二进制码的状态,选择其中一个作为输出信号。

利用门电路我们可以构造它,有了它就可以获得对应的输出:

sel输入0,那么out就输出a的值,输入1就输出b的值。

上面只能二选一,还可以进一步四选一、八选一等等,下图是四选一选择器:


如果我们将之前得到的各个四则运算器、锁存器、寄存器等等加一个输入端口,该端口(激活引脚)为1,这个元件才能用,利用选择器和激活引脚,我们就可以控制选择的的元器件了。


其实写到这,计算机底层的基础知识也就差不多了,最后再讲一讲编程语言与以上我们所讲解的东西之间的联系。


“终”章

假如有一个CPU,仅有8个引脚,其中4个数据引脚,4个指令引脚。


数据引脚是可以输入数据,指令引脚是用来选择执行的操作。我们定义,当指令引脚输入:


0001 读取数据,将数据引脚的数据读入寄存器;


0010 选择加法器,将数据引脚的数据与寄存器数据相加,结果在寄存器;


0100 选择乘法器,将寄存器的数据乘以数据引脚的数据,结果在寄存器;


1000 清空寄存器。


也许会疑惑怎么通过指令来执行相应的操作呢?不要忘了我们已经有很多可用器件,比如译码器,就可以通过4位的二进制数据,来选择对应的加法器、乘法器等等。


以上就是最简单的指令译码过程,实际场景下的指令当然不止这几种,而是成千上万,其中的逻辑电路就复杂的令人发指了。我们不用考虑复杂场景,仅从最基本的入手,毕竟再复杂的场景也是由基本的元器件构成的。


假如0001 0001 就是输入0001将它保存到寄存器中。


好了,我们以一个计算题来举例:3×5+6,输入依次为:


0001 0011


0100 0101


0010 0110


ok,我们再计算一个“稍微”复杂一点的:3*6+8+9+10+11×5×6×7×8×9+15。


指令输入我就不写了,太麻烦了。这还是我们只定义了4种指令,要是成千上万种这谁顶得住?


我们不妨对指令稍微包装一下,规定:


0001 用MOV表示


0010 用SHL表示


0100 用ADD表示


并且假设现在又多了一个元件可以实现十进制到二进制的转换,那么命令应该为:


MOV 3;


SHL 5;


ADD 6;


稍微好受一点了,这就是所谓的汇编语言,之前仅有0和1的语言称为机器语言。


但是还是觉得有点不顺畅,明明就是计算一个3×5+6,我为啥非得要写三行,一行不行么?!


比如直接输入:

print("%d:/n",3×5+6);

上面的这个就是大名鼎鼎的C语言,在计算机中上面的输入其实是经过一系列称之为“编译和汇编”的操作,编译将C语言转换为汇编语言汇编将汇编语言转换为机器语言

类似于C这样的语言还有很多,比如java、golong、C++、python等等,它们都有一个共同的名字——高级语言

高级?高级就在于使用这些语言来编程,相比于机器语言和汇编语言已经很人性化了,具有很强的可读性。


如果以后出现“终极语言”、“天选语言”也别奇怪,在计算机这条路上前人都是为后人铺路,无论是二极管、门电路、逻辑电路、寄存器、译码器,还是机器语言、汇编语言、高级语言等等,后来者都是在前人的基础之上再造、浓缩、改编、起舞。


这是一个螺旋上升永无止境的迭代之路,这也是为什么标题的“终”要加一个引号的原因,计算机的道路永无止境,个人的学习也是永无止境的。

计算机组成

我们所熟知的计算机组成结构很简单:主机+显示屏+键盘+鼠标。音乐发烧友或者游戏爱好者对音乐要求较高,所以还要加上一个高品质的耳机;程序员可能需要经常拷贝程序,所以还要加上移动硬盘什么的······


上面其实只提到了计算机的硬件部分,一个完整的计算机系统包括硬件部分和软件部分。硬件部分就是你所能看见的、摸得着所有设备、芯片、硬盘、键盘等。软件部分就是电脑启动、电脑运行过程中那些可见或不可见的程序。如图所示:

78771ccdaaa9cc3163923ef5f65bac16.png

上图里的东西太多了,我们将其简化为一下四个部分:CPU、存储器、IO(输入输出设备)、软件

一句话简单介绍几个部分之间的关系:CPU从存储器中获得软件代码并执行,还利用IO设备与用户交互。

CPU

CPU可以说是计算机的灵魂和核心,起着操控全局、数据运算(控制器、运算器)的功能。有关它的实际硬件构成详见之后的“从沙子到CPU”,这里只对其逻辑上的构成进行介绍,即控制单元、存储单元、运算单元。


·控制单元是CPU的控制中心,负责执行指令和操作控制电路等。


·存储单元是存储CPU运行中、运行后的结果元素。


·运算单元主要是对存储单元存储的元素进行逻辑(或、与、非等)运算。


三部分的关系如下:

控制单元

控制单元的组成包括包括:

·指令寄存器IR(Instruction Register):存放指令的仓库,减小CPU去内存中读取指令的次数;


·指令译码器ID(Instruction Decoder):将指令转换为机器码,使得运算单元和寄存器可以理解(进行相应的电路操作);


·操作控制器OC(Operation Controller)等


它依次从存储器(内存/外存)中取出各条指令,放在指令寄存器IR中,通过指令译码器ID确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号(以后会讲)。

存储单元

存储单元的组成包括:

·CPU片内缓存

·寄存器组

它是CPU中暂时存放数据的地方,里面保存着待处理或已处理的数据,CPU访问寄存器所用的时间要比访问内存的时间短。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据。而通用寄存器用途广泛并可由程序员规定其用途,通用寄存器的数目因微处理器而异。


采用寄存器,可以减少CPU访问内存的次数,从而提高了CPU的工作速度。但因为受到芯片面积、集成度以及成本所限,寄存器组的容量不可能很大。在任务管理器中点击性能页面,即有如图所示界面:

74c115cf5c860ab2a313ded640a340e7.png

从图片右下角可以看到,该CPU有三级缓存,并且容量逐渐增大。

运算单元

运算单元可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的。

CPU工作原理大致如下图:


存储器

计算机中的存储器分为内存储器与外存储器。CPU与内存储器直接打交道,即我们常说的内存,它其中存放着当前正在运行的程序与数据,一旦断电,其中的数据就丢失,速度较快。外存储器也是存放数据的媒介,即我们常说的软盘、硬盘、光盘和磁带等,可以长时间保存数据,速度较慢。


IO设备

IO设备即是计算机与用户交互的媒介。如常见的键盘、鼠标、打印机、扫描仪、显示器、读卡机、纸带、耳机等等···


简单来说,就是用户可以看到计算机想我们看到的东西或者输入某些计算机想获取的东西。


软件

软件即是计算机中的程序,它是用户与硬件之间的接口。如果是除软件之外的三个部分是“躯壳”,那么,软件就是“灵魂”,只有当“躯壳”和“灵魂”皆有,这才是一个真正的计算机。


软件还可进一步分为系统软件和应用软件。


前者即常听的Windows、Linux、Android、IOS等等。后者就是用户启动或其他程序调用的软件。比如Word、Excel、QQ、微信等等。


参考链接

灵感来自:


CPU 是怎么认识代码的? - Zign的回答 - 知乎 https://www.zhihu.com/question/348237008/answer/843382847


【数电】(二) 基本逻辑运算与逻辑门电路


https://blog.csdn.net/as480133937/article/details/104554160/


计算机组成与设计


https://www.cnblogs.com/lfri/p/10046360.html


数字电路锁存器详解


https://wenku.baidu.com/view/f7360766cc22bcd127ff0cc0.html


锁存器、触发器、寄存器的区别联系


https://blog.csdn.net/surgeddd/article/details/4683657


数据选择器


https://blog.csdn.net/vivid117/article/details/100747939

相关文章
|
2月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
13天前
|
IDE Oracle Java
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
|
2月前
|
存储 程序员
操作系统的运行机制、中断和异常、系统调用
操作系统的运行机制、中断和异常、系统调用
27 1
|
17天前
|
Linux Shell 程序员
【Linux操作系统】命令的运行原理
【Linux操作系统】命令的运行原理
|
2月前
|
存储 程序员
操作系统(10)----从写程序到程序运行
操作系统(10)----从写程序到程序运行
30 1
|
2月前
|
存储
手写操作系统(2)——代码是怎么运行的?(中)
手写操作系统(2)——代码是怎么运行的?
18 1
|
2月前
|
存储 程序员
操作系统(1)----操作系统的运行机制
操作系统(1)----操作系统的运行机制
25 0
|
2月前
|
安全
手写操作系统(2)——代码是怎么运行的?(上)
手写操作系统(2)——代码是怎么运行的?
26 0
|
16天前
|
存储 缓存 安全
Linux基础——冯诺依曼体系结构与操作系统
Linux基础——冯诺依曼体系结构与操作系统
42 1
Linux基础——冯诺依曼体系结构与操作系统
|
12天前
|
Linux 网络安全 虚拟化
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )

热门文章

最新文章