Linux学习之路一计算机是如何工作的,linux之路


初次接触MOOC课堂,里面有个很牛X的老师教Linux,恰好自己有兴趣学,顾有了此系列学习博文。

第一讲   计算机是如何工作的

学习Linux,涉及到了C语言和汇编以及操作系统的知识,顾第一讲要讲讲汇编的知识,C和操作系统知识自行复习。以下知识都是AT&T汇编的知识,可能与Intel汇编有些不同。

知识一:

    Example instruction        What it does                          

知识二:

有这些知识差不多就能看懂汇编了。现在给一个简单的C程序,main.c,然后让它编译成汇编程序,得到main.s。

实验运行环境:实验楼64位Linux虚拟机

 //main.c
1
int g(int x) 2 { 3 return x + 333; 4 } 5 6 int f(int x) 7 { 8 return g(x); 9 } 10 11 int main(void) 12 { 13 return f(888) + 111; 14 }

编译命令为:gcc –S –o main.s main.c -m32 (其中-m32是将代码编译为32位的意思,因为该命令是在实验楼64位Linux虚拟机环境下使用的,32位Linux环境可能会稍有不同)。

以下是main.s代码,共25行。需要说明的是,编译后会出现很多以“.”开头的语句,这些都是起连接作用的,实际上是不执行的语句,顾可以把它们删除,得到纯净的汇编代码,如下:

接下来就是分析了。

从main函数开始。

18行,将%ebp压栈(其中%esp的值会自动减4,因为pushl操作等价于2行代码,可参考知识二);

19行,将%esp的值给%ebp,形成栈中栈的结构。(其中18,19行代码就是enter操作)

20行,21行,就相当于将888入栈。

22行,调用f()函数,首先将%eip入栈,然后将f()的地址赋值给%eip(说明:%eip所指的值为下一条代码执行的地址,所以将f()函数的地址给%eip,那下一次就会执行f()函数)。

18行--22行中的栈的内容的变化如下图

后续代码的栈变化类似,入栈、出栈、入栈、出栈……在此就不多加累赘了。

总结:

对于计算机是如何工作的,首先是将高级语言转换成汇编语言,接着将汇编语言理解成入栈、出栈操作。整个计算机的工作就是由不断的入栈,不断的出栈,外加一些简单的加减等操作所构成的。

注明:

博客署名:郑俊

原创作品转载请注明出处

参考资料:

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

 

相关内容