内存使用
内存使用:将程序放在内存中,PC指向内存地址
首先,我们需要让程序进入内存
举个例子
int main(int argc, char *argv[])
{
...
}
.text
_entry: //入口地址
call _main
call _exit
_main:
...
ret
_entry: //入口地址
call 40
call xx
_main: //偏移是40
...
我们需要把上面这段程序放入内存中,因为里边有条指令call 40
,这意味着在物理内存中,main函数就必须放在内存地址为40的地方,这样程序才能执行
//物理内存中
40: _main: mov[300], 0
...
call x
call 40
上面的方法理论上是可行的,代码确实能够在内存中运行,但是程序必须放在0地址处,main函数必须放在40处,如果有多个程序同时需要用到40处的内存,那么就会发生冲突,因此,我们需要修改程序中的地址,也就是将程序中的地址加上偏移,比如说把程序开始地址放在1000处
1040: _main: mov[300], 0
...
call x
call 40 --> ip=1000
重定位:修改程序中的地址(是相对地址)
找一段空闲的内存,将程序放入内存中,重定位程序中的逻辑地址
什么时候完成重定位?编译时,