今日临近下班逛CSDN时,看到这篇介绍内存管理的文章,之前一直对段式、页式、逻辑地址、线性地址以及物理地址的概念有些模糊,看了文章中的文字和插图配合的描述,算把这些概念又整理了边,逐渐有些清晰。现摘抄下来以作它日温故时的备份。
前几天,在听一节课时,关于malloc返回的地址是物理地址还是线性地址,跟人进行了激烈的讨论。当时脑子也不知怎么了,硬是觉得返回的是物理地址,还写了一个程序进行验证。
#include
#include
int main()
{
char * p = (char *)malloc(sizeof(char));
printf("address=%x\n",p);
return 0;
}
我的理由是连续运行多次这个程序,每次输出的地址并不相同(我当时认为线性地址的话,每次输出地应该是一样的),然后又怎么怎么着。跟那人进行了激烈的讨论。
另外,我还举了一个访问寄存器或端口的例子,说如果程序中的地址是线性地址,那么这是怎么回事。
最后,时间到了,下课后,我突然反应过来了。操作系统怎么会随便给一个程序返回物理地址呢,那么在操作系统中学的那些分页,分段不是没作用了吗?
总结出现这问题的原因,应该是我以前读书时,将书读死了,没有将学过的东西融会贯通,联系起来。如果我在学习c语言时,就想到操作系统中讲到的内存管理方面的知识,就不会闹笑话了。
最后,从网上搜了相关的内容,放在这里,以便与我一样暂时没开窍的同志们查阅:
一、概念
物理地址(physical address)
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。
虚拟内存(virtual memory)
这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;
之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问题讨论的关键。
有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转
阅读(388) | 评论(0) | 转发(0) |