精华内容
下载资源
问答
  • 1.内存地址 在编程中我们(编译器)为各种数据分配的内存均为逻辑地址,逻辑地址通过操作系统转换为物理地址,也就是芯片级物理内存的地址。在使用Intel 80x86微处理器时,应当分清以下三种“地址”: 逻辑地址...

    1.内存地址

    在编程中我们(编译器)为各种数据分配的内存均为逻辑地址,逻辑地址通过操作系统转换为物理地址,也就是芯片级物理内存的地址。在使用Intel 80x86微处理器时,应当分清以下三种“地址”:

    • 逻辑地址(logical address)
    • 线性地址(linear address)
    • 物理地址(physical address)

    CPU控制单元通过一种称为分段单元(segmentation unit) 的硬件电路把一个逻辑地址转换成线性地址;
    接着,第二个称为 分页单元(paging unit) 的硬件电路把一个线性地址转换成物理地址。
    逻辑地址转换

    2.分段机制

    最早内存没有抽象,程序直接读写物理内存。在这种情况下,通常同时运行两个程序是不可能的,因为它们很可能同时访问同一个物理地址导致程序崩溃。
    当Intel 8086处理器出现时,内存寻址迎来第一次飞跃,它引入了一个重要的概念——,段式内存使得程序地址不再需要静态重定位,支持了更大的地址。
    8086处理器的数据总线是16位的,但其目标是寻址1MB的内存,这意味着需要20位的地址总线。为了解决这个问题,当时引入了分段的方法。
    一个逻辑地址由两部分组成:一个段标识符和一个指定段内相对地址的偏移量。段标识符是一个16 位长的字段,称为段选择符(Segment Selector),而偏移量是一个32 位长的字段。
    逻辑地址图示

    2.1 段寄存器

    为了方便找到段选择符,处理器提供6个段寄存器专门用来存放段选择符。它们是cs、ss、ds、es、fs和gs。

    • **cs位代码段寄存器;
    • ss为栈段寄存器;
    • ds为数据段寄存器;**
    • 其他三个段寄存器作一般用途,6个段寄存器均为16位

    2.2 段描述符

    每个段由一个8字节的段描述符(segment descriptor)来具体描述。段描述符放在全局描述符表(Global Descriptor Table ,GDT)或局部描述符表(Local Descriptor Table, LDT)中。段描述符标被存在一个非编程CPU寄存器中,非编程寄存器对程序员不可见,仅供6个可编程的段寄存器使用。**
    段描述符
    B31 ~ B24 和 B23 ~ B16分别为基地址的 bit16 ~ bit23 和 bit24 ~ bit31;
    L19 ~ L16和L15 ~ L0为段LIMIT的 bit10 ~ bit15 和 bit16 ~ bit19。

    4位type域描述了段的类型特征和存取权限,广泛使用如下几种:
    1.代码段描述符(描述符代表一个代码段,可以放在GDT或LDT中,S标志位为1)
    2.数据段描述符(描述符代表一个数据段,可以放在GDT或LDT中,S标志位为1)
    3.任务状态段描述符(代表一个任务状态段(TSS),只能存放在GDT中,S标志位为9或11)
    4.局部描述符表描述符(代表一个LDT段,只能存放在GDT中,S标志位为0)

    2.3 段选择符

    之前提到16位的段选择符存放在段寄存器中,它直接指向段描述符。每当一个段选择符被装入段寄存器,相应的段描述符就被装入非编程寄存器。*此时CPU只需直接引用段描述符所在寄存器即可,不需访问主存中的GDT或LDT。*仅当段寄存器的内容改变时,才有必要访问GDT或LDT。
    在这里插入图片描述
    段选择符包含以下域:

    • 13位的索引,指定了段描述符在GDT或LDT中的入口。
    • TI标志指明了段描述符是在GDT中(TI = 0)还是在LDT中( TI = 1)
    • 两位RPL(请求特权级)

    在这里插入图片描述

    2.4 逻辑地址到线性地址的转换

    分段单元(segmentationunit)执行以下操作:

    1. 先检查段选择符的TI字段,以决定段描述符保存在哪一个描述符表中。TI字段指明描述符是在GDT中(在这种情况下,分段单元从GDTR寄存器中得到GDT的线性基地址)还是在LDT中(在这种情况下,分段单元从LDTR寄存器中得到LDT的线性基地址)。
    2. 从段选择符的 index 索引字段计算段描述符的地址,index字段的值乘以8(一个段描述符的大小),这个结果与GDTR或LDTR寄存器中的内容相加
    3. 逻辑地址的偏移量与段描述符基地址域(base)相加,就得到了线性地址。

    在这里插入图片描述

    3.分页机制

    分页单元在分段之后运行,把线性地址转换成物理地址

    3.1 页、页框、页表

    为了效率起见,线性地址被分成以固定长度为单位的组,称为页(page)。页内部连续的线性地址被映射到连续的物理地址中。这样,内核可以指定一个页的物理地址和其存取权限,而不用指定页所包含的全部线性地址的存取权限。

    分页单元把所有的RAM 分成固定长度的页框(page frame)。每一个页框包含一个页,也就是说一个页框的长度与一个页的长度一致。页框是主存的一部分,因此也是一个存储区域。
    区分一页和一个页框是很重要的,前者只是一个数据块,可以存放在任何页框或磁盘中。

    把线性地址映射到物理地址的数据结构称为页表(page table)。页表存放在主存中,并在启用分页单元之前必须由内核对页表进行适当的初始化。

    3.2 常规分页

    从80386 起,Intel 处理器的分页单元处理4KB 的页。32 位的线性地址被分成 3 个域:

    • Directory(目录):最高10 位
    • Table(页表):中间10 位
    • Offset(偏移量):最低12 位

    在这里插入图片描述
    Directory域和Table域都是10位,它们拥有相同的结构,均包含以下的域:

    • Present 标志
    • Accessed 标志
    • Dirty 标志
    • Read/Write 标志
    • User/Supervisor 标志
    • PCD 和 PWT 标志
    • Page Size 标志
    • Global 标志

    3.3 线性地址转换为物理地址

    线性地址的转换分两步完成,每一步都基于一种转换表,第一种转换表称为页目录表,第二种转换表称为页表
    正在使用的页目录的物理地址存放在控制寄存器 cr3 中。线性地址内的Directory 字段决定页目录中的目录项,而目录项指向适当的页表。地址的Table 字段依次又决定页表中的表项,而表项含有页所在页框的物理地址Offset 字段决定页框内的相对位置

    • 用最高10位作为页目录项的索引,将它乘以4,与CR3中的页目录的起始地址相加,获得相应目录项在内存的地址。

    • 从这个地址开始读取32位页目录项,取出其高20位,再给低12位补0,形成页表在内存的起始地址。

    • 用中间的10位作为页表中页表项的索引,将它乘以4,与页表的起始地址相加,获得相应页表项在内存的地址。

    • 从这个地址开始读取32位页表项,取出其高20位,再将线性地址的第11~0位放在低12位,形成最终32位页面物理地址。

    展开全文
  • 1.内存寻址 首先,内存从CPU获得查找某个数据的指令,然后再找出存取资料的位置时(这个动作称为“寻址”),它先定出横坐标(也就是“列地址”)再定出纵坐标(也就是“行地址”),这就好像在地图上画个十字标记...
  • NULL 博文链接:https://skyxiaobai.iteye.com/blog/288819
  • 内存寻址方式

    2020-10-19 09:25:28
    文章目录处理字符问题[ibx+idata]方式寻址SI 和 DI寄存器[bx+si]和[bx+di]寻址方式[bx+si+idata]和[bx+di+idata]寻址方式dup功能和用法 处理字符问题 例子:大小写字母转换? 大写字母的ASCII 的值+20H是小写字母,...

    处理字符问题

    例子:大小写字母转换?
    
    • 大写字母的ASCII 的值+20H是小写字母,十进制是32

        通过ASCII 码表可以观察出来
      
    • 小写字母转大写字母使用与运算

        and 1101 1111 (是规定的,只要求小写转大写就用这个)
      
    b	62H		0110 0010B
    B	42H		0100 0010B
    	0110 0010  (b)1101 1111
    ________________________
    	0100 0010	(B)
    
    • 大写字母转小写字母使用或运算

      or 0010 0000 (是规定的,只要求大写转小写就用这个)

    I	49H		0100 1001B
    i	69H		0110 1001B
    	0100 1001	(I)0010 0000	
    ____________________________
    	0110 1001	(i)
    
    • 汇编代码

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述


    [ibx+idata]方式寻址

    在这里插入图片描述

    		bx 寄存器是通用寄存器,在计算存储器地址是,一般作基地址使用
    

    SI 和 DI寄存器

    变址寄存器
    
    • SI: 源变址寄存器

    • DI: 目标变址寄存器

    • SI 和 DI 不能分为两个8位的寄存器来使用

    • 一般可以将bx,替换为SI 或者 DI

      例子:用寄存器SI和DI实现将字符串 ‘hello’ 复制到它后面的数据区中?

    在这里插入图片描述


    [bx+si]和[bx+di]寻址方式

    • [bx+si] 表示一个内存单元

        例子:mov ax,[bx+si] 的含义
        将一个内存单元送入ax
        这个内存单元的长度为2个字节,存放一个字
        偏移地址为bx中的数值加上si中的数值
        段地址在ds中
      
        ax = ( (ds)*16 + (bx) + (si) )
      

    [bx+si+idata]和[bx+di+idata]寻址方式

    • bx+si+idata 表示一个内存单元
    • [bx+si] 基础上再加一个idata

    dup功能和用法

    dup与db、dw、dd等数据定义伪指令配合使用用来进行数据恢复,
    
    • db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1
    • dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2
    • dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4

    在这里插入图片描述


    展开全文
  • 内存寻址原理

    2017-07-21 11:33:07
    在做网络安全事件分析的时候,都会遇到内存寻址的知识,例如上次跟大家分享的《 空指针漏洞防护技术》,就涉及到非法访问内存地址的问题。如果这个坎儿迈不过去,你就会迷失在代码中,更无从分析了。今天绿盟科技的...

    在做网络安全事件分析的时候,都会遇到内存寻址的知识,例如上次跟大家分享的《 空指针漏洞防护技术》,就涉及到非法访问内存地址的问题。如果这个坎儿迈不过去,你就会迷失在代码中,更无从分析了。今天绿盟科技的安全技术专家就讲讲这个内存寻址的原理,文章分为上下两篇《内存寻址原理》及《内存寻址方式》。

    随着信息化发展和数据处理能力需求的提高,对计算机硬件产品的性能和容量也提出了新的挑战,要求计算机处理能力也要能随实际情况需求的变动而提升、改变。

    当下,一台普通的电脑硬盘容量也要200多G,内存也有4G;如此大容量的硬盘和内存,在处理大量数据或是大型游戏面前还是显得力不从心,需要通过扩容来满足需求,比如将内存由4G提升到8G或是16G不等。扩容后对个人体验确实提升不少。对于内存容量的提升需要有相应的硬件基础支撑,需要有能消化掉这么多内存的寻址地址。比如说如果一8位单片机如果要装载16G的内存,那就是暴殄天物。

    哪里有需求哪里就有市场 ;计算机从8位的51单片机,20位8086寻址,发展到32位 win2003,64位win10,都是由于信息化需求的膨胀推动着计算机一代又一代的改革创新。

    对于内存的扩容,很多人都不是很清楚应用程序如何使用的物理内存地址。远了不说,单说现在常用计算机中的32位、64系统;系统是怎么样将虚拟地址转化成线性地址,线性地址又是怎样转换成物理地址的,其中又用到了哪些寄存器或是数据结构,相信很多人对此也是一知半解;也像我一样,想结合实例从地址转换的本质来掌握其精髓之处。接下来就一起学习从逻辑地址到物理地址的整个转换过程。

    1.实模式与保护模式简介

    CPU常见三种工作模式:实模式与保护模式,虚拟8086模式。

    实模式 :CPU复位(reset)或加电(power on)的时候以实模式启动,处理器以实模式工作。在实模式下,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址,最大寻址空间1MB。在实模式下,所有的段都是可以读、写和可执行的。实模式下没有分段或是分页机制,逻辑地址和物理地址相等。

    由此得知:

    1. 在实模式下最大寻址空间时1M,1M以上的内存空间在实模式下不会被使用。
    2. 在实模式所有的内存数据都可以被访问。不存在用户态、内核态之分。
    3. 在BIOS加载、MBR、ntdlr启动阶段都处在实模式下。

    保护模式 :对于保护模式大家并不陌生;是目前操作系统的运行模式,利用内存管理机制来实现线性地址到物理地址的转换,具有完善的任务保护机制。

    保护模式常识:

    1. 现在应用程序运行的模式均处于保护模式。
    2. 横向保护,又叫任务间保护,多任务操作系统中,一个任务不能破坏另一个任务的代码,这是通过内存分页以及不同任务的内存页映射到不同物理内存上来实现的。
    3. 纵向保护,又叫任务内保护,系统代码与应用程序代码虽处于同一地址空间,但系统代码具有高优先级,应用程序代码处于低优先级,规定只能高优先级代码访问低优先级代码,这样杜绝用户代码破坏系统代码。

    虚拟8086 模式: 简称V86模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。可以把8086程序当做保护模式的一项任务来执行。虚拟8086允许在不退出保护模式的情况下执行8086程序。

    虚拟8086常识:

    1. 寻址的地址空间是1M字节.
    2. 可以在虚拟8086模式下运行16位DOS程序。
    3. 在V86模式下,代码段总是可写的;这与实模式相同,同理,数据段也是可执行的。
    4. 32系统编写V86模式的程序:

    2. 保护模式寻址基础知识

    接下来就以32位系统为例,介绍保护模式下,内存中一些地址转换相关的寄存机和数据结构

    2.1 内存地址概念

    逻辑地址 :在进行C语言编程中,能读取变量地址值(&操作),实际上这个值就是逻辑地址,也可以是通过malloc或是new调用返回的地址。该地址是相对于当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,CPU不进行自动地址转换)。应用程序员仅需和逻辑地址打交道,而分段和分页机制对一般程序员来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量]。

    线性地址 :是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。

    物理地址(Physical Address) 是指出目前CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了,比如在实模式下。

    2.2 虚拟地址,线性地址,物理地址关系

    对于保护模式下地址之间的转换,对程序员来说是透明的。那么物理内存通过内存管理机制是如何将虚拟地址转换为物理地址的呢?

    1、当程序中的指令访问某一个逻辑地址时,CPU首先会根据段寄存器的内容将虚拟地址转化为线性地址。

    2、如果CPU发现包含该线性地址的内存页不在物理内存中就会产生缺页异常,该异常的处理程序通过是操作系统的内存管理器例程。内存管理器得到异常报告后会根据异常的状态信息。特别是CR2寄存器中包含的线性地址,将需要的内存页加载到物理内存中。

    3、然后异常处理程序返回使处理器重新执行导致页错误异常的指令,这时所需要的内存页已经在物理内存中,所以便不会再导致页错误异常。


    虚拟地址------(段机制)------->线性地址------(页机制)------->物理地址。


    注:Linux中虚拟地址和线性地址一般是一样的;Windows平坦内存模型中,虚拟地址和线性地址也一样。


    2.3 段式机制及实例分析

    前面说到在线性地址转换为物理地址之前,要先由逻辑地址转换为线性地址。系统采用段式管理机制来实现逻辑地址到线性地址的转换。保护模式下,通过”段选择符+段内偏移”寻址最终的线性地址。

    CPU的段机制提供一种手段可以将系统的内存空间划分为一个个较小的受保护的区域,每个区域为一个段。相对32位系统,也就是把4G的逻辑地址空间换分成不同的段。每个段都有自己的起始地址(基地址),边界和访问权限等属性。实现段机制的一个重要数据结构就是段描述符。

    下面是个程序实例中显示除了各个段的值:

    图中给出了代码段CS,堆栈段SS,数据段DS等段寄存器的值;从得到的值可知,SS=DS=ES是相等的,至于为什么有些段的值相等,后面会说到。 以实例中给出的地址0x83e84110 为例,哪里是段描述符,哪里是段内偏移, 又是如何将该逻辑地址转换为线性地址的呢?相信很多人都迫不及待的想知道整个转换过程,接下来就要看看逻辑地址到线性地址详细转换过程。

    上面说到段式管理模式下有段选择符+段内偏移寻址定位线性地址,其实际转换过程如下图所示

    从图中可知,逻辑地址到线性地址的转换,先是通过段选择符从描述符表中找到段描述符,把段描述符和偏移地址相加得到线性地址。也就是说要想得到段描述符需要三个条件:

    1. 得到段选择符。
    2. 得到段描述符表
    3. 从段描述符表中找到段描述符的索引定位段描述符。

    前面我们提到了段描述符 + 偏移地址,并没有提段选择符和段描述符表。所以我们要弄清楚这几个观念段选择符,段描述符表,段描述符,以及如何才能得到这几个描述符?

    2.3.1 段描述符基础知识

    从上图可知,通过段选择符要通过段描述符表找到段描述符,那么段描述符表是什么,又是怎么得到段描述符表呢?

    在保护模式下,每个内存段就是一个段描述符。其结构如下图所示:

    图中看出,一个段描述符是一个8字节长的数据结构,用来描述一个段的位置、大小、访问控制和状态等信息。段描述符最基本内容是段基址和边界。段基址以4字节表示(图中可看出3,4,5,8字节)。4字节刚好表示4G线性地址的任意地址(0×00000000-0xffffffff)。段边界20位表示(1,2字节及7字节的低四位)。

    2.3.2 段描述符表实例解析

    在现在多任务系统中,通常会同时存在多个任务,每个任务会有多个段,每个段需要一个段描述符,段描述符在上面一小节已经介绍,因此系统中会有很多段描述符。为了便于管理,需要将描述符保存于段描述符表中,也就是上图画出的段描述符表。IA-32处理器有3中描述符表:GDT,LDT和IDT。

    GDT是全局描述符表。一个系统通常只有一个GDT表。GDT表也即是上图中的段描述符表,供系统中所以程序和任务使用。至于LDT和IDT今天不是重点。

    那么如何找到GDT表的存放位置呢?系统中提供了GDTR寄存器用了表示GDT表的位置和边界,也就是系统是通过GDTR寄存器找到GDT表的;在32位模式下,其长度是48位,高32位是基地址,低16位是边界;在IA-32e模式下,长度是80位,高64位基地址,低16位边界。

    位于GDT表中的第一个表项(0号)的描述符保留不用,成为空描述符。如何查看系统的GDT表位置呢?通过查看GDTR寄存器,如下图所示

    从上图看出GDT表位置地址是0×8095000,gdtl值看出GDT边界1023,总长度1024字节。前面知道每一项段描述符占8字节。所以总共128个表项。图中第一表项是空描述符。

    2.3.3 段选择符结构

    前面我们介绍了段描述符表和段描述符的格式结构。那么如何通过段选择符找到段描述符呢,段选择符又是什么呢?

    段选择符又叫段选择子,是用来在段描述符表中定位需要的段描述符。段选择子格式如下:

    7

    段选择子占有16位两个字节,其中高13位是段描述在段描述表中的索引。低3位是一些其他的属性,这里不多介绍。使用13位地址,意味着最多可以索引8k=8192个描述符。但是我们知道了上节GDT最多128个表项。

    在保护模式下所有的段寄存器(CS,DS,ES,FS,GS)中存放的都是段选择子。

    2.3.4 逻辑地址到线性地址转换实例解析

    已经了解了逻辑地址到虚拟地址到线性地址的转换流程,那就看看在前面图中逻辑地址0x83e84110对应的线性地址是多少?

    首先,地址0x83e84110对应的是代码段的一个逻辑地址,地址偏移已经知道,也就是段内偏移知道,通过寄存器EIP得到是0x83e34110。段选择符是CS寄存器CS=0008,其高13位对应的GDT表的索引是1,也就是第二项段描述符(第一项是空描述符)。GDT表的第二项为标红的8个字节

    通过段描述的3,4,5,8个字节得到段基址。

    如上图所示第二项段描述符的3,4,5,8字节对应的值为0×00000000。由此我们得到了段机制和段内偏移。最后的线性地址为段基址+段内偏移=0×0+0x83e34110=0x83e34110。

    由此我们知道在32系统中逻辑地址就是线性地址。

    其实通过观察其他的段选择子会发现,所有段选择子对应的基地址都是0×0,这是因为在32系统保护模式下,使用了平坦内存模型,所用的基地址和边界值都一样。既然基地址都是0,那么也就是线性地址就等于段内偏移=逻辑地址。

    总之:

    1. 段描述符8字节
    2. GDTR是48位
    3. 段选择子2个字节。

    2.4 页式机制及实例分析

    前面介绍了由逻辑地址到线性地址的转换过程,那么接下来就要说说地址是如何将线性地址转为物理地址。需要先了解一些相关的数据结构。

    前面说到如果CPU发现包含该线性地址的内存页不在物理内存中就会产生缺页异常,该异常的处理程序通过是操作系统的内存管理器例程。内存管理器得到异常报告后会根据异常的状态信息。特别是CR2寄存器中包含的线性地址,将需要的内存页加载到物理内存中。然后异常处理处理返回使处理器重新执行导致页错误异常的指令,这时所需要的内存页已经在物理内存中,所以便不会再导致也错误异常。

    32位系统中通过页式管理机制实现线性地址到物理地址的转换,如下图:

    2.4.1 PDE结构及如何查找内存页目录

    从上图中我们知道通过寄存器CR3可以找到页目录表。那么CR3又是什么呢?在32系统中CR3存放的页目录的起始地址。CR3寄存器又称为页目录基址寄存器。32位系统中不同应用程序中4G线性地址对物理地址的映射不同,每个应用程序中CR3寄存器也不同。也就是说每个应用程序中页目录基址也是不同的。

    从上图知道页目录表用来存放页目录表项(PDE),页目录占一个4kb内存页,每个PDE长度为4字节,所以页目录最多包含1KB。没启用PAE时,有两种PDE,这里我们只讨论使用常见的指向4KB页表的PDE。

    页目录表项的高20位表示该PDE所指向的起始物理地址的高20位,该起始地址的低12位为0,也就是通过PDE高20位找到页表。由于页表低12位0,所以页表一定是4KB边界对齐。 也就是通过页目录表中的页目录表项来定位使用哪个页表(每一个应用程序有很多页表)。

    以启动的calc程序为例,CR3寄存器是DirBase中的值,如下图

    Calc.exe程序对应的CR3寄存器值为0x2960a000,下面是对应PDT结构

    2.4.2页表结构解析

    页表是用来存放页表表项(PTE)。每一个页表占4KB的内存页,每个PTE占4个字节。所以每个页表最多1024个PTE。其中高20位代表要使用的最终页面的起始物理地址的高20位。所以4KB的内存页也都是4KB边界对齐。



    原文链接:http://blog.jobbole.com/90947/

    展开全文
  • 寻址空间与内存寻址

    2020-05-06 01:51:30
    寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要...

    寻址空间:

    寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

    内存寻址:

    内存寻址是指CPU允许支持的内存大小。双通道内存技术其实是一种内存控制和管理技术,它依赖于芯片组的内存控制器发生作用,在理论上能够使两条同等规格内存所提供的带宽增长一倍。当计算机面临大量的数据流时,32位的寄存器和指令集不能及时进行相应的处理运算。32位处理器一次只能处理32位,也就是4个字节的数据;而64位处理器一次就能处理64位,即8个字节的数据。举例来说,32位好像是单车道,当车流过大的时候,就会无法承载,而64位好比高速公路,在多任务,多程序处理的情况下,64位计算平台能随意加速、把电脑性能发挥到极致。

    展开全文
  • 内存寻址方式 一,处理字符问题 ‘ ’方式指明数据字符形式,转换成ASCII码 大写 二进制 小写 二进制数 A 01000001 a 01100001 B 01000010 b 01100010 C 01000011 c 01100011 D 01000100 d ...
  • 内存寻址(一)

    2019-07-05 15:44:25
    内存寻址(一) 一、内存地址 使用80x86微处理器时需要区分一下三种不同的地址: 逻辑地址:包含在机器语言指令中用来指定一个操作数或一条指令的地址,每一个逻辑地址都由一个段标识符或叫段选择符(16位)和偏移...
  • 8086处理器的内存寻址方式

    千次阅读 2019-11-30 18:59:44
    8086处理器的内存寻址方式主要分三种 寄存器寻址 立即寻址 内存寻址(也有书叫存储器操作数寻址) 寄存器寻址 最简单的寻址方式就是寄存器寻址。也就是指程序执行时,操作的数就存放在寄存器当中,可以直接从...
  • 内存寻址

    2018-06-30 14:18:53
    内存寻址分为:1.逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或一条指令的地址。2.线性地址(linear address)(也称虚拟地址(virtual address)):是一个32位无符号整数,可以用来表示高达4GB...
  • 第一讲 内存寻址

    千次阅读 2015-09-14 22:46:32
    引子一段代码:#include int foo; void main() { foo = 100; printf("%d\n",foo); } 问题:变量foo存放在内存的什么位置,printf又在什么位置,CPU如何访问(修改)它们?
  • 在基于Intel 80x86微处理器的平台上,内存寻址是内存管理最重要的一部分内容。而关于内存地址在实际的软件及硬件实现上,也出现了不同的表示方式:逻辑地址(logical address)、线性地址/虚拟地址(linear address/...
  • 内存寻址之分页机制

    千次阅读 2017-12-02 14:51:54
    分段和分页没有什么必然联系,分段可以说是 Intel 的 CPU 一直保持着的一种机制,而分页只是保护模式下的一种内存管理策略。想开启分页机制,CPU必须工作在保护模式,而工作在保护模式可以不开启分页。分页机制由...
  • 大家知道,Nvidia公司发布的CUDA6开发包拥有一个新特性,就是“统一内存寻址”,那究竟统一内存寻址有什么特殊的地方呢?我们编写CUDA代码跟以前有什么区别呢?现在拥有的GPU架构能够很好的支持吗?我们带着这些问题...
  • 32位的地址线最多可寻址多大的内存空间?? 内存是存储单元的集合,每个 存储单元 有一个唯一的物理地址,大多数计算机的 存储单元 都是字节(Byte)可编址的,即8个 bit 位用一个地址, 如下图所示。 8 根地址线...
  • 内存寻址 、硬件中的分段与分页 、Linux内存管理 页与内存管理区 、kmalloc()和vmalloc()
  • 计算机内存寻址

    千次阅读 2015-11-01 23:14:22
    他们之间有什么关系,内存是如何寻址,本文主要介绍的就是内存寻址。 1、基本概念: cpu段式管理:段式管理的基本原理是指把一个程序分成若干个段(segment)进行存储,每个段都是一个逻辑实体(logical entity)...
  • 1. 内存寻址方式:  确定访问内存存储单元偏移地址方式,称为寻址方式。  名称 格式 直接寻址 [偏移量值] 寄存器简介寻址 [基址寄存器/变址寄存器] 寄存器相对寻址 [基址寄存器/变址寄存器+偏移量值] ...
  • 内存寻址优化

    千次阅读 2016-04-29 15:21:30
    内存寻址的简单优化问题描述: 在程序中,使用malloc或new创建一块内存用来存放二维或多维数组,当需要对数组进行遍历或进行块操作时,就需要对内存进行寻址操作,在寻址时,不可避免的存在不连续取址操作。
  • X64 操作系统内存寻址

    千次阅读 2017-07-19 14:52:50
    在保护模式,CPU发出的线性地址,内存管理单元(MMU),根据当前CR3寄存器所指向的页表物理地址将该线性地址翻译成物理地址进行内存访问,该过程称为地址翻译。 在x64体系结构中,线性地址的结构如图   在x64体系中只...
  • 保护模式下寻址 段机制实例分析如图,8086内部有8个16位寄存器,AX BX CX DX SI DI BP SP为了加快指令执行速度,8086内部有一个6字节的指令预取队列,当处理器执行不需要访问内存的指令时,指令预取部件访问内存预取...
  • 引言 所谓内存寻址,简单说来就是cpu接受到指令后需要从内存中取得相应数据,但是内存中的数据都是有对应地址的,需要通过地址来获取相应地址段上的数据,这也就是为什么要内存寻址。 所谓地址在操作系统中分为逻辑...
  • 陈老师学堂在线《Linux内核分析与应用》导学第二章 : 内存寻址
  • 同时,8086的诞生也是处理器内存寻址技术的第一次飞跃。 对于一根实际的、实实在在的、物理的、可看得见、摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,...
  • CUDA 6.0 统一内存寻址

    千次阅读 2014-08-08 15:32:13
    CUDA 6在现有的内存池结构上增加了一个统一内存系统,程序员可以直接访问任何内存/显存资源,或者在合法的内存空间内寻址,而不用管涉及到的到底是内存还是显存。 CUDA 6的数据拷贝由程序员的手动转移,变成自动...
  • linux的内存寻址过程

    2009-04-13 20:24:00
    详细介绍了有关地址的各个概念和linux系统的寻址过程。使用户对linux系统的地址有个系统的认识过程。
  • 对加载和存储的汇编指令目前有三种寻址模式:偏移寻址(Offset addressing),前变址寻址(Pre-indexed ...最终访问内存的地址 = Rn+offset 这种操作后Rn的值不会改变 前变址寻址 语法格式如下 [Rn, offset]! 最终.
  • 内存寻址一(分段)

    千次阅读 2014-05-01 00:21:40
    内存地址 逻辑地址
  • 关于内存寻址空间

    2016-01-29 20:36:03
    内存的位宽是1个字节,意思是每次访问内存一个地址单元的时候,可以读/写1个字节,这是数据总线的宽度;而能够寻址多少个地址单元,则是地址总线的宽度,与数据总线宽度无关。 举个例子,一条街道上的有65536所房子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,148
精华内容 46,059
关键字:

内存寻址