精华内容
下载资源
问答
  • 在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存...
    在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。

    先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。有的地方呢,也叫这个虚拟内存为内存交换区。

    那么,什么是虚拟内存地址和物理内存地址呢。假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址0~0xFFFFFFFF(4G)的地址空间,但如果你的计算机只有256M的物理内存0x~0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该如何处理呢?回答这个问题前,先说明计算机的内存分页机制。

    计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的,所以呢,在这里,虚拟内存页的个数势必要大于物理内存页帧的个数。在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。但是问题来了,虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。

    现在来回答什么是虚拟内存地址和物理内存地址。虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。页号就不必解释了,上面已经说了,页号对应的映射到一个页帧。那么,说说偏移量。偏移量就是我上面说的页(或者页帧)的大小,即这个页(或者页帧)到底能存多少数据。举个例子,有一个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的:首先到页表中找到页号4对应的页帧号(比如为8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMC(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

    转自:https://blog.csdn.net/fukaibo121/article/details/75105848
    展开全文
  •  大端模式(Big-endian),是指数据的低位(就是权值较小的后面那几)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而...
    CPU:大小端模式的区别:
          大端模式(Big-endian),是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
          小端模式(Little-endian),是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

        内存地址高地的理解:
        我们对内存表的高位和低位的理解,就可以想做这里就是一张白纸.  我们把每个空格都当作一个位置,从0~1000开始计数,写在最前的就是低位,
            比如说写四个数,从0~3 . GAME数据的低位~高位就是从G到M.
        寄存器高位低位的理解:
            之后呢,我们从内存表中区数据,放入寄存器中,我们可以把寄存器比做一个水桶,我们放入数据的时候肯定是把"水"先倒到水筒的底部.
            如我们从内存中区GAME放入到水桶中的话 水桶中存放的数据就成了EMAG 也就是 45 4D 41 47 (注意每个字节是两个16进制的字符)
            而水桶的高位和地位呢,想必大家会很明白,水桶的最上方就是高位,水桶底就是低位,所以EMAG 数据的高低位就是 E~G(E为最高位 G为最低位)
    嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。
        我们常用的X86结构是小端模 式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式
    可以用下面的程序测试:
        int checkSystem( )
        {
               union check
               {
                int i;
                char ch;
               } c;
              c.i = 1;
              return (c.ch ==1);
        }
        如果当前系统为大端模式这个函数返回 0;如果为小端模式,函数返回 1。
    展开全文
  • 32下的内存地址分布

    千次阅读 2019-08-12 11:30:11
    32下的内存地址分布图如下:1g为内核空间,3g为用户空间 内核空间:内核空间表示运行在处理器最高级别的超级用户模式(supervisor mode)下的代码或数据,内核空间占用从0xC0000000到0xFFFFFFFF的1GB线性地址空间...

    32位下的内存地址分布图如下:1g为内核空间,3g为用户空间

    内核空间:内核空间表示运行在处理器最高级别的超级用户模式(supervisor mode)下的代码或数据,内核空间占用从0xC0000000到0xFFFFFFFF的1GB线性地址空间,内核线性地址空间由所有进程共享,但只有运行在内核态的进程才能访问,用户进程可以通过系统调用切换到内核态访问内核空间,进程运行在内核态时所产生的地址都属于内核空间。

    用户空间:
    用户空间占用从0x00000000到0xBFFFFFFF共3GB的线性地址空间,每个进程都有一个独立的3GB用户空间,所以用户空间由每个进程独有,但是内核线程没有用户空间,因为它不产生用户空间地址。另外子进程共享(继承)父进程的用户空间只是使用与父进程相同的用户线性地址到物理内存地址的映射关系,而不是共享父进程用户空间。运行在用户态和内核态的进程都可以访问用户空间。
    在用户空间内内存被分为:0x08048000开始
    text段-代码段
    text段存放程序代码,运行前就已经确定(编译时确定),通常为只读

    .rodata-只读数据段
    存放一些只可以读的常量数据 比如:被const修饰的全局变量,被define宏定义的常量,和只可读的字符串常量。

    .data
    存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存放在这个区域,static 声明的变量,不管它是全局变量也好,还是在函数之中的也好,只要是没有赋初值都存放在.bss段,如果赋了初值,则把它放在.data段。

    .bss
    定义而没有赋初值的全局变量和静态变量,放在这个区域;

    heap
    堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。
    当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
    当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。由低向高。

    共享库区域
    这里被内核用来把文件内容直接映射到内存。所有的应用程序都可以使用linux提供的mmap()系统调用或者在windows中使用CreateFileMapping()/MapViewOfFile来进行这样的映射。memory mapping是进行文件I/O的高效方法,所以动态库的加载使用这个方式来实现。当然,也可以进行一些不关联到文件的程序数据的匿名memory mapping。在linux中,如果你通过malloc()来申请一块大的内存,C库就会在memory mapping segment中创建一个匿名memory mapping而不是使用堆空间。这里的“大”意味着大于MMAP_THRESHOLD字节,默认是128kb,可以通过mallopt()来进行调整。

    stack
    stack段存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。由高向低

    展开全文
  • 电脑内存地址位数的关系

    千次阅读 2017-11-17 10:10:15
    比如32根地址线(32个二进制表示一个地址),总共有2的32次方种组合方式,也就是能对应2的32次方个地址,每个地址可以存放一个字节的数据(8bit),也就是说可寻址的大小基本上就是RAM的大小,这里32根对应的内存...

    问题来源:指针数组是一个数组,他每个元素中都是一个地址,那么指针数组一个元素有多大?

    这取决于你的计算机的地址线的位数,他直接决定了可寻址的多少。

    比如32根地址线(32个二进制位表示一个地址),总共有2的32次方种组合方式,也就是能对应2的32次方个地址,每个地址可以存放一个字节的数据(8bit),也就是说可寻址的大小基本上就是RAM的大小,这里32根对应的内存是4GB。

    参考文章:

    http://blog.csdn.net/YuZhiHui_No1/article/details/38458681





    所以32根地址线就对应4个字节,8个十六进制数,也就是指针数组一个元素的大小。


    展开全文
  • 内存地址空间

    千次阅读 2018-06-01 17:23:23
    如果地址线是32,那可寻址的范围是4G,内存地址从0-0xffffffff。 BIOS在内存最高地址处,最低1M空间内又有很多固定的用途,如下图所示: (图片出自:赵炯——Linux内核完全剖析——基于0.12内核,图2-4) 我...
  • 在目前很多机器都使用8G内存情况下,很多软件却无法有效使用更高内存,本文主要简述使用C#语言开发的应用程序,使用系统自带的Editbin工具开启3G大内存使用
  • 关于内存地址和内存空间的理解

    千次阅读 2018-09-05 15:00:30
    1.内存地址用416进制和816进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是416进制表示,另外.....
  • 对于一个内存地址是32、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少? 东西很简单,只是年代久远,本科学的东西早就忘光了。 阅读完这边参考资料,相信你也能够做出来的!!!!!!! ...
  • 博主最近正在学习微机原理与接口技术、计算机组成原理等专业课程,产生了一个疑问:假设地址总线为10,为什么就可以访问1KB的内存?难道不该是13,才能访问1KB的内存吗?认真思考过的小伙伴,应该都会有这个疑问...
  • 内存地址存储,内存空间

    千次阅读 2018-05-13 11:56:37
    1.内存地址用416进制和816进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是416进制表示,另外一...
  • 输出64系统的内存地址

    千次阅读 2016-08-02 10:10:06
    void main() { int result; //CHECKFATAL(ret1(), "SC DONE."); int j; int i = 0x12345678; //long long在各种位数的编译器中都是8个字节 long long pi = &i; ... //输出i的地址(32
  • 64系统能使用多少内存

    万次阅读 2016-12-30 22:21:34
    疑问我们知道32win7一般只能使用4GB内存,原因是如果按照地址宽度是32bit(其实并不是)来算的话系统最多只能管理2322^{32}字节的内存(通过补丁的方式可以使32win7突破4GB的限制,关键词:ReadyFor4GB,后面我会讲...
  • 操作系统内存地址

    千次阅读 2016-12-05 23:48:53
    一个段和偏移量组成,并不是实际的物理内存地址,偏移量指段开始地址与实际内存地址之间的偏移位置 线性地址: 一个无符号的32整数,也叫虚拟地址,在页式内存地址管理中,线性地址是页式管理转换前的地址 物理...
  • 内存容量和内存地址

    千次阅读 2018-04-16 10:00:14
    当计算机的地址总线为32时,也就是说该计算机的寻址范围为2^32,即4GB。计算机可以找到4GB个储存单元,但是一个储存单元到底是8还是16还是32,不一定(可能不同的计算机定义不同...所以将内存划分成32为一格一...
  • 内存地址从AC000H到C7FFFH,共有 K个地址单元,如果该内存地址按字(16bit)编址,28片存储器芯片构成。已知构成此内存的芯片每片有16K个存储单元,则该芯片每片存储单元存储 (1)A.96 B.112 C.132 D.156 (2)A....
  • 关于内存地址与内存空间的理解

    千次阅读 2020-04-07 16:01:32
    1.内存地址 内存地址只是一个编号,代表一个内存空间.具体多大呢?...416进制表示的内存地址和用816进制表示的内存地址,其实都是代表一个8bit的存储空间而已: 2.理解内存 程序和数据平常存储...
  • C/C++ 变量内存地址高低安排

    千次阅读 2013-08-21 17:26:59
    1. 自由变量分配地址是从高地址 -> 低地址的 2.多字节的变量,高位在高地址,低位在低地址。 测试:  #include int main () { int x = 0x00f00fff; int y = 0xfff00f00; unsigned char *px1,*px2,*px3,*px...
  • 在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。 先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于...
  • 页式地址变换 虚地址结构 ...虚地址转换为内存地址计算 如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出 第一步,将虚地址转换成二进制的数; 第二步,按页的大...
  • C++内存地址分配和内存区划分简介

    千次阅读 2018-02-07 11:58:49
    C++内存地址分配和内存区划分简介 原文地址:http://blog.csdn.net/liuhuiyi/article/details/7530137 内存类型简介 内核:在一些系统中,当系统调用发生时,操作系统或者操作系统内核会编程应用程序内存的一...
  • 32与4G内存限制

    千次阅读 2015-10-07 18:48:40
    32有4G内存限制,好像人所共知。但这个32是指32的CPU还是32的操作系统?答案是,都是。内存限制,是操作系统和硬件(CPU,也许还有内存控制器)共同制约的。CPU对应的是寻址物理地址,而操作系统对应的是...
  • 关于内存地址的一些理解

    千次阅读 2018-10-11 14:33:28
    首先,必须要知道内存地址只是一个编号,如1000H,代表一个内存空间。在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。 例如经常说32的操作系统最多支持4GB的...
  • ![图片说明]...比如8086CPU来说。 地址总线20 2的20次方 1MB 那内存条呢。 内存条是1MB怎么算? 而且32CPU 内存寻址能力是4G 内存条也是4G 还有显存 这怎么理解?
  • 内存地址空间布局

    万次阅读 2014-12-04 11:58:18
    在32模式下虚拟地址空间总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址...
  • 物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少内存单元,物理地址的大小由地址总线的位宽决定!虚拟地址:虚拟地址是CPU保护模式下的...
  • 内存地址的概念和理解

    千次阅读 多人点赞 2019-05-29 09:07:24
    1.内存地址用416进制和816进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是416进制表示,另外一...
  • 关于内存地址和内存空间的理解。

    千次阅读 2015-02-09 22:08:00
    1.内存地址用416进制和816进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是416进制表示,另外一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 528,490
精华内容 211,396
关键字:

内存地址由多少位