Linux内核分析(一)

来源:互联网 发布:oppo软件下载 编辑:程序博客网 时间:2024/06/04 18:48

在CPU中有个IP(instruction pointer)指令指针寄存器,它通过总线从内存中的CS( code segment)代码段寄存器中获取指令。


1.首先打开编译器把函数输入进去


2.保存后查看该main.c的文件是否存在


3.将main.c文件进行编译,会多出一个编译文件


4.并执行该编译文件,没有输出


5.反编译成32位的汇编程序


6.打开main.s文件,得出对应的汇编代码


分析:

eip指令寄存器指向main函数,一开始esp跟ebp指向0

1.pushl %ebp:ebp寄存器压栈,ebp栈底指针始终指向栈底,esp栈顶指针始终指向栈顶

2.movl %esp,%ebp:栈底指针ebp指向栈顶,两个指向相同的地址,也就是指向1

3.subl $4,%esp;esp向下移动4个字节也就是指向2

4.movl $8,(%esp):将立即数8放到esp指向的位置 

5.call f:实际上call f是执行了push eip和movl f eip,eip指令寄存器压栈,指向f函数,esp指向了3,ebp还是指向1

6.pushl %ebp:将ebp1压栈,esp指向了4 ebp还是指向了1

7.movl %esp %ebp:ebp和esp指向了同一个位置也就是4

8.subl %4,%esp:esp向下移动四个字节,esp指向5 ebp指向4

9.movl 8(%ebp),%eax:ebp变址寻址向上移动八个字节也就是指向2的位置,eax=8

10.movl %eax ,(%esp):将eax放到esp指向的位置也是esp指向5的位置存放eax=8

11.call g:eip2指令寄存器压栈,esp指向6,eip指向了g函数,ebp还是指向了4

12.push %ebp:将ebp2压栈,esp指向了7,ebp还是指向了4

13.movl %esp %ebp:esp跟ebp指向了同一个位置也就是7,

14.movl 8(%ebp) ,%eax:ebp向上移动8个字节也就是指向了5,eax=8存在5这个位置

15.addl $3,%eax eax=8+3=11

16.popl %ebp:ebp2弹出栈,ebp指向ebp1也就是4这个位置,esp指向6这个位置

17.ret:也就是pop eip这个命令esp指向了5这个位置

18.leave:其实也就是执行了movl %ebp %esp pop %ebp这个指令,esp指向ebp的位置也就是4,弹出ebp1,epb指向1的位置esp指向3

19.ret:eip1弹出esp指向了2

20:addl $1 %eax eax=11+1=12

21:leave,esp跟ebp同时指向了1,pop ebp,两个同时指向了0


其实我个人对movl 8(%ebp),%eax理解不是很清楚,8究竟是怎么赋值上去,8不是变址寻址么,eax是指向变址寻址后的位置我知道,就是不明白怎么8突然就赋值上去了


计算机在运行时,先从内存中取出第一条指令,通过控制器的编码,按指令的要求从指令寄存器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令

杨俊   原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


0 0
原创粉丝点击