说说内核与计算机硬件结构-程序员宅基地

技术标签: 人工智能  嵌入式  c/c++  

1.内核诸如51/ARM/90/PIC/AVR.....有好多种的,何况内核从来不分类,因为每一家常都可以改内核,你应该问的是架构!!只有懂架构才能用什么片子都驾轻就熟. 我详细的说一下吧. HARVARD(哈佛)架构:ROM(程序空间)与RAM(数据空间)分开,便于程序与数据的同时访问,减少程序运行时访问的瓶颈,提高数据吞吐. PRINCETON(普林斯顿)架构:采用通用计算机广泛使用的ROMRAM合二为一的方式,就是众所周知的冯诺依曼结构,程序指令存储地址和数据指令存储地址指向同一存储器不同位置,因此程序指令和数据的宽度相同. 举例说明:以英特尔为例:MCS-51用的是哈佛架构,而后及产品16位的MCS-96就是普林斯顿架构.ARM公司卖的内核几乎多是哈佛架构的.

2.请问PIC单片机和AVR单片机是51内核的吗?

   不是,都有自己的C编译环境

3.STC51单片机和AT89S51的汇编语言一样吗?

   内核和指令集都是一样的, 所以放心,另外建议你编辑的时候如果对执行时间要求不是很苛刻的话,尽量使用C语言,毕竟通用性好且比较简单

但汇编程序也要会啊!这个可以直接与芯片交流呀!
4.AVR单片机是什么内核?

     答:AVR单片机内核就是AVR内核,和51内核是不一样的,如果内核一样的话,那它的汇编指令应该是一样的,实际上他们的汇编指令是

完全不一样的。AVR是美国ATMEL公司研发的,ATMEL公司有三大系列MCU,一种是老式的以8051内核的单片机,第二种是目前大量使用

的以AVR内核的AVR单片机。第三种是目前高端的以ARM内核的微处理器。ARM已经不是单片机那么简单的概念了,差不多跟电脑CPU类似

了。现在手机上的CPU就是AVR的。

 

5.51系列单片机的区别与特点介绍 

8031/8051/8751是Intel公司早期的产品。

1、8031的特点
     8031片内不带程序存储器ROM,使用时用户需外接程序存储器和一片逻辑电路373,外接的程序存储器多为EPROM的2764系列。用户若想对写入到EPROM中的程序进行修改,必须先用一种特殊的紫外线灯将其照射擦除,之后再可写入。写入到外接程序存储器的程序代码没有什么保密性可言。
2、8051的特点
     8051片内有4k ROM,无须外接外存储器和373,更能体现“单片”的简练。但是你编的程序你无法烧写到其ROM中,只有将程序交芯片厂代你烧写,并是一次性的,今后你和芯片厂都不能改写其内容。
3、8751的特点
     8751与8051基本一样,但8751片内有4k的EPROM,用户可以将自己编写的程序写入单片机的EPROM中进行现场实验与应用,EPROM的改写同样需要用紫外线灯照射一定时间擦除后再烧写。

 


    由于上述类型的单片机应用的早,影响很大,已成为事实上的工业标准。后来很多芯片厂商以各种方式与Intel公司合作,也推出了同类型的单片机,如同一种单片机的多个版本一样,虽都在不断的改变制造工艺,但内核却一样,也就是说这类单片机指令系统完全兼容,绝大多数管脚也兼容;在使用上基本可以直接互换。人们统称这些与8051内核相同的单片机为“51系列单片机”,学了其中一种,便会所有的51系列。

 

6.内核包含中央运算单元+内部总线+指令解析+..........,内核有很多中,8051,Arm,Mips,power PC,这些都是代表人物,还有很多,很多

内核是软件或者硬件的基本核心部分,可以包含软件和硬件。如LINUX的内核就是软件的,是LINUX最基本的部分,其他软件是在内核的基础上发展。51内核是51系列兼容机的基本部分。包含指令系统、和基本的硬件,如内存结构等。其他增强型51单片机,就是在内核的基础上扩展功能。

 

系统性能并不等价于计算能力。较低的功耗、丰富的片内外设以及实时的信号处理能力对于大部分嵌入式应用来说是最为重要的。传统的8位、16位单片机已经很好的处理了这类问题,但是随着当今嵌入式设计不断增长的功能需求和特殊要求,许多微控制器厂商开始抛弃他们传统的8位、16位单片机。但是选择32位处理器对于某些任务来可能并不是最适宜的。下面我们就讨论一下单片机的选型问题。

理解系统性能

MIPS(million instructions per second),是微控制器计算能力的表征。但是,所有的嵌入式应用不仅仅是需要计算能力,所以应用的多样化决定了系统性能衡量方式的多样化,大部分参数都同等重要并且难于用一个参数来表示,我们并不应该仅仅从MIPS就判定系统的好坏。也许某一应用由于成本的限制,需要一款高集成度的微控制器,该控制器需要多个定时器和多种接口。但是另一个应用需要高的精度和快速的模拟转换能力。两者的共同点可能仅仅是供电部分,比如采用电池供电。对于一个实时的顺序处理应用来说,通信的失败可能会导致灾难性后果。这样的场合下就需要一个灵巧的控制器。这个控制器应当能够以正确的顺序处理任务,并且响应时间必须均衡。所有上述应用的共同问题可能就是定期的现场升级能力。

除了与具体的产品要求有关外,系统性能的衡量也可以考虑是否有容易上手、容易使用的开发工具、应用示例、齐全的文档和高效的支持网络。

系统性能的相关问题

1.传统8位单片机的局限

大多数工程师十分关注系统性能,因为越来越多的8位和16位单片机家族已经无法满足当今日益增长的需求。陈旧和低效的架构限制了处理能力、存储器容量、外设处理和低功耗要求。8位的处理器架构,比如8051、PIC14、PIC16、PIC18、78K0和HC08是在高级语言(比如C语言)出现之前开发的,其指令集仅用于汇编开发环境。并且这类架构的中央处理单元(CPUs)缺乏一些关键功能,比如16位的算数运算支持、条件跳转和存储器指针。

许多CPU架构执行一条指令需要若干时钟周期。Microchip的8位PIC家族执行一条最简单的指令需要4个时钟周期,这导致使用20M的时钟仅能达到5MIPS.对于其他CPU架构,比如8051内核。其执行一条指令至少需要6个时钟周期,这就使得实际的MIPS要比给定的时钟频率低很多。

上述代码是一个简单的C语言函数,表1列出了在三种不同CPU架构上编译这段代码的相应结果。8051内核的执行时间几乎是PIC16内核的4倍,对于AVR架构更是达到了28倍。

一些半导体厂商解决了时钟分配问题,使得微控制器实现了单时钟周期指令。当时钟频率为100MHz时,Silicon Labs声称他们基于8位8051架构的微控制器能够达到100MIPS的峰值。但是,这里有几个问题:

第一,由于大部分指令需要两个时钟周期甚至更多,所以其实际能力接近于50MIPS;

第二,8051是基于累加器的CPU,所有需要计算的数据必须拷贝到累加器。查看8051处理器的汇编代码,可以发现65%-70%的指令用来移动数据。由于现代8位和16位单片机架构中有一系列和算术逻辑单元(ALU)相连的寄存器。因此,8051内核的50MIPS仅相当于现代8位和16位单片机架构的15MIPS.

第三,较老的CPU架构缺乏对大容量存储器的支持。早在七十年代,很难想象需要超过64KB存储器的嵌入式应用,这使得许多CPU设计师选择16位的地址总线。因此,CPU、寄存器、指令集以及程序存储器和数据存储器的数据总线始终受此限制。

第四,在2006年,约有9%的8位嵌入式应用使用了64KB甚至更多的程序存储空间,这代表了8位MCU市场26%的收益。推测2009年,14%的8位嵌入式应用会代表36%的收益。而这14%的应用会使用64KB甚至更多的程序存储空间。

从系统性能的角度来看,所有这些使得较旧的8位MCU逐渐失去竞争力。

 

 


2.不适宜32位处理器的场合

旧式CPU架构无法满足当今的市场需求,为了解决这个问题,许多厂商升级至32位的处理平台。对于需要32位处理能力的应用来说这无疑是最棒的选择,但是许多设计师转换到32位平台并非最正确的选择。使用32位MCU来解决8位和16位单片机的自身限制将会导致过高的成本。

大部分32位微控制器无法提供高速、高分辨率的模数(ADC)转换,EMC性能通常较低,且ESD保护较弱。而8位和16位单片机在这些方面优势明显。另外,强的IO驱动能力,可供选择的多种内部、外部振荡器,无需外部器件的片内电压调整器等是8位和16位单片机的另一些优点。

显然,32位CPU包含比任何8位和16位CPU都要多的数字逻辑单元,这导致了高的制造成本。虽然使用一些特殊的半导体工艺可以降低成本,但是弊端是会导致较高的漏电流和静态功耗。某些应用,像水表、燃气表、收费公路电子标签、安全系统等,在他们生命期中的大部分时间,CPU处于睡眠模式,即为停止状态。这类应用的电池寿命必须在5-10年,所以这情况中,不可能将CPU从8位或者16位升级至32位处理器。如果想要提升系统性能只有采用别的方法。

这里有几个定义需要说一下,

  片内(片上)外设与片外外设


外设,顾名思义,就是IC芯片所接的能够与IC通信的外部设备。早起由于IC集成工艺不发达,很多东西都是外设的,在此以DSP芯片为例,比如PWM、ADC、CAN等等,
原本都是需要芯片外接的,即使是现在,仍然有独立的ADC芯片,比如ADS8364等等,但是现在,PWM、ADC等等东西都已经集成在DSP芯片内,当然,
无论如何,芯片总还是会需要外接一些设备实现某种系统,为了与那些外设相区别,就将集成在芯片内,但是又不属于芯片本身(比如DSP,是一种微处理器,
因此芯片中不属于微处理器的部分都是外设)的称为“片上外设”。

片内、外设是两个概念,片内指做成芯片的集成电路内部,简称片内;外设是外部设备的简称,是指集成电路芯片外部的设备。集成电路芯片与外部设备的连接一般需要专门的接口电路和总线的连接(包括控制总线路、地址总线和数据总线等)。 

由于大规模集成电路的技术发展得很快,现在许多芯片在制造时已经能够将部分接口电路和总线集成到芯片内部。对于这部分电路与传统的接口电路和总线是有区别的,为了加于区别可以称之为片内外设,其含义是在集成电路芯片内部集成的用于与外部设备连接的接口电路和总线。 

因此,简单的说,“片内外设”是芯片内部用于与外部设备连接的接口电路和总线。

CPU,内核,寄存器,缓存,RAM,ROM的作用和他们之间的联系?

先附上一张计算机硬件组成图片:

先说 内核
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,
内核并不是计算机系统中必要的组成部分
附一张内核体系结构照片
<img src="https://pic2.zhimg.com/50/361fb165f3dcb07b4f8948d60c746d1e_hd.jpg" data-rawwidth="1024" data-rawheight="768" class="origin_image zh-lightbox-thumb" width="1024" data-original="https://pic2.zhimg.com/361fb165f3dcb07b4f8948d60c746d1e_r.jpg">

链接:https://www.zhihu.com/question/24565362/answer/54451597


可以看到内核所处的位置
CPU:
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
中央处理器主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)和 高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。它与 内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。

寄存器

寄存器是中央处理器内的组成部份。它跟CPU有关。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。

存储器

存储器范围最大,它几乎涵盖了所有关于存储的范畴。你所说的寄存器,内存,都是存储器里面的一种。凡是有存储能力的硬件,都可以称之为存储器,这是自然,硬盘更加明显了,它归入外存储器行列,由此可见——。

内存

内存既专业名上的内存储器,它不是个什么神秘的东西,它也只是存储器中的沧海一粟,它包涵的范围也很大,一般分为只读存储器(ROM)随机存储器(RAM),以及最强悍的高速缓冲存储器(CACHE),只读存储器应用广泛,它通常是一块在硬件上集成的可读芯片,作用是识别与控制硬件,它的特点是只可读取,不能写入。随机存储器的特点是可读可写,断电后一切数据都消失,我们所说的内存条就是指它了。

缓存CACHE

缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

因为缓存往往使用的是RAM(断电即掉的非永久储存),所以在用完后还是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给显卡运算芯片用的缓存,硬盘上也有16M或者32M的缓存。

CACHE是在CPU中速度非常块,而容量却很小的一种存储器,它是计算机存储器中最强悍的存储器。由于技术限制,容量很难提升。

ROM、RAM的区别:

ROM(只读存储器或者固化存储器)

RAM(随机存取存储器)

ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。

RAM有两大类,一种称为静态RAM(Static RAM/SRAM),当数据被存入其中后不会消失。SRAM速度非常快,是目前读写最快的存储设备了。当这个SRAM 单元被赋予0 或者1 的状态之后,它会保持这个状态直到下次被赋予新的状态或者断电之后才会更改或者消失。但是存储1bit 的信息需要4-6 只晶体管。因此它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic RAM/DRAM),DRAM 必须在一定的时间内不停的刷新才能保持其中存储的数据。DRAM 只要1 只晶体管就可以实现。DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很 多,计算机内存就是DRAM的。

DRAM分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等,这里介绍其中的一种DDR RAM。DDR RAM(Date-Rate RAM)也称作DDR SDRAM,这种改进型的RAM和SDRAM是基本一样的,不同之处在于它可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了。这是目前电脑中用 得最多的内存,而且它有着成本优势,事实上击败了Intel的另外一种内存标准-Rambus DRAM。在很多高端的显卡上,也配备了高速DDR RAM来提高带宽,这可以大幅度提高3D加速卡的像素渲染能力。

ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修 改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。

最初,把只能读的存储器叫做ROM(Read Only Memory),并且掉电后数据不会丢失。由于不能改写,因而使用起来很不方便。随着技术的进步,在ROM中使用一些新技术,就可以使它具有可以编程的功能。比较早的是熔丝型的可编程ROM,由于是通过熔断熔丝来编程的,所以这类ROM编程后,就不能再写了,是一次性的(OTP)。后来又出现了EPROM,是通过紫外线来擦除的,并且通过高压来编程,这类ROM上面一般有一个透明的石英玻璃窗,看上去挺漂亮的,它就是用来给紫外线照射的。后来又出现了EEPROM,不用紫外线照射就可以擦除,因而可以直接在电路中编程。另外还有FLASH ROM,又可分为NOR FLASH和NAND FLASH。FLASH ROM一般有一个特点,就是写数据时,可以将1改为0,而不能将0改为1,因而写数据前需要擦除,擦除时将所有数据置1。

之所以依然叫做ROM,归纳一下,大概有几个原因:

①不能像RAM那样快速的写;

②可能需要特殊的擦写电压;

③可能需要特殊的擦写时序;

④可能需要在写之前进行擦除操作;

⑤擦写次数有限,不像RAM那样可以随意写而不损坏;

⑥掉电后数据不会丢失;

⑦有些可写的存储器只能写一次(OTP)。

举个例子,手机软件一般放在EEPROM中,我们打电话,有些最后拨打的号码,暂时是存在SRAM中的,不是马上写入通过记录(通话记录保存在EEPROM中),因为当时有很重要工作(通话)要做,如果写入,漫长的等待是让用户忍无可忍的。

FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦出可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据 (NVRAM的优势),U盘和MP3里用的就是这种存储器。在过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来 Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘)。

目前Flash主要有两种NOR Flash和NADN Flash。NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一快的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户 不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。

一般小容量的用NOR Flash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NAND FLASH,最常见的NAND FLASH应用是嵌入式系统采用的DOC(Disk On Chip)和我们通常用的“闪盘”,可以在线擦除。


转自链接:https://www.zhihu.com/question/24565362/answer/54451597
cpu主要就是处理各种指令,运算、跳转、存取内存之内的。这些指令所需的数据以及指令本身一般都是存储在ram中的。cpu必须将ram中的指令和数据取到cpu中的各种寄存器中,指令才能执行。指令的地址存储在一个叫做PC的寄存器中,注意这边的PC不是个人电脑的意思,而是pointer of code的意思,即指令指针,而数据可以放在各种通用寄存器中。cpu中还有很多其他寄存器,控制着cpu各种功能。如果你学过汇编,便会知道汇编语言即是操作这些寄存器,完成各种运算任务。
现代高性能cpu内部一般都会有缓存,一般分为指令缓存和数据缓存。缓存的访问速度比外部ram要快很多,所以如果把一部分数据和指令存储在缓存中,cpu再从缓存中获取指令和数据能够提高cpu的速度。
可以被称作rom的东西很多,如pc主板上的rom芯片,pc关机后,rom的数据不会丢失,开机时先运行其中的bios程序,完成硬件配置和检测,之后会将磁盘第一个扇区中操作系统的引导程序装入内存,然后徐跳到引导程序。引导程序会进一步将操作系统存储在磁盘上的内核装入内存,最后执行内核程序。内核加载文件系统,并执行gui程序,便可以看到pc的桌面了。

链接:https://www.zhihu.com/question/24565362/answer/74078750
CPU中央处理器,负责执行计算机的运算指令。寄存器是CPU内部的小容量存储器,用来存放CPU将要运算的操作数或者操作数的地址,以及计算机指令或者指令地址,也会有计算结果存在寄存器中。RAM主要指计算机内存,用来存放计算机正在运行的程序的指令以及数据,包括操作系统和应用程序的指令和数据。ROM是只读存储器,其内容掉电不会丢失,一般来讲计算机的BIOS会写在里面,待计算机通电后,这里面的程序会自动被加载到内存中供CPU执行,去读磁盘信息引导DOS或者其他操作系统装入内存。
缓存有两种概念。一种是指硬件高速缓冲存储器cache,用于协调寄存器与内存之间读写速度不匹配而设置的一种存储器。另一种是指人为规定的一个区域(通常是在RAM上划一块区域,这是由操作系统来做的),用来暂时存放一些输入输出数据。
内核也有两种理解,你可以简单的认为CPU就是计算机的内核。
软件也会有内核,比如操作系统内核,主要是只管路计算机硬件资源的部分。

链接:https://www.zhihu.com/question/24565362/answer/126282464

CACHE

i-cache和d-cache区别:

从两个方面来回答: 

一方面是cache的行为。Icache大多都是顺序取指,碰到分支指令也会跳转,而Dcache访问的模式变化比较大.也就是前者所说的pattern的问题.指令只有读和refill没有写,而数据有读也有写.最重要的是冯氏的结构是指令和数据分离.I和D在一起只有相互干扰. 
  
另一个方面就是,物理设计上考虑:
一个union的cache,同时需要数据和指令的访问,端口上是很难实现的。
所以一般在流水线的主干上,都是采用分离的icache和dcache. 
非主干的L2 cache,从容量的角度考虑采用union的方式. 
  

当然早期的也有不分离icache和dcache.因为早期的结构也简单. 

 

Cache的层次设计

出于对简化设计的考虑,也为了提高系统的性能,本次设计采用了指令Cache(以下简称为ICache)和数据Cache (以下简称为DCache)分开的方式。在ICache中存储有微处理器需要的指令,在微处理器的取指阶段,通过程序计数器PC提供给ICache的地址,微处理器可以获取需要的指令。而DCache则是作为一个数据的存储,并提供对于Load/Store指令所要操作地址的数据,它地址则来自于ALU运算的结果。
ICache和微处理器的接口以及ICache和L2 ICache的接口都是单向的。DCache和微处理器的接口以及DCache和L2 Cache的接口是双向的。这样处理的原因在于ICache存储的是指令,不需要更改所存储的数据的值。而DCache中存储的是数据,其值会根据指令操作的不同而改变。比如:在运行Store指令的时候会对DCache中相应地址进行写入数据的操作。

 

整个系统的层次结构如图1所示,由ICache和DCache构成L1 Cache,以及和L1 Cache接口的L2 Cache,和L2 Cache接口的DRAM。其中L1 Cache和L2 Cache是在微处理器片内,而DRAM是作为主存,存在于片外。这跟目前主流的个人电脑的层次结构很相似。 

Cache的结构分析

从微处理器架构的角度来说,所谓的Cache包括了两部分:Cache控制器和Cache存储器。文本所提及的Cache设计也包括了这两个方面。
由于ICache只是读出指令,控制上比DCache要简单许多。所以ICache的设计完全可以参考DCache的设计,本文会针对L1 Cache 中DCache的设计进行详细的描述。

3.1 DCache存储器的结构

Cache存储器其一般实现方式主要有三种,分别是全相联,直接映射和组相联。全相联最灵活但是实现比较复杂。直接映射比较容易实现,但是可能产生快速抖动。组相联则是前两者的一个折衷。本文采用的是两路组相联的方式。
图2:DCache结构图
为了设计方便,整个DCache存储器被分成了两块,为别用来存储标签域(Tag)和数据域(Data)。其结构如图2所示,在数据域中,每一组中包括512行,每行有16字节的数据,在标签域中,每组中都有512行与数据域的行相对应,每一行中有19位的标签。通过地址总线的中间的地址位来选择某一行的数据,同时通过地址总线的高端的地址位来判断DCache是否命中。并且由于读出的是16字节的数据,而设计的微处理器所需要的仅仅是32位的数据,因此在数据被读出后还需要通过地址总线的低端的地址位来选择相应的字段,并把微处理器需要的字段放到数据总线上。

3.2 DCache控制器的结构

DCache控制器在整个DCache中处于非常重要的地位,它控制了整个DCache所要进行的操作,同时会在发生缺失时采取相应的对策。其主要功能如下:
1)反馈给微处理器读取DCache的信息,包括DCache的命中或者缺失等信息。如果发生缺失,可能会要求流水线发生阻塞。
2)如果发生缺失,需要从下一级存储单元寻找相应的地址中的内容,并将内容载入到DCache中。
3)控制读写操作。如果是读操作,则需要为下一级的操作提供相应的数据。如果是写操作,则需要将数据写入到相应的地址中去。
为了完成上述的功能,整个DCache控制器被分为三个部分,分别为用来判断命中还是缺失的判断部分和用来执行发生缺失时一些相应操作的有限状态机部分以及正常读写的控制部分。其中有限状态机部分中还包括了两个存储块,分别是为了实现LRU (least recently used)算法的LRU数据块和为了判断存储的数据有没有被改写过的Dirty数据块,其具体的结构图如图3所示。
图3:DCache控制器的结构图
通过将Tag和地址总线的高地址位比较所得出的hit标志提供给FSM,来确定是否需要启用缺失处理功能。同时FSM可以通过控制L1 Cache和L2Cache的读写,来实现缺失后数据的操作。hit标志同样也会输出到微处理器,使得微处理器在发生缺失的时候阻塞流水线。

4 Cache的操作分析

由于DCache中会发生读或者写两种操作,下面将对DCache中的读写操作分别进行分析。
本文涉及的微处理器由5级流水线构成,分别是取指(IF),指令译码(ID),执行(EXE),内存存取(MEM),回写(WB)。在MEM操作之前是EXE操作,也就是ALU会根据指令的不同,计算出不同的地址值,无论进行的是读或者写操作,都需要进行读DCache中相应地址的Tag值,并通过比较Tag标志位来判断需要读出或者写入的地址单元是否存在于DCache中。

读操作

本设计所采用的读操作的方式是将标签域(Tag)中的内容和数据域(Data)中的内容同时读出,然后再将Tag的内容与地址高端进行比较。如果相等,则说明DCache命中,读出的Data的内容正是给出的地址中的内容。如果不相等,则说明发生了DCache读缺失,需要进行缺失处理。在不发生缺失的情况下,一次读操作可以在一个Clock周期内完成。这非常符合流水线的特性。
如果发生读缺失,DCache中FSM会首先查看LRU块,确定两路数据存储中具有同一索引的两个行中哪一行将会被替换出去。然后FSM会查看Dirty块,确定是否需要将行中的内容更新到主存。如果需要,则将之前读出的数据写入到主存,然后将主存中的数据读出,放到数据总线上,供流水线的下一级使用。如果不需要,则直接读取主存中相应地址的数据并放到数据总线上,供下一级使用。这些操作完成之后FSM会通知微处理器停止阻塞流水线,这样在下一个时钟周期微处理器又会正常运行。
图4:读操作流程图
读操作的具体流程和发生缺失后FSM的相应操作流程如图4所示。

写操作

写操作一般有两种方式分别是写通过(Write-through)方式和写回方式(Write-back)。写通过方式支持改写Cache中的内容,但是不允许Cache和主存内容不一致,因此,对在对Cache进行写操作时,对主存也要进行写操作。这会延长写操作的时间。而写回方式则是对相应的Cache进行写操作,但是并不立即对主存进行写操作,这能有效的减少访问主存的延迟。但是这种方式的实现比较复杂,因为Cache和主存的内容存在不一致性。处于提高性能的考虑,本设计所采用的是写回的方式。
写操作分两步进行,第一步需要读取标签域(Tag) 和数据域(Data)中的内容,然后把Tag的内容与地址高端进行比较。如果相等,则说明DCache命中,需要写入数据的地址存在,可以将数据写入DCache中。同时由于写入的数据只有32位,而读出的数据有128位,需要通过地址总线的低位来进行选择需要写入的字段。如果Tag不相等,则说明发生了DCache写缺失,需要进行缺失处理。在不发生缺失的情况下,一次写操作需要两个Clock周期来完成。这不符合流水线的要求,所以本次设计中采用了流水线式的写入方式,在微处理器和DCache之间加入了一级写缓存。在读取DCache的标签和数据的内容的同时,将数据写入写缓存。这样就能够使得写入操作以流水线的方式进行。可以满足流水线微处理器的要求。
当发生写缺失时,同样FSM会先查看LRU块,确定哪一行需要从两路数据存储块中删除,然后再查看需要从Dcache中删除的行是否为“脏”。如果是“脏”行,则将之前从DCache中读出的数据写入到主存,并将主存的数据读出,并连同之前存入写缓存中的数据,准备写入到DCache中。如果行“干净”,则直接读出主存中的数据,并和写缓存的数据做好写入DCache的准备。完成之后FSM会通知微处理器停止阻塞流水线,这样在下一个时钟周期微处理器又会正常运行,同时将数据写入。

cache高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的RAM位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。因为高速缓冲存储器总是比主RAM存储器速度快,所以当RAM的访问速度低于微处理器的速度时,常使用高速缓冲存储器。

 

Cache(即高速缓冲存储器(Cache Memory),是我们最常听到的一个词了。在老鸟们眼中,这个词或许已没有再谈的必要,因为他们对Cache从设计的必要性到工作原理、工作过程等等都已了如指掌了;而对菜鸟朋友们而言,这些未必就很清楚。那么,它们到底是指的什么呢?不用急,下面就请随笔者一起来全面认识Cache。

为什么要设计Cache?   

         我们知道,电脑的内存是以系统总线的时钟频率工作的,这个频率通常也就是CPU的外频(对于雷鸟、毒龙系列的处理器,由于在设计采用了DDR技术,CPU工作的外频为系统总线频率的两倍)。但是,CPU的工作频率(主频)是外频与倍频因子的乘积。这样一来,内存的工作频率就远低于CPU的工作频率了。这样造成的直接结果是:CPU在执行完一条指令后,常常需要“等待”一些时间才能再次访问内存,极大降了CPU工作效率。在这样一种情况下,Cache就应运而生了!

CACHE
                CACHE

CACHE:Cache是一种特殊的存储器,它由Cache 存储部件和Cache控制部件组成。Cache 存储部件一般采用与CPU同类型的半导体存储器件,存取速度比内存快几倍甚至十几倍。而Cache 控制器部件包括主存地址寄存器、Cache 地址寄存器,主存—Cache地址变换部件及替换控制部件等。至于它们各自又是怎样工作的、有何作用等等,我想我们就没有必要做进一步的研究,知道一般Cache分为L1 Cache(其中又分为数据Cache、代码Cache)、L2 Cache就行了。

CACHE是怎么工作的?/CACHE 

我们知道,CPU运行程序是一条指令一条指令地执行的,而且指令地址往往是连续的,意思就是说CPU在访问内存时,在较短的一段时间内往往集中于某个局部,这时候可能会碰到一些需要反复调用的子程序。电脑在工作时,把这些活跃的子程序存入比内存快得多的Cache 中。CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为“命中”,此时CPU直接从Cache中调用该内容;否则,就称为“不命中”,CPU只好去内存中调用所需的子程序或指令了。CPU不但可以直接从Cache中读出内容,也可以直接往其中写入内容。由于Cache的存取速率相当快,使得CPU的利用率大大提高,进而使整个系统的性能得以提升

CACHE的应用/CACHE 

CACHECPU

 

早在486时代,主板上就设计了Cache插槽,用户可以根据需要自己配置Cache;586级的CPU芯片中已集成了部分Cache,同时还保留了Cache插槽供用户扩充,而到了Pentium Ⅱ时代后,Cache已全部集成到了CPU芯片中,主板上再也没有Cache插槽。现在比较流行的CPU芯片中一般集成了至少16KB的代码Cache 和16KB的数据Cache(作为L1 Cache),以及至少64KB的L2 Cache。

有的朋友可能会问,既然Cache的作用如此重要,那为么不把电脑的全部内存都变为Cache,那样不是更好吗?其实对于这个问题,撇开价格因素,单就其实用性而言也是没有必要的,毕竟,电脑在执任务时,那种使用频率非常高的子程序或指令不是很多的,因此那些使用频率不太高的内容只须保存在速度相对较低的内存中就可以了!

在实际应用中,Cache,尤其是L2Cache对系统的性能,特别是对浮点运算能力有较大的影响。而我们知道,大部分游戏的流畅运行需要频繁的浮点运算。因此,CPU运行游戏的性能的好坏与L2Cache的容量与速度有很大关系。

地址映像

·地址映像 
所谓映象问题是指如何确定Cache中的内容是主存中的哪一部分的拷贝,即必须应用某种函数把主存地址映象到Cache中定位,也称地址映象。当信息按这种方式装入Cache中后,执行程序时,应将主存地址变换为Cache地址,这个变换过程叫作地址变换。地址映象方式通常采用直接映象、全相联映象、组相联映象三种

 

CACHE硬盘

1、直接映像

 

是指每个主存页只能复制到某一固定的Cache页中。直接映像的规律是:将主存的2048页分为128组,每组有16页,分别与Cache的16页直接对应,即主存的第0页、第16页、第32页……只能映像到Cache的第0页。

2、全相联映像

全相联映像是指主存的每一页可以映像可以映像到Cache的任意一页。

3、组相联映像

组相联映像是直接映像与全相联映像的折中方案,它将Cache分为若干组,如8组;每组若干页,如2页;同时将主存分为若干组,如255组;每组内的页数与Cache的组数相同,如8页。组相联映像的规律是主存中的各页与Cache的组号有固定的映像关系,但可自由映像到对应的Cache组中的任意一页。即组间采用直接映像,而组内的页为全相联映像。

替换机构/CACHE 

当CPU访问Cache未命中时,应从主存中读取信息,同时写入Cache。若Cache未满,则直接写入;若Cache已满,则需要进行替换。替换机构由硬件组成,并按替换算法进行设计,其作用是指出替换的页号。常用的替换算法有先进先出算法(FIFO)和近期最少使用算法(LRU)。

读写操作/CACHE 

1、读操作

访存时,将主存地址同时送主存和Cache,一则启动对主存的读操作,二则在Cache中按映像方式从中获取Cache地址,并将主存标记与Cache标记比较:若相同,则访问命中,从Cache中读取数据。因为Cache速度比主存速度快,所以不等主存读操作结束,即可继续下一次访存操作;若不相同,则访问未命中,则从主存中读取数据,并考虑是否按某种替换算法更新Cache某页的内容。

2、写操作

将数据写入主存有两种方法,写回法和些直达法。

写回法:信息暂时只写入Cache,并用标志加以注明,直到该页内容需从Cache中替换出来时,才一次写入主存。优点是操作速度快,缺点是写回主存前,主存中没有这些内容,与Cache不一致,易造成错误。

写直达法:信息在写入Cahce时也同时写入主存。优点是主存与Cache始终保持一致,但速度慢。

Buffer和Cache区别/CACHE 

缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。  

 

CACHE内存
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如 磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。  

 

修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。  

buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。  

cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

相关知识/CACHE 

 通常人们所说的Cache就是指缓存SRAM。 SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变。   

 

CACHE主板 图册
由于CPU的速度比内存和硬盘的速度要快得多,所以在存取数据时会使 CPU等待,影响计算机的速度。SRAM的存取速度比其它内存和硬盘都要快,所以它被用作电脑的高速缓存(Cache)。   

 

有了高速缓存,可以先把数据预写到其中,需要时直接从它读出,这就缩短了CPU的等待时间。高速缓存之所以能提高系统的速度是基于一种统计规律,主板上的控制系统会自动统计内存中哪些数据会被频繁的使用,就把这些数据存在高速缓存中,CPU要访问这些数据时,就会先到Cache中去找,从而提高整体的运行速度。一般说来,256K的高速缓存能使整机速度平均提高10%左右。  

主板上通常都会提供256K到1M的缓存。在CPU内部也有高速缓存,如486CPU有8K的高速缓存,Pentium有16K的高速缓存。Pentium II有32K 一级缓存,AMD K6-2中有64K的一级Cache,AMD K6-3中有64K 的一级 Cache,和256K 的二级Cache,Cyrix MII 中有64K的Cache。  

为了区分它们,CPU内部的缓存叫内部高速缓存(Internal Cache)或一级高速缓存,主板上的缓存叫外部高速缓存(External Cache)或二级高速缓存。不过现在的Pentium II 的CPU已经将主板上的二级缓存封装在CPU的盒子中,AMD K6-3的CPU内部也集成了256K的二级Cache,对于这类CPU来说,主板上提供的已是三级缓存了。



 

 

 

转载于:https://www.cnblogs.com/zhugeanran/p/8435426.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30670925/article/details/98728820

智能推荐

强力推荐!那些你不能错过的 GitHub 插件和工具_github与gitpod的插件-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏19次。http://www.gad.qq.com/article/detail/32503以代码托管平台起家的 GitHub 网站,已然成为全球程序员工作和生活中不可或缺的一份子。从优秀的企业,到优秀的程序员,都将自己最优秀的代码作品存放在这片开源净土里,供彼此学习交流。GitHub Trending 栏目甚至已经成为 IT 从业人员的新闻日报,每日必读。既然 GitHu_github与gitpod的插件

PTPX中的time_based analysis-程序员宅基地

文章浏览阅读1.1k次。根据VCD文件的type,PTPX支持instantaneous peak power analysis和cycle_accurate peakpower analysis。Time-Based Power Analysis支持的VCD type 由于Gate_level和zero_delay的VCD不支持event propa..._ptpx time

VisualSVN安装图解-程序员宅基地

文章浏览阅读79次。VisualSVN安装教程、、、-----------------------------------参考网址:https://www.visualsvn.com/server/download/安装参考网址:http://www.jb51.net/article/71815.htm----------------------------------------------..._安装visualsvn

使用wordpress搭建个人网站保姆级教程_wordpress建站-程序员宅基地

文章浏览阅读8.6k次,点赞7次,收藏97次。图文结合地介绍如何快速搭建一个自己的博客网站_wordpress建站

C语言嵌入式系统编程修炼之道——软件架构篇-程序员宅基地

文章浏览阅读2.4k次。 1.模块划分模块划分的“划”是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念:(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;_c语言嵌入式系统编程修炼之道

多线程 +1操作的几种实现方式,及效率对比_atomicinteger+1-程序员宅基地

文章浏览阅读8.8k次,点赞2次,收藏20次。比较LongAdder ,Atomic,synchronized 以及使用Unsafe类中实现的cas 和模拟Atomic,在多线程下的效率 ,见代码,放开对应注释,运行即可看到结果,通过更改线程数,可以查看不同并发情况下性能对比,通过更改循环执行次数,可以查看长时间或短时间持续并发情况下性能对比;测试服务器cpu 为i3-4170, 4核 3.7GHzimport java.lang.refl..._atomicinteger+1

随便推点

小说网站系统源码|PHP付费小说网站源码带app-程序员宅基地

文章浏览阅读5.3k次。在本文中,我将解释如何将ink与Unity项目集成,以及如何使用ink API与我们的小说网站源码系统进行交互。在我们开始之前,请确保您有一个包含一些对话和选择的墨水文件。您可能想下载并使用我准备的示例故事。这实际上是来自Guilt Free的简化场景,通过分享这一点,我想向您展示一个真实的视觉小说系统源码示例和实际代码的技术。完整源码:xsymz.icu项目设置继续在 Unity 中创建一个新的 2D 项目。然后添加您可以在此处找到的墨水插件。在ink插件文件夹(Plugins/Ink)里会有一_小说网站源码

Swift编码规范_swift 正则判断文件类型-程序员宅基地

文章浏览阅读531次。参考API Design Guidelineshttps://swift.org/documentation/api-design-guidelines/swift-style-guidehttps://github.com/raywenderlich/swift-style-guide项目命名规范一、工程文件夹、文件目录结构【业务模块】1、文件夹采用下划线命名,名字全部小写下划线间隔,如module_login2、文件、类、结构体、枚举、协议采用大驼峰命名,每个单词首字母大写,如 MyCu_swift 正则判断文件类型

关于shell 中return用法解释(转)_shell return-程序员宅基地

文章浏览阅读2.2w次。1、return命令会使得一个函数返回.return命令会返回一个单一的数字参数, 而这个数字参数在调用这个函数的脚本中是可见的.如果没有指定返回参数,return在默认情况下会返回上一次命令的返回代码。2、了解一个概念:return value ﹗我们在 shell 下跑的每一个 command 或 function ,在结束的时候都会传回父行程一个值,称为 return value 。在 shell command line 中可用 $? 这个变量得到最"新"的一个 return value_shell return

Linux编译宏BUILD_BUG_ON_ZERO-程序员宅基地

文章浏览阅读834次。本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel”系列文章中),一来通过内核代码复习一下C语言及汇编语言的语法,二来学习内核开发大牛们书写代码的风格及思路。理解了上面之后,再来看看第二个BUILD_BUG_ON_NULL(e)宏,与第一个类似,-------------------------------------完--------------------------------_build_bug_on_zero

c51语言单片机打铃系统设计,基于单片机的自动打铃系统的设计-程序员宅基地

文章浏览阅读678次。//调用单片机头文件#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255#define uint unsigned int //无符号整型 宏定义 变量范围0~65535#include "eeprom52.h"#include "nongli.h"bit flag_2..._基于单片机的自动打铃控制系统设计提纲

在php中使用SMTP通过密抄批量发送邮件-程序员宅基地

文章浏览阅读550次。这几天,在整一个php在线邮件批量发送的程序来着。如果是一人一封一封发送的话,耗时又久又资源,抄送的话,收件人就会看到其他收件人了,这种时候,密抄就最是适合了。什么是抄送、密抄?抄送就是将一封邮件同时发给多个收件人,各收件人都可以看到其他收件人地址。抄送效果和平时发邮件时,用“,”将地址隔开的差不多密抄和抄送差不多,但是,各收件人都不可以看到其他收件人地址,换句话说,他收到这封..._smtp 密抄

推荐文章

热门文章

相关标签