精华内容
下载资源
问答
  • 内存地址计算问题

    千次阅读 2017-06-05 11:51:19
    1.内存地址从A4000H到CBFFFH共有几个存储单元是怎么计算的?:CBFFF-A4000+1=28000(十六进制) CBFFF-A4000+1=CC000-A4000=(CC-A4)*16^3=(CC-A4)*2^12=(2*16+8)*2^12=40*2^12=160*2^10 (B)=160 (KB)2.若内存按字节...

    1.内存地址从A4000H到CBFFFH共有几个存储单元是怎么计算的?

    :CBFFF-A4000+1=28000(十六进制) 

    CBFFF-A4000+1
    =CC000-A4000
    =(CC-A4)*16^3
    =(CC-A4)*2^12
    =(2*16+8)*2^12
    =40*2^12
    =160*2^10 (B)
    =160 (KB)


    2.若内存按字节编址,用存储容量为32K×8比特的存储器芯片构成地址编号A0000H至DFFFFH的内存空间,则至少需要几片?


    :内存空间是DFFFFH-A0000H+1 = 40000H 

     =4*16^4 

     = 2^18 = 2^10*256=256kb

    256kb/32 = 8片

    内存是按字节编址的,片子容量是32K*8比特,所以和片子的单位应该统一,故应该是用8片


    3.计算机SRAM 容量为4K x 8bit,配置地址首地址为:06800H,则其末地址是多少  ?

    内存容量  =末地址-首地址+1  
    4K*8bit = 4KB,


    4K x 8bit = 2^12 = 1000H(注意,不是FFFH!!!)

    末地址 = 容量+首地址-1

           = 1000H + 6800H - 1 

           = 077FFH 


    4.若内存按字编址,某存储器的芯片容量为4K*4bit,用此芯片构成从80000H 到BFFFFH 的内存, 
    要用( 128  )片这样的内存。某RAM 芯片有22 条地址线,8 条数据线,则该RAM 芯片容量为( 4MB  )  


    这道题的第二问,只提供了地址线和数据线的个数,如何计算的容量?  

    :容量=单元个数X 位宽,  


    已知地址就知道单元格式是2^22=4M,已知数据线就知道位宽是8,那么容量=2^22 X 8 bit=4MB  


    5.(2004 年5 月上午试题47.48)内存地址从4000H 到43FFH,共有( 1024  )个内存单元。若该内 存单元可存储16位二进制数,并用4 片存储器芯片构成,则芯片的容量是( 256*16bit  )

    : 首先总容量是1024*16bit,而这些容量是有4 片组成的,那么一片的容量是256*16bit(因为内存单元 可存储16位二进制数,所以确定位宽16不变) 


       

    展开全文
  • 用于学习如何计算计算机内存地址的交互式工具。 专门用于研究在给定教科书问题的特定输入的情况下如何形成直接映射的高速缓存存储器地址。 学分 作者:梅根·奥尼尔(Megan O'Neill) 最初的时间: 2018年3月27日-...
  • 计算机中的物理地址内存

    万次阅读 2007-11-19 16:02:00
    这两天有个问题一直萦绕着,计算机中的物理地址和内存地址,虚地址究竟是怎么回事?地址是怎样分配的呢?翻了下操作系统课本,恩,晚上回去看看存储器管理,虚拟存储器,磁盘存储器管理这几章。隐约还记得微机原理学...

    这两天有个问题一直萦绕着,计算机中的物理地址和内存地址,虚地址究竟是怎么回事?地址是怎样分配的呢?

    翻了下操作系统课本,恩,晚上回去看看存储器管理,虚拟存储器,磁盘存储器管理这几章。隐约还记得微机原理学的寄存器寻址,现在网上看看,搜集一下待做整理。

    昨天看到论坛上有人问,调程序的时候编译器分配的是物理地址还是虚地址(差不多是这意思),看到大家基本回答是说虚地址,操作系统之上的根本就不可能接触物理地址,而且可用的物理地址是相当混乱的,必须由操作系统整理映射。(差不多吧?个人认为应该没错)刚刚搜索的结果有说:程序里指针用的地址都是些虚拟地址,而且其范围完全可以大于你拥有的内存大小。当要执行这些程序段落时,系统首先要把机器码装进内存,这里就有个把虚拟地址映射到物理地址的问题。

    在一台计算机中,计算机系统为了唯一的标示一个内存单元,操作系统会给每一个内存单元编上一个绝对的号,计算机系统就通过这个编号来定为每一个内存单元的物理位置,这个编号称为内存的物理地址 。

    针对程序编译过程中的地址问题:

    汇编器(assembler)只是生成一个需重定位的object文件。这个目标文件需经过链接器(Linker)与相应的库链接起来生成一个可执行的文件。assembler 产生的代码是从 0 开始编址。经过 Lineker 重定位后生成的可执行映象按OS的不同而不同。至于内存中的全局以及静态变量的编址也是需重定位的。局部变量则无需重定位
    汇编生成的,是一些浮动模块和一张符号表。链接器按照这张符号表,把这些模块装配成一个整体。在运行时,系统的装载器做重定位,才真正确定了地址。这个地址还是虚拟地址。系统的存储管理子系统为其分配真正的物理地址。
    some additional stuffs:
    内存地址对齐(Byte Alignment)

    大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址. 比如Motorola 68000不允许将16位的字存储到奇数地址中, 将一个16位的字写到奇数地址将引发异常.

    实际上, 对于c中的字节组织, 有这样的对齐规则:
    • 单个字节(char)能对齐到任意地址
    • 2字节(short)以2字节边界对齐
    • 4字节(int, long)以4字节边界对齐
    不同CPU的对其规则可能不同, 请参考手册.

    为什么会有上述的限制呢? 理解了内存组织, 就会清楚了
    CPU通过地址总线来存取内存中的数据, 32位的CPU的地址总线宽度既为32位置, 标为A[0:31]. 在一个总线周期内, CPU从内存读/写32位. 但是CPU只能在能够被4整除的地址进行内存访问, 这是因为: 32位CPU不使用地址总线的A1和A2. (比如ARM, 它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31].)

    访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了. 在4字节中, 通过A0和A1确定某一个字节.

    再看看刚才的message结构, 你想想它占了多少字节? 别想当然的以为是10个字节. 实际上它占了12个字节. 不信? 用sizeof(message)看吧. 对于结构体, 编译器会针对起中的元素添加"pad"以满足字节对齐规则. message会被编译器改为下面的形式:

    struct Message
    {
       short opcode;
       char subfield;
       char pad1;             // Pad to start the long word at a 4 byte boundary
       long message_length;
       char version;
       char pad2;             // Pad to start a short at a 2 byte boundary
       short destination_processor;
       char pad3[4];          // Pad to align the complete structure to a 16 byte boundary
    };
    如果不同的编译器采用不同的对齐规则, 对传递message可就麻烦了.

    Byte Endian


    是指字节在内存中的组织,所以也称它为Byte Ordering.   

             对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:

    (1) 它的地址是多少?

    (2) 它的字节在内存中是如何组织的?

             针对第一个问题,有这样的解释:

             对于跨越多个字节的对象,一般它所占的字节都是连续的, 它的地址等于它所占字节最低地址.(链表可能是个例外, 但链表的地址可看作链表头的地址).

    比如: int x, 它的地址为0x100. 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节.

             上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定. 考虑一个W位的整数. 它的各位表达如下:

    [Xw-1, Xw-2, ... , X1, X0]

             它的MSB (Most Significant Byte, 最高有效字节)为[Xw-1, Xw-2, ... Xw-8]; LSB (Least Significant Byte, 最低有效字节)为 [X7, X6, ..., X0]. 其余的字节位于MSB, LSB之间.

             LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址? 这就引出了大端(Big Endian)与小端(Little Endian)的问题。

             如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端. DEC (Digital Equipment Corporation, 现在是Compaq公司的一部分)和Intel的机器一般采用小端. IBM, Motorola, Sun的机器一般采用大端. 当然, 这不代表所有情况. 有的CPU即能工作于小端, 又能工作于大端, 比如ARM, PowerPC, Alpha. 具体情形参考处理器手册.

             举个例子来说名大小端:   比如一个int x, 地址为0x100, 它的值为0x1234567. 则它所占据的0x100, 0x101, 0x102, 0x103地址组织如下图:

             0x01234567的MSB为0x01, LSB为0x67. 0x01在低地址(或理解为"MSB出现在LSB前面,因为这里讨论的地址都是递增的), 则为大端; 0x67在低地址则为小端.

    认清这样一个事实: C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址.

    在C++中,内存被分为五个块: 堆,栈,自由存储区,全局/静态变量区和常量存储区.

    栈: 是编译器在需要的时候分配,在不需要的时候自动清除的一块区域.通常用来存储局部变量,形式参数.

    堆: 一般是由new分配的区域,编译器不会去管这块存储区域,主要是由程序员控制,一个new对应一个delete.如果用new分配了一块内存而没有进行释放的话,只有等到进程结束的时候被系统自动收回.

    自由存储区:  由malloc分配的区域,和堆十分相似,不同的地方是它的释放用free.

    全局/静态变量区: 用来存储全局变量和静态变量.

    常量存储区: 这是一块很特殊的区域,不允许程序员修改里边的量。

    展开全文
  • 地址生成(操作系统是怎么和程序的编译、执行过程交互的) 连续内存分配 (操作系统如何有效的管理连续的内存分配) 计算机体系结构/内存分层体系 计算机体系结构 内存分层体系 在操作系统的内存管理范例 计算机...

    计算机体系结构/内存分层体系

    操作系统是如何管理物理内存?

    • 计算机体系结构/内存分层体系(操作系统如何有效的管理硬件内存)
    • 地址空间 & 地址生成(操作系统是怎么和程序的编译、执行过程交互的)
    • 连续内存分配 (操作系统如何有效的管理连续的内存分配)

    计算机体系结构/内存分层体系

    • 计算机体系结构
    • 内存分层体系
    • 在操作系统的内存管理范例

    计算机体系结构主要分为三个部分,CPU,内存,设备(I/O)。CPU的作用是控制程序的执行,内存
    放置了程序运行的代码和数据,外设配合程序完成更多的功能。

    在这里插入图片描述

    需要将CPU访问的物理内存有效的管理起来,不单单包括了主存还包括了其他方面

    CPU访问的数据包含很多类,如图:
    在这里插入图片描述

    虚拟化地址空间-地址映射
    在这里插入图片描述

    抽象
    应用程序通过访问抽象的逻辑地址空间,由操作系统映射成实际的物理空间,而不必考虑琐碎的底层实现的细节。
    保护
    为了避免程序访问别的程序的地址空间造成破坏,在内存中需要保护程序访问的地址空间,通过隔离使得程序有各自独立的地址空间,隔离机制的实现是靠操作系统来完成的。
    共享
    进程间需要进行交互,如何实现共享的空间,让进程安全、可靠、有效的进行消息的传递。
    虚拟化
    以时间换空间更加有效的利用有限的物理内存更大的利用资源。让最需要内存的程序获得他所需要的内存空间,让暂时不需要的程序存储在磁盘上,通过缺页中断的机制来完成相应的功能。

    管理内存的不同方法

    • 程序重定位
    • 分段
    • 分页
    • 虚拟内存
    • 按需分页虚拟内存
    展开全文
  • 32位机最大虚拟内存为4GB。 因为2^32Byte = 4GB. 1)2是怎么来的呢?计算机中识别的是0和1二进制数,不是八进制、十进制等,所以是2^32。 2)4GB = 4*1024 = 4096MB = 4096*1024 = 4194304KB = 4194304*1024 = ...

    我的理解是:

    32位机最大虚拟内存为4GB。

    因为2^32Byte = 4GB.

    1)2是怎么来的呢?计算机中识别的是0和1二进制数,不是八进制、十进制等,所以是2^32。

    2)4GB = 4*1024 = 4096MB

     = 4096*1024 = 4194304KB

     = 4194304*1024 =  4294967296Byte = 2^32Byte

    3)4294967296 - 1换算成十六进制为:FFFFFFFF,而地址是按十六进制表示的。

     

    64位机的情况:

    2^64 = 18,446,744,073,709,551,616Byte

     / 1024 / 1024 / 1024 = 17,179,869,184GB

     

    如有错误,敬请指正!

    展开全文
  • 内存地址对齐

    2011-10-24 13:52:23
    以前整理过这个问题,但是只是想知道怎么个对齐法,但是为什么要对齐的问题没有考虑过~唉。。要知其所以然。... 内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独
  • 计算机组成 计算机 拆开 主体 主板上有 CPU 总线(地址总线、数据总线、控制总线) 内存(条) ...抽象:逻辑图(图片来源:8086汇编 CPU 寄存结构) ...上面谈到的二进制信息可以是数据,可以是指令,关键是cpu怎么
  • 计算机内存管理

    2011-05-18 12:42:00
    进程地址空间  Windows为每个进程分配了4GB的虚拟地址空间,让每个进程都认为自己拥有4GB的内存空间,4GB怎么来的? 32位 CPU可以取地址的空间为2的32次方,就是4GB.  当我们在Windows中双击一个应用...
  • 深入理解内存地址

    千次阅读 2015-03-24 02:16:17
    我们先来看看在计算机刚出来不久内存怎么被使用,然后随着技术的发展又是怎么演化的.当然这里的描述只是简单化的体现下那种思想,很多细节未必准确.   简单的历史故事 1.单用户使用内存 刚开始的时候电脑功能...
  • 内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存...(1)Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问...
  • 我们通常所说的内存容量,就像我刚刚提到的 8GB,其实指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。 Linux 内核给每个进程都提供了一...
  • 前言 从大一一直困惑到研三的这几个概念今天静下心来总算是搞明白了,太开心太开心...答案当然是“地址”(address)了,你有居住地址,数据也有自己的地址,这个地址就是“内存地址”,如下一段程序: #include<s...
  • 分页内存管理——虚拟地址到物理地址的转换

    万次阅读 多人点赞 2018-08-10 23:30:57
    此篇博客内容在于着重帮助读者明白在分页内存管理下,虚拟地址和物理地址转换计算怎么进行的。 有关分页内存管理的其他知识请事先参阅有关资料。^_^ 一、在计算之前需要了解如下知识: 1.对每个程序而言,...
  • api hook的函数和内存地址空间的关系是什么呢?为什么api hook不需要注入内存就可以内存拿值呢?怎么才能计算对应的地址范围?
  • 深入理解内存(2):发展历史,内存地址

    千次阅读 2013-01-15 20:08:51
    我们先来看看在计算机刚出来不久内存怎么被使用,然后随着技术的发展又是怎么演化的.当然这里的描述只是简单化的体现下那种思想,很多细节未必准确.   简单的历史故事 1.单用户使用内存 刚开始的时候电脑功能...
  • Linux的内存管理,是操作系统的最核心的...当然不是,linux系统给每一个进程都提供了一个独立的虚拟地址空间,而且这个空间是连续的,这样进程就可以 很方便的访问内存空间,确切的是说是虚拟内存空间,也就是说...
  • 我们也知道CPU通过内存地址获取一条指令和数据,而他们存在存储单元中。现在就有一个问题。我们的数据和指令不可能刚好是8bit,如果小于8位,没什么问题,顶多是浪费几位(或许按字节编址是为了节省内存空间考虑)。...
  • 计算机原理》课本说,启动时,主引导记录会存入内存地址0x7C00。 这个奇怪的地址,是怎么来的,课本就不解释了。我一直有疑问,为什么不存入内存的头部、尾部、或者其他位置,而偏偏存入这个比 32KB 小1024字节的...
  • 内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等 内存映射 我们通常所说的内存容量指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存...
  • 一、 内存映射 我们通常所说的内存容量,指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢? Linux...
  • 一,虚拟内存的三条总结 1,将内存看做硬盘的高速缓存  内存中只保存程序的活动区域(数据...但是我们只有一块物理上的内存怎么隔离呢?这就是虚拟内存的一个重要目标 二,内存管理的要求 1.两种操作系统的调...
  • 关于cpu分段的段地址计算

    千次阅读 2017-05-17 17:12:52
    《微机原理》这本课程学过,不过后来我忘记了。今天复习的时候,作为学渣的我解了好大一个疑惑。 书上说,8086CPU有16位的数据总线和20位的地址...分段的地址怎么计算呢: 我们知道段寄存器是16位的,16为
  • 随着计算机的高速发展,计算机早已不是单道处理模式了,不再使用古老的纸带打孔的方式,将持续输入到cpu,让其执行了,而是将程序加载到内存中去,那么当多个程序同时运行的情况下,怎么去给程序分配位置就是发明者...
  • java中的哈希码值是怎么计算的?

    千次阅读 2019-12-02 20:08:07
    在Java中,哈希码代表了对象的一种...返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。 2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 360
精华内容 144
关键字:

内存地址怎么计算