手写操作系统(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月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
2月前
|
存储 算法 安全
深入理解操作系统:从基础概念到代码实践
【9月更文挑战第23天】本文将带领读者深入探索操作系统的奥秘,从基础概念出发,逐步揭示操作系统的工作原理和设计哲学。我们将通过实际代码示例,展示操作系统如何与硬件交互、管理资源以及提供用户界面。无论你是计算机专业的学生还是对操作系统感兴趣的开发者,这篇文章都将为你打开一扇通往操作系统世界的大门。
67 16
|
6月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
1月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
22 0
|
2月前
|
存储 算法 Unix
探索操作系统:从理论到代码
【9月更文挑战第3天】操作系统是计算机的核心,它管理着硬件和软件之间的交互。本文将从理论出发,深入探讨操作系统的基本原理和功能,然后通过代码示例,展示操作系统是如何在实际中运作的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深度理解。
|
3月前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析的新手指南深入浅出操作系统:从理论到代码实践
【8月更文挑战第30天】在数据驱动的世界中,掌握数据分析技能变得越来越重要。本文将引导你通过Python这门强大的编程语言来探索数据分析的世界。我们将从安装必要的软件包开始,逐步学习如何导入和清洗数据,以及如何使用Pandas库进行数据操作。文章最后会介绍如何使用Matplotlib和Seaborn库来绘制数据图表,帮助你以视觉方式理解数据。无论你是编程新手还是有经验的开发者,这篇文章都将为你打开数据分析的大门。
|
3月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化代码,增强功能深入理解操作系统:从用户空间到内核空间的旅程
【8月更文挑战第29天】本文将引导你深入理解Python装饰器的核心概念、应用场景及其对代码的优化作用。我们将从基础使用到高级应用逐步展开,通过实例展示如何利用装饰器提升代码的可读性和复用性,同时避免常见的陷阱。
|
5月前
|
IDE Oracle Java
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
|
4月前
|
开发工具
环境变量,环境变量就是在操作系统中记录的一些关键性信息,以辅助系统运行,env,echo $PATH可以取出环境变量,全局变量的使用方法是定义,什么时候用,什么时候取,export MYNAME=it
环境变量,环境变量就是在操作系统中记录的一些关键性信息,以辅助系统运行,env,echo $PATH可以取出环境变量,全局变量的使用方法是定义,什么时候用,什么时候取,export MYNAME=it
|
6月前
|
存储 程序员
操作系统的运行机制、中断和异常、系统调用
操作系统的运行机制、中断和异常、系统调用
101 1