I386系统的基本概念 令代码的运行 令堆栈的概念 令内核态与用户态 令中断异常/系统调用 ◆虚拟内存 1958 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
I386系统的基本概念 ❖代码的运行 ❖堆栈的概念 ❖内核态与用户态 ❖中断/异常/系统调用 ❖虚拟内存
堆栈的概念 令堆栈是C语言程序运行时必须的一个记录调用路径和参 数的空间 >函数调用框架 传递参数 >保存返回地址 提供局部变量空间 1958 等等 令C语言编译器对堆栈的使用有一套的规则 令了解堆栈存在的目的和编译器对堆栈使用的规则是理解 操作系统一些关键性代码的基础 令以X86体系结构为例nd 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
堆栈的概念 ❖ 堆栈是C语言程序运行时必须的一个记录调用路径和参 数的空间 ➢ 函数调用框架 ➢ 传递参数 ➢ 保存返回地址 ➢ 提供局部变量空间 ➢ 等等 ❖ C语言编译器对堆栈的使用有一套的规则 ❖ 了解堆栈存在的目的和编译器对堆栈使用的规则是理解 操作系统一些关键性代码的基础 ❖ 以x86体系结构为例
堆栈寄存器和堆栈操作 ◇堆栈相关的寄存器 低地址 >esp,堆栈指针( stack pointer)esp p,基址指针( base pointer) 令堆栈操作 push 栈顶地址减少4个字节(32位) pop ebp 栈顶地址增加4个字节 高地址 ☆ebp在C语言中用作记录当前函数调用基址 嵌入式系统实验室 EM日 EDDED SYSTEM LA日口 RATORY
堆栈寄存器和堆栈操作 ❖堆栈相关的寄存器 ➢esp,堆栈指针(stack pointer) ➢ebp,基址指针(base pointer) ❖堆栈操作 ➢push 栈顶地址减少4个字节(32位) ➢pop 栈顶地址增加4个字节 ❖ebp在C语言中用作记录当前函数调用基址 esp ebp 高地址 低地址 esp
利用堆栈实现函数调用和返回 建立被调用者函数的堆栈框架 pushl %oebp movl %oesp, %oebp ∥调用者 ∥被调用者函数体 /do sth call target 拆除被调用者函数的堆栈框架 movl %oebp, %esp ca指令: popl %ebp 1)将下一条指令的地址A保 ret- 存在栈顶 2)设置ejp指向被调用程序 将地址A恢复到eip中 嵌人式系狁头验室 代码开始处 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
// 调用者 … call target … 利用堆栈实现函数调用和返回 //建立被调用者函数的堆栈框架 pushl %ebp movl %esp, %ebp //拆除被调用者函数的堆栈框架 movl %ebp,%esp popl %ebp ret //被调用者函数体 //do sth. … call指令: 1)将下一条指令的地址A保 存在栈顶 2)设置eip指向被调用程序 代码开始处 将地址A恢复到eip中
函数堆栈框架的形成 ° call XXX 执行cl前 esp >执行cal时,cs:eip原来的值 ebp 指向cl下一条指令,该值被 esp 保存到栈顶,然后cs:eip的值 esp ebp低地址 elp 指向xx的入口地址 esp 令进入 XXX 58 >第一条指令: pushl%ebp >第二条指令:mow%esp,%ebp 函数体中的常规操作,可能会压栈、出栈 ◆退出xXx eop movl %ebp, %esp 高地址 popl %ebp ret 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
函数堆栈框架的形成 ❖ call xxx ➢ 执行call之前 ➢ 执行call时,cs : eip原来的值 指向call下一条指令,该值被 保存到栈顶,然后cs : eip的值 指向xxx的入口地址 ❖ 进入xxx ➢ 第一条指令: pushl %ebp ➢ 第二条指令: movl %esp, %ebp ➢ 函数体中的常规操作,可能会压栈、出栈 ❖ 退出xxx ➢ movl %ebp,%esp ➢ popl %ebp ➢ ret esp ebp 高地址 低地址 cs : eip esp ebp esp ebp esp