Memory Organization <OW Text== code fext address Data = static variables data Heap = dynamic data heap Stack =="scratch paper - SP Dynamic local variables Parameters to functions 个 stack Return address < high address 21 復里大软件学院 LiST
21 LiJT Memory Organization • Text == code • Data == static variables • Heap == dynamic data • Stack == “scratch paper ” – Dynamic local variables – Parameters to functions – Return address stack heap ↓ ↑ data text ← high address ← low address ← SP
程序在内存中的映射(lnux) Oxbfffffff 高地址端 栈底 栈 数组字符串等 ESP→ 栈顶 动态分配内存 堆 未初始化静态 变量 bss段 存放静态数据 data段 低地址端 text段 存放程序代码 08000和只读数据 復里大软件学院 LiT
22 LiJT 程序在内存中的映射(linux ) 存放程序代码 和只读数据 存放静态数据 栈 数组字符串等 .text 段 0xbfffffff 0x80000000 .data 段 .bss 段 堆 • 栈底 • 栈顶 高地址端 低地址端 ESP 动态分配内存 未初始化静态 变量
程序在内存中的映射wn32) 高地址端 FFFFFH Code segment 存放程序代码 00401000 动态分配内存 Heap segment 00371010 栈底 简单变量数组等 Stack segment 0012FEE0 esp 栈顶 低地址端 00000H 復里大软件学院 LiT
23 LiJT 程序在内存中的映射(Win32) 简单变量数组等 0012FEE0 Stack segment FFFFFH 00000H Heap segment • 栈底 • 栈顶 高地址端 低地址端 esp Code segment 存放程序代码 00401000 动态分配内存 00371010
函数调用过程示例 3 int func (int a, int b)t int retval = a +b: 5 printf( "b: 0x%08x\n",&b) 6 printf("a: 0x%08x\n",&a 7 printf(" ret addr here: 0x%08x\n",&a-1) Stack frame 8 printf(" stored ebp here: 0x%08x\n",a 2) 9 printf(" ret Val: 0x%08x\n\n",&retVal) 10 return retval 11} main ebp 12 int main(int argc, char* argv[]) esp 13{ 14 int result func(1, 2) esp 2 15 return 0 16} esp esp Ret-add func ebp esp ebp esp retval 24 復里大软件学院 LiT
24 LiJT 函数调用过程示例 2 1 Ret-add ebp retVal … Stack frame esp esp esp esp main ebp func ebp esp esp esp esp esp
Coto Simplified Stack Example loW→ void fnc ( int a, int char buffer[10] void main(t A SP buffer func( 1, 2) ret ←6urn address a SP high→ b - SP 25 復里大软件学院 LiT
25 LiJT Simplified Stack Example high → voi d fun c(int a,int b){ ch ar b uffer[1 0]; } voi d m a in() { func(1, 2) ; } : : buffer ret a b ← return address low → ← SP ← SP ← SP ← SP