当前位置: 技术问答>linux和unix
问个问题:名空间、地址空间不在存储器上,那么是在哪里呢?
来源: 互联网 发布时间:2016-04-15
本文导语: 刚才看书看到: 地址空间:一个用高级语言编制的源程序,我们说它存在于由程序员建立的符号名字空间(简称名空间)内。源程序经编译后得到的目标程序,则存在于它所限定的地址范围内,我们称这个地址范...
刚才看书看到:
地址空间:一个用高级语言编制的源程序,我们说它存在于由程序员建立的符号名字空间(简称名空间)内。源程序经编译后得到的目标程序,则存在于它所限定的地址范围内,我们称这个地址范围为地址空间。一个编译好的程序存在于它自己的地址空间中,当它要在计算机上运行时,才把它装入存储空间。
我想知道:根据上面这段话可以看出,地址空间是不在存储空间中的,名空间肯定也不在;那么它们是在什么地方呢?
谢谢!!
地址空间:一个用高级语言编制的源程序,我们说它存在于由程序员建立的符号名字空间(简称名空间)内。源程序经编译后得到的目标程序,则存在于它所限定的地址范围内,我们称这个地址范围为地址空间。一个编译好的程序存在于它自己的地址空间中,当它要在计算机上运行时,才把它装入存储空间。
我想知道:根据上面这段话可以看出,地址空间是不在存储空间中的,名空间肯定也不在;那么它们是在什么地方呢?
谢谢!!
|
空间,是一个抽象的概念
比如我们说,值空间,一个变量可能取的所有值,组成了一个值空间
所以,一个程序员使用的符号,即形成了一个符号空间
一个程序员所写的程序,只采用这个符号空间中的符号,就可以理解为是建立在这个符号空间上的
你要问:这个空间在哪里呢? 本人觉得,这个空间就在程序员写的程序中,我们可以通过程序,反过来构造出这个空间,不妨使用名称A来表示这个空间
引申一步来讲,所有的程序员,采用高级语言写的程序,综合起来,可以形成一个复杂的符号空间,不妨使用名称B来表示这个空间,那么A就是B的一个子集,对吧
更引申一步来讲,所有可能的符号,综合起来,形成一个很泛意义上的符号空间,不妨使用名称C来表示,那么B又可以看成是C的一个子集
编译链接之后,目标代码或者可执行文件中,使用地址来标识各个函数或者各个变量,等等
所有用到的地址,就形成了这个程序的地址空间D,
这个地址空间也是抽象的
符号空间A与这个地址空间D之间存在一定的映射关系,比如某个符号对应地址空间中的某个地址,之类的
装载之后,在物理内存中,将会使用物理地址来访问指令、数据等等
所有用到的物理地址,就形成了这个程序相关的存储空间E,显然这个存储空间,是整个计算机存储空间F的一个子集
地址空间D与存储空间E之间存在一定的映射关系
以上仅仅是个人感觉
比如我们说,值空间,一个变量可能取的所有值,组成了一个值空间
所以,一个程序员使用的符号,即形成了一个符号空间
一个程序员所写的程序,只采用这个符号空间中的符号,就可以理解为是建立在这个符号空间上的
你要问:这个空间在哪里呢? 本人觉得,这个空间就在程序员写的程序中,我们可以通过程序,反过来构造出这个空间,不妨使用名称A来表示这个空间
引申一步来讲,所有的程序员,采用高级语言写的程序,综合起来,可以形成一个复杂的符号空间,不妨使用名称B来表示这个空间,那么A就是B的一个子集,对吧
更引申一步来讲,所有可能的符号,综合起来,形成一个很泛意义上的符号空间,不妨使用名称C来表示,那么B又可以看成是C的一个子集
编译链接之后,目标代码或者可执行文件中,使用地址来标识各个函数或者各个变量,等等
所有用到的地址,就形成了这个程序的地址空间D,
这个地址空间也是抽象的
符号空间A与这个地址空间D之间存在一定的映射关系,比如某个符号对应地址空间中的某个地址,之类的
装载之后,在物理内存中,将会使用物理地址来访问指令、数据等等
所有用到的物理地址,就形成了这个程序相关的存储空间E,显然这个存储空间,是整个计算机存储空间F的一个子集
地址空间D与存储空间E之间存在一定的映射关系
以上仅仅是个人感觉
|
可行程序或者目标码执行之前是在你所说的外存上的,比如硬盘等。当执行的时侯,通过一种加载方式,将其加载到内存中,如果不好理解,你可以简单地理解为内存中的目标代码就是磁盘上的目标代码的一份拷贝!将其加载到内存是为了执行,因为cpu不能寻址到外存上的目标代码! 大概意思就是这样,里面还有很多细节。