Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen ustc. edu.cn pring 2009 S 嵌入式系统实验室 EMBEDDED SYSTEM LAE口RAT口RY SUZHOU INSTITUTE FOR ADVANCED STUDY OF USTC
Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen@ustc.edu.cn Spring 2009
序 令一些基本概念 操作系统的基本概念 >I386系统的基本概念 Linux简介 ☆源码阅读和 project环境 ◆ Linux2.6.26源码简介 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
序 ❖一些基本概念 ➢操作系统的基本概念 ➢I386系统的基本概念 ❖Linux简介 ❖源码阅读和project环境 ❖Linux 2.6.26 源码简介
操作系统的基本概念 令任何计算机系统都包含一个基本的程序集合,称 为操作系统。 内核(进程管理,进程调度,进程间通讯机制,内存 管理,中断异常处理,文件系统,IO系统,网络部 分) 其他程序(例如函数库,shel序等等) 令操作系统的目的 与硬件交互,管理所有的硬件资源 ≯为用户程序(应用程序)提供一个良好的执行环境 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
操作系统的基本概念 ❖任何计算机系统都包含一个基本的程序集合,称 为操作系统。 ➢内核(进程管理,进程调度,进程间通讯机制,内存 管理,中断异常处理,文件系统,I/O系统,网络部 分) ➢其他程序(例如函数库,shell程序等等) ❖操作系统的目的 ➢与硬件交互,管理所有的硬件资源 ➢为用户程序(应用程序)提供一个良好的执行环境
I386系统的基本概念 令代码的运行 令堆栈的概念 令内核态与用户态 令中断异常系统调用 ◆虚拟内存 1958 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
I386系统的基本概念 ❖代码的运行 ❖堆栈的概念 ❖内核态与用户态 ❖中断/异常/系统调用 ❖虚拟内存
代码的运行 ◆关键寄存器 cs:eip:总是指向下一条的指令地址 顺序执行:总是指向地址连续的下一条指令 ●跳转分支∶执行这样的指令的时候,cs:eip的值会根据程序 需要被修改 cal:将当前cs:eip的值压入栈顶,cs:eip指向被调用函数的 入口地址 ret:从栈顶弹出原来保存在这里的cs:eip的值,放入cs:eip 中 ●发生中断时??? ?? 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
代码的运行 ❖关键寄存器 ➢cs : eip:总是指向下一条的指令地址 ⚫顺序执行:总是指向地址连续的下一条指令 ⚫跳转/分支:执行这样的指令的时候,cs : eip的值会根据程序 需要被修改 ⚫call:将当前cs : eip的值压入栈顶,cs : eip指向被调用函数的 入口地址 ⚫ret:从栈顶弹出原来保存在这里的cs : eip的值,放入cs : eip 中 ⚫发生中断时??? ⚫????
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