日期:2014-05-16  浏览次数:20926 次

C++ 内存管理, 链接脚本, 链接and加载
刚刚开始学习内存管理的小鸟一枚,请过来人指教。下面是我的理解,不当之处还请指正

使用C++写的每一个程序,在编译连接后,将它加载到内存执行,在这一流程上内存的命名及变化。

在程序没有加载到内存时候,我们根本不知道这个程序要使用内存的那一片地址,
这决定于操作系统加载程序的时候已经运行了多少个程序,以及操作系统本身。

首先从编译说起,
编译时候,要将代码符号便以为汇编代码,这就会有寻址,
这个时候的寻址空间是整个内存空间,(如果是32为地址空间,寻址大小为4G)。我理解为这是逻辑地址,
或是相对地址。

再说链接,在地址层面上来说,就是将地址空间统一起来,
在一个地址空间内将所有目标文件的数据和命令进行编址。
这时候的可执行文件内寻址大小依然是整个内存空间大小。

再说加载,
操作系统将可执行文件加载到内存,可能将某一片地址分配给这个进程使用。
具体这一片地址是多大,我还不知道怎么设置,在哪里设置,该如何设置
所以在可执行文件的地址最终会被OS映射到具体的物理地址的。
也就是在可执行文件中访问的a-b的地址,最终会被OS映射到真实物理地址C-D上。
但是他们的大小是一样的。
在可执行文件中地址的划分是在链接脚本中控制的。
可以规定代码段大小,位置,数据段大小位置等。

------------------------------------------------
            以上是本人理解的,
            接下来看看如何在程序中使用自己的内存管理模块。
------------------------------------------------

比如说我的某一块板子的内存有2G,
我只有一个服务程序要在这个板子上跑,使用linux系统。
那么我可以在链接脚本中规定SECTION的信息。
在链接脚本中规定堆地址从0x19000000-0x49000000
那么在代码中可以直接使用自己的内存管理模块对0x19000000-
0x49000000这一块内存进行操作。
比如重写new opearator,
申请内存时候,就从这一地址空间中申请,当然OS会将这一地址空间映射到真是物理地址。

不知道自己这样理解是不是正确,错误之处还请指正。

Thanks and Regards。




------解决方案--------------------
信息量好大呀,从编译--操作系统  可以写好几本书。
<<程序员的自我修养-连接 装载与库>>
<<深入理解Linux内核>>
------解决方案--------------------
来学习了