《Linux内核分析》第一周 理解计算机是如何工作的

来源:互联网 发布:用一套好还是用淘宝好 编辑:程序博客网 时间:2024/04/29 06:45

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

计算机是通过CPU一条一条地读取内存的指令并且执行来完成工作的。通过汇编代码,我们深入分析这个过程。

在此之前,补充几个我一下子没有反应过来的名词:
1. 寄存器是CPU的一部分(而不属于内存),用于存储运算过程中需要用到或者产生的数据。
2. 指令是类似这样的语句: movl %eax %edx。

常见寄存器有:
1. %eax 返回值默认寄存器
2. %ebp 栈底寄存器
3. %esp 栈顶寄存器
4. %eip 指向下一条指令的寄存器。也就是所谓的ip

常见的指令有:
1. movl (类似赋值)
2. push (入栈)
3. pop (出栈)
4. call (函数调用)
5. ret (return 返回)
6. add (加)
7. sub (减)

具体来看
movl

push

enter

mov指令当中的%eax表示寄存器,$0x123表示立即数, 0x123表示这被解释为内存地址。带括号的(%ebx)表示这个寄存器的值被解释成内存地址。

push 是将%esp向下增长一位(4 bytes),然后把%eax的值赋值给%esp所指向的内存空间。
pop 先是把%esp空间的值赋值给%eax,然后将%esp向上缩减一位。
call 先保存%eip到当前栈顶的下一位(函数返回后需要找到原%eip,以便继续执行下边的语句),然后对%eip赋值。那么下一句被执行的语句就是新%eip所指向的语句。
ret 把栈顶(%esp)保存的内容(就是函数执行前的%eip)赋值给%eip,然后回退一位。

enter
leave 将栈顶退回到函数执行前的栈顶,再将ebp回退到函数执行前的栈底。(恢复性工作)


下面分析一个具体的程序:
基于实验楼提供的实验环境 https://www.shiyanlou.com/courses/running/555

main.c

通过反汇编得到main.s(经过删减)

gcc -S -o main.s main.c

main.s

分析过程如下:

。。。 改天补充 。。。

0 0
原创粉丝点击