精华内容
下载资源
问答
  • 2 3 高速缓冲存储器(Cache) 内存地址格式 全相联 直接相联 组相连

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    2.3 高速缓冲存储器(Cache)

      2.3.1 高速缓冲存储器的功能、结构与工作原理

      高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。 Cache的功能是用来存放那些近期需要运行的指令与数据。目的是提高CPU对存储器的访问速度。为此需要解决2个技术问题:一是主存地址与缓存地址的映象及转换; 二是按一定原则对Cache的内容进行替换。
      Cache的结构和工作原理如图2.3.1所示。

      主要由三大部分组成:
      Cache存储体:存放由主存调入的指令与数据块。
      地址转换部件:建立目录表以实现主存地址到缓存地址的转换。
      替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

      2.3.2 地址映象与转换

      地址映象是指某一数据在内存中的地址与在缓冲中的地址,两者之间的对应关系。下面介绍三种地址映象的方式。

      1.全相联方式

      地址映象规则:主存的任意一块可以映象到Cache中的任意一块
      (1) 主存与缓存分成相同大小的数据块。
      (2) 主存的某一数据块可以装入缓存的任意一块空间中。
      全相联方式的对应关系如图2.3.2所示。如果Cache的块数为Cb,主存的块数为Mb,则映象关系共有Cb×Mb种。

      图2.3.3示出了目录表的格式及地址变换规则。 目录表存放在相关(联)存储器中,其中包括三部分:数据块在主存的块地址、存入缓存后的块地址、及有效位(也称装入位)。由于是全相联方式,因此,目录表的容量应当与缓存的块数相同。

      举例:某机主存容量为1M,Cache的容量为32KB, 每块的大小为16个字(或字节)。 划出主、缓存的地址格式、 目录表格式及其容量。
      
      容量:与缓冲块数量相同即211=2048(或32K/16=2048)。  优点:命中率比较高,Cache存储空间利用率高。
      缺点:访问相关存储器时,每次都要与全部内容比较,速度低,成本高,因而应用少。

      2.直接相联方式

      地址映象规则: 主存储器中一块只能映象到Cache的一个特定的块中。
      (1) 主存与缓存分成相同大小的数据块。
      (2) 主存容量应是缓存容量的整数倍,将主存空间按缓存的容量分成区,主存中每一区的块数与缓存的总块数相等。
      (3) 主存中某区的一块存入缓存时只能存入缓存中块号相同的位置。
      图2.3.4示出了直接相联映象规则。 可见,主存中各区内相同块号的数据块都可以分别调入缓存中块号相同的地址中,但同时只能有一个区的块存入缓存。由于主、缓存块号相同,因此,目录登记时,只记录调入块的区号即可。

      图2.3.5示出了主、 缓冲地址格式、目录表的格式及地址变换规则。主、缓存块号及块内地址两个字段完全相同。目录表存放在高速小容量存储器中,其中包括二部分:数据块在主存的区号和有效位。目录表的容量与缓存的块数相同。

      地址变换过程:用主存地址中的块号B去访问目录存储器, 把读出来的区号与主存地址中的区号E进行比较, 比较结果相等,有效位为1,则Cache命中,可以直接用块号及块内地址组成的缓冲地址到缓存中取数;比较结果不相等,有效位为1, 可以进行替换,如果有效位为0,可以直接调入所需块。
      优点:地址映象方式简单,数据访问时,只需检查区号是否相等即可,因而可以得到比较快的访问速度,硬件设备简单。
      缺点:替换操作频繁,命中率比较低。
      举例:上例中,主存容量为1M, Cache的容量为32KB,每块的大小为16个字(或字节)。划出主、缓存的地址格式、目录表格式及其容量。
      
      容量:与缓冲块数量相同即211=2048(或32K/16=2048)。

      3.组相联映象方式

      组相联的映象规则:
      (1) 主存和Cache按同样大小划分成块。
      (2) 主存和Cache按同样大小划分成组。
      (3) 主存容量是缓存容量的整数倍,将主存空间按缓冲区的大小分成区,主存中每一区的组数与缓存的组数相同。
      (4) 当主存的数据调入缓存时,主存与缓存的组号应相等,也就是各区中的某一块只能存入缓存的同组号的空间内,但组内各块地址之间则可以任意存放, 即从主存的组到Cache的组之间采用直接映象方式;在两个对应的组内部采用全相联映象方式。
      图2.3.6示出了组相联的映象关系, 图中缓存共分Cg个组,每组包含有Gb块; 主存是缓存的Me倍,所以共分有Me个区, 每个区有Cg组,每组有Gb块。那么, 主存地址格式中应包含4个字段:区号、区内组号、组内块号和块内地址。 而缓存中包含3个字段:组号、组内块号、块内地址。主存地址与缓存地址的转换有两部分,组地址是按直接映象方式,按地址进行访问,而块地址是采用全相联方式,按内容访问。组相联的地址转换部件也是采用相关存储器实现,见图2.3.7。
      相关存储器中每个单元包含有: 主存地址中的区号E与组内块号B,两者结合在一起,其对应的字段是缓存块地址b。相关存储器的容量,应与缓存的块数相同。当进行数据访问时,先根据组号,在目录表中找到该组所包含的各块的目录,然后将被访数据的主存区号与组内块号,与本组内各块的目录同时进行比较。如果比较相等,而且有效位为“1”则命中。

       可将其对应的缓存块地址b送到缓存地址寄存器的块地址字段,与组号及块内地址组装即形成缓存地址。如果比较不相等,说明没命中,所访问的数据块尚没有进入缓存,则进行组内替换;如果有效位为0,则说明缓存的该块尚未利用, 或是原来数据作废,可重新调入新块。
      优点:块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。
      缺点:实现难度和造价要比直接映象方式高。

      2.3.3 替换策略

      根据程序局部性规律可知:程序在运行中,总是频繁地使用那些最近被使用过的指令和数据。这就提供了替换策略的理论依据。综合命中率、实现的难易及速度的快慢各种因素,替换策略可有随机法、先进先出法、最近最少使用法等。

      1.随机法(RAND法)

      随机法是随机地确定替换的存储块。设置一个随机数产生器,依据所产生的随机数,确定替换块。这种方法简单、易于实现,但命中率比较低。

      2.先进先出法(FIFO法)

      先进先出法是选择那个最先调入的那个块进行替换。当最先调入并被多次命中的块,很可能被优先替换,因而不符合局部性规律。这种方法的命中率比随机法好些,但还不满足要求。先进先出方法易于实现,例如Solar-16/65机Cache采用组相联方式,每组4块,每块都设定一个两位的计数器,当某块被装入或被替换时该块的计数器清为0,而同组的其它各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。

      3.最近最少使用法(LRU法)

      LRU法是依据各块使用的情况, 总是选择那个最近最少使用的块被替换。这种方法比较好地反映了程序局部性规律。
      实现LRU策略的方法有多种。 下面简单介绍计数器法、寄存器栈法及硬件逻辑比较对法的设计思路。
      计数器方法:缓存的每一块都设置一个计数器,计数器的操作规则是:
      (1) 被调入或者被替换的块, 其计数器清“0”,而其它的计数器则加“1”。
      (2) 当访问命中时,所有块的计数值与命中块的计数值要进行比较,如果计数值小于命中块的计数值, 则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变。最后将命中块的计数器清为0。
      (3) 需要替换时,则选择计数值最大的块被替换。
      例如IBM 370/65机的Cache用组相联方式,每组4块,每一块设置一个2位的计数器,其工作状态如表2.3.1。

    表2.3.1 计数器法实现LRU策略

    主存块地址
    块4
    块2
    块3
    块5
     
    块号
    计数器
    块号
    计数器
    块号
    计数器
    块号
    计数器
    Cache块0
    1
    10
    1
    11
    1
    11
    5
    00
    Cache块1
    3
    01
    3
    10
    3
    00
    3
    01
    Cache块2
    4
    00
    4
    01
    4
    10
    4
    11
    Cache块3
    XX
    2
    00
    2
    01
    2
    10
    操作
    起始状态
    调入
    命中
    替换

      寄存器栈法:设置一个寄存器栈, 其容量为Cache中替换时参与选择的块数。如在组相联方式中,则是同组内的块数。堆栈由栈顶到栈底依次记录主存数据存入缓存的块号, 现以一组内4块为例说明其工作情况,如表2.3.2所示,表中1~4为缓存中的一组的4个块号。

    表2.3.2 寄存器栈法实现

    缓存操作
    初始状态
    调入2
    命中块4
    替换块1
    寄存器0
    3
    2
    4
    1
    寄存器1
    4
    3
    2
    4
    寄存器2
    1
    4
    3
    2
    寄存器3
    1
    1
    3

      (1) 当缓存中尚有空闲时,如果不命中,则可直接调入数据块,并将新访问的缓冲块号压入堆栈,位于栈顶。其他栈内各单元依次由顶向下顺压一个单元,直到空闲单元为止。
      (2) 当缓存已满,如果数据访问命中,则将访问的缓存块号压入堆栈,其他各单元内容由顶向底逐次下压直到被命中块号的原来位置为止。如果访问不命中,说明需要替换,此时栈底单元中的块号即是最久没有被使用的。所以将新访问块号压入堆栈,栈内各单元内容依次下压直到栈底,自然,栈底所指出的块被替换。
      比较对法:比较对法是用一组硬件的逻辑电路来记录各块使用的时间与次数。
      假设Cache的每组中有4块, 替换时,是比较4块中那一块是最久没使用的,4块之间两两相比可以有6种比较关系。如果每两块之间的对比关系用一个RS触发器,则需要6个触发器(T12,T13,T14,T23,T24,T34), 设T12=0表示块1比块2最久没使用,T12=1表示块2比块1最久没有被使用。 在每次访问命中或者新调入块时,与该块有关的触发器的状态都要进行修改。 按此原理,由6个触发器组成的一组编码状态可以指出应被替换的块。例如,块1被替换的条件是:T12=0,T13=0,T14=0;块2被替换的条件是:T12=1,T23=0,T24=0等等。

      2.3.4 Cache的一致性问题

      Cache的内容是主存内容的一部分, 是主存的副本,内容应该与主存一致。由于:
      (1) CPU写Cache,没有立即写主存;
      (2) I/O处理机或I/O设备写主存。
      从而造成Cache与主存内容的不一致,如图2.3.8所示。

      对Cache进行写操作时引起的不一致的解决方法:

      1.全写法亦称写直达法(WT法-Write through)

      方法:在对Cache进行写操作的同时,也对主存该内容进行写入。
      优点:可靠性较高,操作过程比较简单。
      缺点:写操作速度得不到改善,与写主存的速度相同。

      2.写回法(WB法-Write back)

      方法:在CPU执行写操作时,只写入Cache,不写入主存。
      优点:速度较高。
      缺点:可靠性较差,控制操作比较复杂。

      2.3.5 Cache性能分析

      1.Cache系统的加速比

      存储系统采用Cache技术的主要目的是提高存储器的访问速度,加速比是其重要的性能参数。Cache存储系统的加速比SP(Speedup)为:

      其中:Tm为主存储器的访问周期,Tc为Cache的访问周期,T则为Cache存储系统的等效访问周期,H为命中率。
      可以看出,加速比的大小与两个因素有关:命中率H及Cache与主存访问周期的比值Tc/Tm,命中率越高加速比越大。图2.3.9示出了加速比与命中率的关系。

      2.Cache的命中率

      影响Cache命中率的因素很多,如Cache的容量,块的大小,映象方式,替换策略以及程序执行中地址流的分布情况等等。一般地说,Cache容量越大则命中率越高, 当容量达到一定程度后,容量的增加命中率的改善并不大;Cache块容量加大, 命中率也明显增加,但增加到一定值之后反而出现命中率下降的现象;直接映象法命中率比较低,全相联方式命中率比较高,在组相联方式中,组数分得越多,则命中率下降。

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block var foo = 'bar'; 

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目Value
    电脑$1600
    手机$12
    导管$1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列第二列第三列
    第一列文本居中第二列文本居右第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPEASCIIHTML
    Single backticks'Isn't this fun?'‘Isn’t this fun?’
    Quotes"Isn't this fun?"“Isn’t this fun?”
    Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to- HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

    Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    gantt
            dateFormat  YYYY-MM-DD
            title Adding GANTT diagram functionality to mermaid
            section 现有任务
            已完成               :done,    des1, 2014-01-06,2014-01-08
            进行中               :active,  des2, 2014-01-09, 3d
            计划一               :         des3, after des2, 5d
            计划二               :         des4, after des3, 5d
    
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 2.3 高速缓冲存储器(Cache) 2.3.1 高速缓冲存储器的功能、结构与工作原理 高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储...为此需要解决2个技术问题:一是主存地址与缓存地址的映象及转换; 二是按

    2.3 高速缓冲存储器(Cache)

      2.3.1 高速缓冲存储器的功能、结构与工作原理

      高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。 Cache的功能是用来存放那些近期需要运行的指令与数据。目的是提高CPU对存储器的访问速度。为此需要解决2个技术问题:一是主存地址与缓存地址的映象及转换; 二是按一定原则对Cache的内容进行替换。
      Cache的结构和工作原理如图2.3.1所示。

      主要由三大部分组成:
      Cache存储体:存放由主存调入的指令与数据块。
      地址转换部件:建立目录表以实现主存地址到缓存地址的转换。
      替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

      2.3.2 地址映象与转换

      地址映象是指某一数据在内存中的地址与在缓冲中的地址,两者之间的对应关系。下面介绍三种地址映象的方式。

      1.全相联方式

      地址映象规则:主存的任意一块可以映象到Cache中的任意一块
      (1) 主存与缓存分成相同大小的数据块。
      (2) 主存的某一数据块可以装入缓存的任意一块空间中。
      全相联方式的对应关系如图2.3.2所示。如果Cache的块数为Cb,主存的块数为Mb,则映象关系共有Cb×Mb种。

      图2.3.3示出了目录表的格式及地址变换规则。 目录表存放在相关(联)存储器中,其中包括三部分:数据块在主存的块地址、存入缓存后的块地址、及有效位(也称装入位)。由于是全相联方式,因此,目录表的容量应当与缓存的块数相同。

      举例:某机主存容量为1M,Cache的容量为32KB, 每块的大小为16个字(或字节)。 划出主、缓存的地址格式、 目录表格式及其容量。
      
      容量:与缓冲块数量相同即211=2048(或32K/16=2048)。  优点:命中率比较高,Cache存储空间利用率高。
      缺点:访问相关存储器时,每次都要与全部内容比较,速度低,成本高,因而应用少。

      2.直接相联方式

      地址映象规则: 主存储器中一块只能映象到Cache的一个特定的块中。
      (1) 主存与缓存分成相同大小的数据块。
      (2) 主存容量应是缓存容量的整数倍,将主存空间按缓存的容量分成区,主存中每一区的块数与缓存的总块数相等。
      (3) 主存中某区的一块存入缓存时只能存入缓存中块号相同的位置。
      图2.3.4示出了直接相联映象规则。 可见,主存中各区内相同块号的数据块都可以分别调入缓存中块号相同的地址中,但同时只能有一个区的块存入缓存。由于主、缓存块号相同,因此,目录登记时,只记录调入块的区号即可。

      图2.3.5示出了主、 缓冲地址格式、目录表的格式及地址变换规则。主、缓存块号及块内地址两个字段完全相同。目录表存放在高速小容量存储器中,其中包括二部分:数据块在主存的区号和有效位。目录表的容量与缓存的块数相同。

      地址变换过程:用主存地址中的块号B去访问目录存储器, 把读出来的区号与主存地址中的区号E进行比较, 比较结果相等,有效位为1,则Cache命中,可以直接用块号及块内地址组成的缓冲地址到缓存中取数;比较结果不相等,有效位为1, 可以进行替换,如果有效位为0,可以直接调入所需块。
      优点:地址映象方式简单,数据访问时,只需检查区号是否相等即可,因而可以得到比较快的访问速度,硬件设备简单。
      缺点:替换操作频繁,命中率比较低。
      举例:上例中,主存容量为1M, Cache的容量为32KB,每块的大小为16个字(或字节)。划出主、缓存的地址格式、目录表格式及其容量。
      
      容量:与缓冲块数量相同即211=2048(或32K/16=2048)。

      3.组相联映象方式

      组相联的映象规则:
      (1) 主存和Cache按同样大小划分成块。
      (2) 主存和Cache按同样大小划分成组。
      (3) 主存容量是缓存容量的整数倍,将主存空间按缓冲区的大小分成区,主存中每一区的组数与缓存的组数相同。
      (4) 当主存的数据调入缓存时,主存与缓存的组号应相等,也就是各区中的某一块只能存入缓存的同组号的空间内,但组内各块地址之间则可以任意存放, 即从主存的组到Cache的组之间采用直接映象方式;在两个对应的组内部采用全相联映象方式。
      图2.3.6示出了组相联的映象关系, 图中缓存共分Cg个组,每组包含有Gb块; 主存是缓存的Me倍,所以共分有Me个区, 每个区有Cg组,每组有Gb块。那么, 主存地址格式中应包含4个字段:区号、区内组号、组内块号和块内地址。 而缓存中包含3个字段:组号、组内块号、块内地址。主存地址与缓存地址的转换有两部分,组地址是按直接映象方式,按地址进行访问,而块地址是采用全相联方式,按内容访问。组相联的地址转换部件也是采用相关存储器实现,见图2.3.7。
      相关存储器中每个单元包含有: 主存地址中的区号E与组内块号B,两者结合在一起,其对应的字段是缓存块地址b。相关存储器的容量,应与缓存的块数相同。当进行数据访问时,先根据组号,在目录表中找到该组所包含的各块的目录,然后将被访数据的主存区号与组内块号,与本组内各块的目录同时进行比较。如果比较相等,而且有效位为“1”则命中。

       可将其对应的缓存块地址b送到缓存地址寄存器的块地址字段,与组号及块内地址组装即形成缓存地址。如果比较不相等,说明没命中,所访问的数据块尚没有进入缓存,则进行组内替换;如果有效位为0,则说明缓存的该块尚未利用, 或是原来数据作废,可重新调入新块。
      优点:块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。
      缺点:实现难度和造价要比直接映象方式高。

      2.3.3 替换策略

      根据程序局部性规律可知:程序在运行中,总是频繁地使用那些最近被使用过的指令和数据。这就提供了替换策略的理论依据。综合命中率、实现的难易及速度的快慢各种因素,替换策略可有随机法、先进先出法、最近最少使用法等。

      1.随机法(RAND法)

      随机法是随机地确定替换的存储块。设置一个随机数产生器,依据所产生的随机数,确定替换块。这种方法简单、易于实现,但命中率比较低。

      2.先进先出法(FIFO法)

      先进先出法是选择那个最先调入的那个块进行替换。当最先调入并被多次命中的块,很可能被优先替换,因而不符合局部性规律。这种方法的命中率比随机法好些,但还不满足要求。先进先出方法易于实现,例如Solar-16/65机Cache采用组相联方式,每组4块,每块都设定一个两位的计数器,当某块被装入或被替换时该块的计数器清为0,而同组的其它各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。

      3.最近最少使用法(LRU法)

      LRU法是依据各块使用的情况, 总是选择那个最近最少使用的块被替换。这种方法比较好地反映了程序局部性规律。
      实现LRU策略的方法有多种。 下面简单介绍计数器法、寄存器栈法及硬件逻辑比较对法的设计思路。
      计数器方法:缓存的每一块都设置一个计数器,计数器的操作规则是:
      (1) 被调入或者被替换的块, 其计数器清“0”,而其它的计数器则加“1”。
      (2) 当访问命中时,所有块的计数值与命中块的计数值要进行比较,如果计数值小于命中块的计数值, 则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变。最后将命中块的计数器清为0。
      (3) 需要替换时,则选择计数值最大的块被替换。
      例如IBM 370/65机的Cache用组相联方式,每组4块,每一块设置一个2位的计数器,其工作状态如表2.3.1。

    表2.3.1 计数器法实现LRU策略

    主存块地址
    块4
    块2
    块3
    块5
     
    块号
    计数器
    块号
    计数器
    块号
    计数器
    块号
    计数器
    Cache块0
    1
    10
    1
    11
    1
    11
    5
    00
    Cache块1
    3
    01
    3
    10
    3
    00
    3
    01
    Cache块2
    4
    00
    4
    01
    4
    10
    4
    11
    Cache块3
    XX
    2
    00
    2
    01
    2
    10
    操作
    起始状态
    调入
    命中
    替换

      寄存器栈法:设置一个寄存器栈, 其容量为Cache中替换时参与选择的块数。如在组相联方式中,则是同组内的块数。堆栈由栈顶到栈底依次记录主存数据存入缓存的块号, 现以一组内4块为例说明其工作情况,如表2.3.2所示,表中1~4为缓存中的一组的4个块号。

    表2.3.2 寄存器栈法实现

    缓存操作
    初始状态
    调入2
    命中块4
    替换块1
    寄存器0
    3
    2
    4
    1
    寄存器1
    4
    3
    2
    4
    寄存器2
    1
    4
    3
    2
    寄存器3
    1
    1
    3

      (1) 当缓存中尚有空闲时,如果不命中,则可直接调入数据块,并将新访问的缓冲块号压入堆栈,位于栈顶。其他栈内各单元依次由顶向下顺压一个单元,直到空闲单元为止。
      (2) 当缓存已满,如果数据访问命中,则将访问的缓存块号压入堆栈,其他各单元内容由顶向底逐次下压直到被命中块号的原来位置为止。如果访问不命中,说明需要替换,此时栈底单元中的块号即是最久没有被使用的。所以将新访问块号压入堆栈,栈内各单元内容依次下压直到栈底,自然,栈底所指出的块被替换。
      比较对法:比较对法是用一组硬件的逻辑电路来记录各块使用的时间与次数。
      假设Cache的每组中有4块, 替换时,是比较4块中那一块是最久没使用的,4块之间两两相比可以有6种比较关系。如果每两块之间的对比关系用一个RS触发器,则需要6个触发器(T12,T13,T14,T23,T24,T34), 设T12=0表示块1比块2最久没使用,T12=1表示块2比块1最久没有被使用。 在每次访问命中或者新调入块时,与该块有关的触发器的状态都要进行修改。 按此原理,由6个触发器组成的一组编码状态可以指出应被替换的块。例如,块1被替换的条件是:T12=0,T13=0,T14=0;块2被替换的条件是:T12=1,T23=0,T24=0等等。

      2.3.4 Cache的一致性问题

      Cache的内容是主存内容的一部分, 是主存的副本,内容应该与主存一致。由于:
      (1) CPU写Cache,没有立即写主存;
      (2) I/O处理机或I/O设备写主存。
      从而造成Cache与主存内容的不一致,如图2.3.8所示。

      对Cache进行写操作时引起的不一致的解决方法:

      1.全写法亦称写直达法(WT法-Write through)

      方法:在对Cache进行写操作的同时,也对主存该内容进行写入。
      优点:可靠性较高,操作过程比较简单。
      缺点:写操作速度得不到改善,与写主存的速度相同。

      2.写回法(WB法-Write back)

      方法:在CPU执行写操作时,只写入Cache,不写入主存。
      优点:速度较高。
      缺点:可靠性较差,控制操作比较复杂。

      2.3.5 Cache性能分析

      1.Cache系统的加速比

      存储系统采用Cache技术的主要目的是提高存储器的访问速度,加速比是其重要的性能参数。Cache存储系统的加速比SP(Speedup)为:

      其中:Tm为主存储器的访问周期,Tc为Cache的访问周期,T则为Cache存储系统的等效访问周期,H为命中率。
      可以看出,加速比的大小与两个因素有关:命中率H及Cache与主存访问周期的比值Tc/Tm,命中率越高加速比越大。图2.3.9示出了加速比与命中率的关系。

      2.Cache的命中率

      影响Cache命中率的因素很多,如Cache的容量,块的大小,映象方式,替换策略以及程序执行中地址流的分布情况等等。一般地说,Cache容量越大则命中率越高, 当容量达到一定程度后,容量的增加命中率的改善并不大;Cache块容量加大, 命中率也明显增加,但增加到一定值之后反而出现命中率下降的现象;直接映象法命中率比较低,全相联方式命中率比较高,在组相联方式中,组数分得越多,则命中率下降。

    展开全文
  • 内存映射(IO地址和内存地址

    千次阅读 2012-07-16 00:04:12
    ARM体系结构下面内存和i/o映射区别 (1)关于IO与内存空间: 在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过...端口号标识了外设的寄存器地址。Intel语法的in、out指令格式为: IN 累

    转自:http://linux.chinaunix.net/techdoc/net/2008/12/17/1053629.shtml

    ARM体系结构下面内存和i/o映射区别
    (1)关于IO与内存空间:
    在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标识了外设的寄存器地址。Intel语法的in、out指令格式为:
    IN 累加器, {端口号│DX}
    OUT {端口号│DX},累加器
    目前,大多数嵌入式微控制器如ARM、PowerPC等中并不提供I/O空间,而仅存在内存空间。内存空间可以直接通过地址、指针来访问,程序和程序运行中使用的变量和其他数据都存在于内存空间中。
    即便是在X86处理器中,虽然提供了I/O空间,如果由我们自己设计电路板,外设仍然可以只挂接在内存空间。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的I/O指令。因此,内存空间是必须的,而I/O空间是可选的。
    (2)inb和outb:
    在Linux设备驱动中,宜使用Linux内核提供的函数来访问定位于I/O空间的端口,这些函数包括:
    · 读写字节端口(8位宽)
    unsigned inb(unsigned port);
    void outb(unsigned char byte, unsigned port);
    · 读写字端口(16位宽)
    unsigned inw(unsigned port);
    void outw(unsigned short word, unsigned port);
    · 读写长字端口(32位宽)
    unsigned inl(unsigned port);
    void outl(unsigned longword, unsigned port);
    · 读写一串字节
    void insb(unsigned port, void *addr, unsigned long count);
    void outsb(unsigned port, void *addr, unsigned long count);
    · insb()从端口port开始读count个字节端口,并将读取结果写入addr指向的内存;outsb()将addr指向的内存的count个字节连续地写入port开始的端口。
    · 读写一串字
    void insw(unsigned port, void *addr, unsigned long count);
    void outsw(unsigned port, void *addr, unsigned long count);
    · 读写一串长字
    void insl(unsigned port, void *addr, unsigned long count);
    void outsl(unsigned port, void *addr, unsigned long count);
    上述各函数中I/O端口号port的类型高度依赖于具体的硬件平台,因此,只是写出了unsigned。
    (3)readb和writeb:
    在设备的物理地址被映射到虚拟地址之后,尽管可以直接通过指针访问这些地址,但是工程师宜使用Linux内核的如下一组函数来完成设备内存映射的虚拟地址的读写,这些函数包括:
    · 读I/O内存
    unsigned int ioread8(void *addr);
    unsigned int ioread16(void *addr);
    unsigned int ioread32(void *addr);
    与上述函数对应的较早版本的函数为(这些函数在Linux 2.6中仍然被支持):
    unsigned readb(address);
    unsigned readw(address);
    unsigned readl(address);
    · 写I/O内存
    void iowrite8(u8 value, void *addr);
    void iowrite16(u16 value, void *addr);
    void iowrite32(u32 value, void *addr);
    与上述函数对应的较早版本的函数为(这些函数在Linux 2.6中仍然被支持):
    void writeb(unsigned value, address);
    void writew(unsigned value, address);
    void writel(unsigned value, address);
    (4)把I/O端口映射到“内存空间”:
    void *ioport_map(unsigned long port, unsigned int count);
    通过这个函数,可以把port开始的count个连续的I/O端口重映射为一段“内存空间”。然后就可以在其返回的地址上像访问I/O内存一样访问这些I/O端口。当不再需要这种映射时,需要调用下面的函数来撤消:
    void ioport_unmap(void *addr);
    实际上,分析ioport_map()的源代码可发现,所谓的映射到内存空间行为实际上是给开发人员制造的一个“假象”,并没有映射到内核虚拟地址,仅仅是为了让工程师可使用统一的I/O内存访问接口访问I/O端口。



    11.2.7 I/O 空间的映射
    很多硬件设备都有自己的内存,通常称之为I/O空间。例如,所有比较新的图形卡都有几MB的RAM,称为显存,用它来存放要在屏幕上显示的屏幕影像。
    1.地址映射
    根据设备和总线类型的不同,PC体系结构中的I/O空间可以在三个不同的物理地址范围之间进行映射:
    (1)对于连接到ISA总线上的大多数设备
    I/O空间通常被映射到从0xa0000到0xfffff的物理地址范围,这就在640K和1MB之间留出了一段空间,这就是所谓的“洞”。
    (2)对于使用VESA本地总线(VLB)的一些老设备
    这是主要由图形卡使用的一条专用总线:I/O空间被映射到从0xe00000到0xffffff的地址范围中,也就是14MB到16MB之间。因为这些设备使页表的初始化更加复杂,因此已经不生产这种设备。
    (3)对于连接到PCI总线的设备
    I/O空间被映射到很大的物理地址区间,位于RAM物理地址的顶端。这种设备的处理比较简单。
    2.访问I/O空间
    内核如何访问一个I/O空间单元?让我们从PC体系结构开始入手,这个问题很容易就可以解决,之后我们再进一步讨论其他体系结构。
    不要忘了内核程序作用于虚拟地址,因此I/O空间单元必须表示成大于PAGE_OFFSET的地址。在后面的讨论中,我们假设PAGE_OFFSET等于0xc0000000,也就是说,内核虚拟地址是在第4G。
    内核驱动程序必须把I/O空间单元的物理地址转换成内核空间的虚拟地址。在PC体系结构中,这可以简单地把32位的物理地址和0xc0000000常量进行或运算得到。例如,假设内核需要把物理地址为0x000b0fe4的I/O单元的值存放在t1中,把物理地址为0xfc000000的I/O单元的值存放在t2中,就可以使用下面的表达式来完成这项功能:

    t1 = *((unsigned char *)(0xc00b0fe4));
    t2 = *((unsigned char *)(0xfc000000));

    在第六章我们已经介绍过,在初始化阶段,内核已经把可用的RAM物理地址映射到虚拟地址空间第4G的最初部分。因此,分页机制把出现在第一个语句中的虚拟地址0xc00b0fe4映射回到原来的I/O物理地址0x000b0fe4,这正好落在从640K到1MB的这段“ISA洞”中。这正是我们所期望的。
    但是,对于第二个语句来说,这里有一个问题,因为其I/O物理地址超过了系统RAM的最大物理地址。因此,虚拟地址0xfc000000就不需要与物理地址0xfc000000相对应。在这种情况下,为了在内核页表中包括对这个I/O物理地址进行映射的虚拟地址,必须对页表进行修改:这可以通过调用ioremap( )函数来实现。ioremap( )和vmalloc( )函数类似,都调用get_vm_area( ) 建立一个新的vm_struct描述符,其描述的虚拟地址区间为所请求I/O空间区的大小。然后,ioremap( )函数适当地更新所有进程的对应页表项。
    因此,第二个语句的正确形式应该为:

    io_mem = ioremap(0xfb000000, 0x200000);
    t2 = *((unsigned char *)(io_mem + 0x100000));

    第一条语句建立一个2MB的虚拟地址区间,从0xfb000000开始;第二条语句读取地址0xfc000000的内存单元。驱动程序以后要取消这种映射,就必须使用iounmap( )函数。

    现在让我们考虑一下除PC之外的体系结构。在这种情况下,把I/O物理地址加上0xc0000000常量所得到的相应虚拟地址并不总是正确的。为了提高内核的可移植性,Linux特意包含了下面这些宏来访问I/O空间:
    readb, readw, readl
    分别从一个I/O空间单元读取1、2或者4个字节
    writeb, writew, writel
    分别向一个I/O空间单元写入1、2或者4个字节
    memcpy_fromio, memcpy_toio
    把一个数据块从一个I/O空间单元拷贝到动态内存中,另一个函数正好相反,把一个数据块从动态内存中拷贝到一个I/O空间单元
    memset_io
    用一个固定的值填充一个I/O空间区域
    对于0xfc000000 I/O单元的访问推荐使用这样的方法:
    io_mem = ioremap(0xfb000000, 0x200000);
    t2 = readb(io_mem + 0x100000);
    使用这些宏,就可以隐藏不同平台访问I/O空间所用方法的差异。

    展开全文
  • 2015.03.25-26 读《汇编语言》—王爽、《x86汇编语言:由实模式到保护模式》— 李忠、《30天自制操作系统》—川合秀实 整理笔记。 1 实模式 在实模式下,处理器的...CPU从地址FFFF0H处开始执行指令,这是一条跳转指

    2015.03.25-26

    读《汇编语言》—王爽、《x86汇编语言:由实模式到保护模式》— 李忠、《30天自制操作系统》—川合秀实

    整理笔记。


    1 实模式

    在实模式下,处理器的内存寻址方式和8086处理器相同。


    2 计算机开机过程

    任何一台使用Intel 系列CPU的PC机只要一开机,CPU就工作在实模式下。CPU从地址FFFF0H处开始执行指令,这是一条跳转指令,这条跳转指令会跳到系统BIOS真正的启动代码处(进行硬件检测和初始化)。启动代码执行完毕后,调用int19h进行操作系统的引导,将计算机交由操作系统控制。


    如果你的机器装的是DOS,那么在DOS加载后CPU仍以实模式工作。如果你的机器装的是Windows,那么Windows加载后,将由Windows将CPU切换到保护模式下工作,因为Windows是多任务系统,它必须在保护模式下运行。Windows启动完成后,如果在Windows中运行一个DOS下的程序,那么Windows将CPU切换到虚拟8086下运行该程序。或者是这样,你点击开始菜单在程序项中进入MS-DOS方式,这时,Windows也将CPU切换到虚拟8086模式下运行。《汇编语言》第三版– 王爽。

    也就是说,将CPU由实模式到保护模式的切换是由操作系统完成的


    3 实模式下内存地址空间

    8086处理器有20根地址线,寻址范围为0x00000~ 0xFFFFF(1M)。

    Figure 1. 实模式下的内存地址空间

    实模式下的内存地址空间是各个存储器件的地址的逻辑组合,各个存储器中的存储单元的地址与内存地址空间中的地址一一对应。


    [1]处1KB内容是系统BIOS程序加载的(实际占用可能小于1KB);[2]处512字节内容是BIOS从磁盘/硬盘的第1柱面第1磁道的第1扇区读来的程序(此程序刚好512字节);[3]处128KB是显卡存储器的地址;[4]处256KB是存储BIOS程序的ROM存储器的地址。其中,最后64KB是存储系统BIOS程序的ROM存储器的地址,前192KB是其它存储BIOS程序的ROM存储器的地址。]


    在系统BIOS执行完毕后,可用的RAM地址空间为0x00400~ 0x07bff以及0x0800 ~ 0x9ffff。


    4 实模式下内存空间的访问

    8086处理器(CPU)内的寄存器都是16位的,地址线上的地址由CPU提供。CPU用两个16位的值合成一个20位的值:将一个16位的值乘以16(相当于这个16位的值保存在20位寄存器的低16位中,然后将低16位往高位移动了4位)再加上另一个16位的值。将这个由2个16位合成的值提供给20根地址线作为访问内存的地址值。被乘以16的那个值被称为段基址,没有被乘以16的那个值被称为偏移地址。


    CPU在实模式下,段寄存器中的值就是段基址,如果想要通过汇编程序访问某个内存单元,那么就需要指定一个段寄存器和一个偏移地址或以“段基址值:偏移地址值”的格式。CPU会将段寄存器的值乘以16再与偏移地址相加后,才将这个结果提供给地址线;用段基址和偏移地址的形式给出的表达式,CPU也会给段基址乘以16与偏移地址相加后,才将这个结果提供给地址线。

    Figure 2. 实模式下访问内存(得出内存地址)的方式


    这就是说,在汇编程序中,得用段基址:偏移地址的方式访问内存,因为CPU形成内存地址的方式是“段基址* 16 + 偏移地址”。

    按照“段:偏移地址”的方式访问内存是CPU对内存的一种管理方式。


    5 程序段和内存段的关系(程序的加载)

    实模式下的内存的段基址低4位都为0(段基址左移4位),段基址至少要是16的倍数。所以,内存中连续的两个段之间至少也会相差16字节,也就是说内存段之间以16字节对齐。


    汇编编译器将汇编程序中的“段名segment … 段名ends”伪指令对中的段名解释成一个程序段,程序加载器能够根据汇编编译器的解释将程序段加载到一个空闲的内存段中。


    如果汇编程序中未定义段,汇编编译器将所有的程序当成一个程序段,第一条语句作为程序的入口地址,程序加载器加载最终的可执行文件到内存中时,它首先找到能够容纳下整个程序的内存段,将程序加载到内存段中;如果汇编程序中有多个段,汇编编译器能识别程序入口地址所在的程序段,程序加载器加载这样的可执行文件时,首先去找到一块能够容纳下整个程序的内存空间,然后将包含程序入口地址的程序段加载到这段空闲内存空间第一个内存段中,然后将其余的段按照在程序中定义的顺序加载到这段空闲内存空间的后续内存段中,各个内存段以16字节对齐;如果汇编程序中有多个段,但没有包含程序入口地址的段,那么汇编编译器将程序中的第一个段作为程序入口地址,程序加载器按照各个段的定义顺序将它们载入内存中。(这是大多数加载器加载程序的方法,如果要写一个自己的加载器,不这么加载程序完全可以)
    assume	cs:code, ds:data, ss:stack
    
    data	segment
    	dw	0123h, 0456h, 0789h, 0abch, 0defh, 0fedfh, 0cbah, 0987h
    data	ends
    
    
    stack	segment
    	dw	0, 0, 0, 0, 0, 0, 0, 0
    stack	ends
    
    
    code	 segment
    start:
    	mov	ax, stack
    	mov	ss, ax
    	mov	sp, 16
    	
    	mov	ax, data
    	mov	ds, ax
    	
    	push	ds:[0]
    	push	ds:[2]
    	pop	ds:[2]
    	pop	ds:[0]
    	
    	mov	ax, 4c00h
    	int	21h
    code 	ends
    end	start           //告诉汇编编译器start标号处为程序的入口地址
    

    编译、连接此汇编程序,用debug调试器调试此程序,得到各个程序段对应的内存内存段:

    Figure 3. 程序段在内存中的内存段

    code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。(因为每个段的内容都未超过16字节)


    6 ORG

    ORG是由编译器处理的伪指令。它告知加载器,后续的程序应被加载至本内存段的哪个偏移地址处。它对段无效。

    assume cs:code
    
    code segment
    	jmp	my_label
    
    	;org 5h
    
    	my_label:
    		mov	ax, 0
    		
    		mov	ax,4c00h
    		int 21h
    code ends
    end
    

    将此段汇编程序编译、连接,用debug调试器观看生成的指令:

    Figure 4. 指令的参数为偏移地址

    将程序中的注释去掉,再将程序编译、连接,用debug观看生成的指令:

    Figure 5. org指定程序加载的偏移值

    程序加载器能够根据汇编编译器对org伪指令的处理信息而将org后面的指令装载到org指定的偏移地址处。同时修改某些指令的参数。


    7 磁盘启动区要求

    软盘的柱面:磁盘(软盘内存储数据的介质)的两面的相同位置的2磁道构成一个柱面。

    BIOS读软盘第一个扇区时,磁盘内不同地方的内容有不同的含义。以下是FAT12格式软盘第一扇区各内容的含义:

    表格 1. Windows (开机)读软盘第一个扇区的读法

    偏移

    长度/字节

    内容/含义

    (参考)值

    0

    3

    跳转到软盘指令开始处的跳转指令

    jmp l_start(l_start为软盘内第一条指令处的标号)

    3

    8

    第一个扇区的名字

    "xnlosipl"

    11

    2

    软盘每个扇区的大小(字节为单位)

    必须为512

    13

    1

    每簇的扇区数

    必须为1

    14

    2

    保留扇区数/FAT的起始位置/Boot记录占用扇区

    一般为1

    16

    1

    FAT的个数

    必须为2

    17

    2

    根目录文件数的最大值

    一般为224

    19

    2

    扇区总数

    (必须为)2880

    21

    1

    介质描述符

    必须为0xf0

    22

    2

    每FAT扇区数

    必须为9

    24

    2

    每磁道扇区数

    必须为18

    26

    2

    磁头数

    必须为2

    28

    4

    隐藏/不使用的扇区数

    必须为0

    32

    4

    如果偏移19处值为0,由这个值表示总扇区数

    2880

    36

    1

    中断13h的驱动器号

    固定为0

    37

    1

    未使用

    固定为0

    38

    1

    扩展引导标记

    固定为0x29

    39

    4

    卷列序号

    0xffffffff

    43

    11

    软盘名称

    "xnlhello-os"

    54

    8

    软盘格式名称

    "FAT12   "(8字节,空格填充)

    62

    448

    (引导)代码、数据及其它填充字符

    ……

    510

    2

    标明软盘有无所需的启动代码(在第一个扇区内)

    0x55aa(为0x55aa表明有)

    这些规定都是指电平信号(在二进制编辑器中可直接书写就可得到它们)。在软盘内每个偏移内组织的数据要符合“表格 1”中的要求。这样,软盘内的数据才会得到计算机的正确解释


    启动区外,除下图有2个地方有规定(非必须)内容外,其它地方的内容无规定。



    [x86OS] Note Over.

    [2015.04.01]

    展开全文
  • 如何打印内存地址

    千次阅读 2012-07-05 17:04:15
    请问在printf打印函数中一般用什么形式打印变量内存地址: 答,最常用的打印地址方式是%p和0x%x。 int main() { int a; // a=4; printf("%p,%X",&a,&a); getch(); } 答案书上的是%p打印出的地址自动在...
  • gdb 如何调试内存地址

    千次阅读 2017-07-20 09:18:40
    样例代码 int age= 20; int *p_age = &age; NSLog(@"p_age = %p", ... //输出指针变量p_age指向值20所在内存地址 NSLog(@"&p_age = %p", &p_age); //输出指针变量p_age本身的地址 2017-07-19 15:54:07.048 Test07
  • 内存地址(逻辑地址、线性地址、物理地址)概念(转) 逻辑地址(Logical Address)  是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个...
  • 易语言数据类型内存分布格式

    千次阅读 2012-09-24 13:34:27
    易语言数据类型内存分布格式 数据类型 大小(字节) 结构说明 字节型 1 这个没必要说明… 短整数型 2 这个没必要说明… 整数型 4 这...
  • 相关博客列表: FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在雷神的《最简单的基于FFmpeg的内存读写...
  • c#读写内存

    千次阅读 2010-02-09 22:57:00
    最近闲来无事发现周围的朋友都在玩《植物大战僵尸》的游戏!于是动了制作这游戏工具的念头!... 游戏内存基址:base = 0x006A9EC0 游戏阳光地址:[base+0x768]+0x5560 游戏金钱地址:[base+0x82C]+0x
  • Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的 我们先来看一张...
  • 整理参考资料:文档1 、 文档2 ... 可以直接把物理地址理解成插在机器上那根内存条本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后 把这个数组叫做物理地址   虚拟内存(virtual memory) ...
  • 最简单的基于FFmpeg的内存读写的例子:内存转码器

    万次阅读 多人点赞 2014-10-05 13:30:35
    上篇文章记录了一个基于FFmpeg的内存播放器,可以使用FFmpeg读取并播放内存中的数据。这篇文章记录一个基于FFmpeg的内存转码器。该转码器可以使用FFmpeg读取内存中的数据,转码之后再将数据输出到内存。关于如何从...
  • 手游作弊-内存读写实例

    千次阅读 多人点赞 2021-01-04 00:31:04
    关于手游作弊的博客我鸽的有点久了哈哈,这篇文章就和大家讲解下在内存中数据的存储格式,如何读取和修改
  • 大端格式、小端格式,以及数据在内存中的存储方式 内存中的地址.左→右,地址降低,下→上,地址升高。一个格子是一个字节,一个字节是8位。 int a = 0x01020304 若为小端格式(arm默认是小段格式)  内存格式 ...
  • haribote和linux0.11由Intel...此文意在总结下x86 CPU对外提供的内存地址转换机制。 1 逻辑层面总结CPU执行内存中可执行程序过程 |--------| 0____________ |----------------------| | PC | ------------> | ...
  • )中,指出了GDB中查看指定内存地址内容的指令: examine命令(简写是x)。 x命令的 语法 如下所示: x/ <n/f/u> 其中,n、f、u是可选的参数。addr表示待查看的内存地址。 n 是一个正整数...
  • 我们称计算机CPU是32位或者64位,有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,这样说是不准确的,因为还有很多...内存单元:字节 每个字节有个编号,称为内存地址 从指定的内存中写入/读取数据 mov
  • 首先,看看老大给我的任务:实现一个模块间的内存管理库, 实现以下功能 1、该内存库通讯的数据量不确定, 最大5Mbit/s  2、该内存库用于模块间的数据交互 3、该内存库只允许一个模块写入, 但可多个模块读取,...
  • CPU地址空间,IO端口和IO内存

    千次阅读 2016-12-11 16:23:59
    物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映 射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。  物理地址...
  • 上篇博客我们到了 Java/Android 内存的分配以及相关 GC 的详细分析,这篇博客我们会继续分析 Android 中内存泄漏的检测以及相关案例,和 Android 的内存优化相关内容。 Android 内存泄漏案例和检测   常见...
  • 想了多种方法解决这个问题,还是百度的力量大。 在很多应用中,经常会直接把... 这个时候,当你的应用程序读到内存里的二进制图片数据时,怎么样直接转为OpenCV 可以使用的图片格式呢,答案是用 cv::imdecode 这...
  • Java 文件采用的是大端模式,例如写入一个int(10)到文件中, Java的内存结构 10从高位到低位分别是00(&0x0001 低地址) 00(&0x0002) 00(&0x0003) 0A(&0x...00 00 00 0A 从低地址开始 C 使用 fread 从文件中读
  • 汇编(通用寄存器_内存读写)

    千次阅读 2016-07-30 14:20:29
     整句话的意思是可以把8位的通用寄存器的值复制给8位的地址或者8位的通用寄存器 代码演示: file:///C:/Users/Xuanxuan/Documents/My%20Knowledge/temp/1ccd35f7-f0ac-424c-8b3c-244b0588923c.jpg ...
  • 11.windbg-d、e 读写内存

    千次阅读 2012-05-13 17:33:22
    以下所有例子都以CALC程序为示例----hgy413 notes. 1 d d*命令显示给定范围内存的内容。 d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd (Display Memory) ...d这种显示的格式和最近一次d*命
  • 首选在EasyBuilerPro中,菜单“检视”中勾选“地址检视”,才能把地址栏显示出来。今天我们主要说说HMI的地址: 这里地址模式分为WordAddress字地址和位BitAddress地址。 设备名称默认有本地HMI的地址,其他的...
  • Java 堆内存和栈内存

    千次阅读 2016-03-23 19:59:12
    对Java中堆内存和栈内存的简单理解
  • 内存、寄存器、GPIO地址、存储器之间的关系1、如上图,0x0000 0000表示第一个地址字节,代码使用这个16进制时,指针会指向这个物理地址,对4字节的GPIO控制单元来说,这4个字节的物理地址就叫寄存器,当我们把IO口...
  • 内存越界问题

    千次阅读 2018-04-24 11:04:31
    最近在做视频编码的工作,在PC上调试没有问题,但是移植到嵌入式ARM设备上的时候就出现了内存越界问题。起初也不知道是内存越界的问题,只是程序运行会出现非常异常的情况。在PC机上做测试的时候,在内存映射的时候...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 365,374
精华内容 146,149
关键字:

内存地址格式怎么写