网站大量收购独家精品文档,联系QQ:2885784924

第一篇 章、绪论 Linux内核分析PPT.ppt

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一篇 章、绪论 Linux内核分析PPT.ppt

xlanchen:Linux OS Analysis C语言中还使用堆栈进行 参数的传递 局部变量的使用 一段小程序 源文件:test.c 这是一个很简单的C程序 main函数中调用了函数p1和p2 首先使用gcc –g 生成test.c的可执行文件test 然后使用objdump –S获得test的反汇编文件 观察p2的堆栈框架 从test的反汇编文件中找到p2的反汇编代码 int p2(int x,int y) { push %ebp mov %esp,%ebp return x+y; mov 0xc(%ebp),%eax add 0x8(%ebp),%eax } pop %ebp ret 建立框架 拆除框架 ebp esp ebp 调用者 堆栈 框架 esp ebp y x 高地址 低地址 观察main函数是如何传递参数给p2的 … z=p2(x,y); pushl 0xfffffff8(%ebp) pushl 0xfffffff4(%ebp) call 804839b p2 add $0x8,%esp mov %eax,0xfffffffc(%ebp) printf(%d=%d+%d\n,z,x,y); pushl 0xfffffff8(%ebp) pushl 0xfffffff4(%ebp) pushl 0xfffffffc(%ebp) push $0x8048510 call 80482b0 printf@plt … p2的返回值是如何返回给main的? 调用者 堆栈 框架 esp ebp y的值 x的值 高地址 低地址 被调用者 堆栈 框架 ebp cs:eip esp ebp esp esp ebp 观察main中的局部变量 int main(void) { push %ebp mov %esp,%ebp sub $0x18,%esp … char c=a; movb $0x61,0xfffffff3(%ebp) int x,y,z; x=1; movl $0x1,0xfffffff4(%ebp) y=2; movl $0x2,0xfffffff8(%ebp) … 调用者 ebp esp ebp esp esp c=‘a’ x=1 y=2 高地址 低地址 eip eip eip eip 观察程序运行时堆栈的变化 main … p1(c) … p2(x,y) … p1 p2 main p2 p1 程序的代码段 堆栈 eip esp main堆栈 c eip eip eip p1的堆栈 esp eip eip eip x,y eip p2堆栈 eip 另一段小程序 和前一段小程序稍有不同 在这个小程序中,main函数中调用了函数p2,而在p2的执行过程中又调用了函数p1 观察程序运行时堆栈的变化 eip eip eip eip main … p2(x,y) … p1 p2 … p1(c) … main p2 p1 程序的代码段 堆栈 eip esp main堆栈 esp eip eip x,y eip p2堆栈 eip eip eip eip c eip p1堆栈 esp 观察堆栈在内核中的使用 在内核代码中经常有这样的函数,它的参数是struct pt_regs *regs 可以往回一层层的寻找这个参数是怎么传递过来的,最后我们可以发现最源头的函数使用了这样的参数struct pt_regs regs 比如void do_IRQ(struct pt_regs regs) 如果再进一步寻找是谁调用了这个do_IRQ,我们会发现只是一条简单的汇编语句 call do_IRQ 为什么要有pt_regs结构 用户态 vs 内核态 寄存器上下文 从用户态切换到内核态时 必须保存用户态的寄存器上下文 要保存哪些? 保存在哪里? 中断/int指令会在堆栈上保存一些寄存器的值 如:用户态栈顶地址、当时的状态字、当时的cs:eip的值 pt_regs结构 SAVE_ALL和RESTORE_ALL do_IRQ的调用方式 仔细阅读一下与之相连的汇编码 pushl $n-256 SAVE_ALL call do_IRQ jmp ret_from_intr do_IRQ的函数定义方式 regparm(x) x!=0:告诉gcc不通过堆栈而通过寄存器传。 x是参数个数,寄存器依此使用EAX,EDX,ECX… 而asmlinkage则使得编译器不通过寄存器(x=0)而 使用堆栈传递参数 因此,do_IRQ

文档评论(0)

youngyu0329 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档