Linux内核分析第一周——计算机是如何工作的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核分析第一周——计算机是如何工作的相关的知识,希望对你有一定的参考价值。

冯诺依曼体系结构

核心思想

1.冯诺依曼是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。

2.采用二进制作为计算机数值计算的基础,以0、1代表数值。不采用人类常用的十进制计数方法,二进制使得计算机容易实现数值的计算。

3.程序或指令的顺序执行,即预先编好程序,然后交给计算机按照程序中预先定义好的顺序进行数值计算。

汇编语言的五种寻址模式

·        寄存器寻址 registermode: %寄存器  例如:%edx 访问寄存器edx

·        立即寻址 immediate: $数字   例如:$0x123 数值0x123

·        直接寻址 direct:数字   例如:0x123访问地址0x123指向的内存

·        间接寻址 indirect: (%寄存器) (%ebx) 例如:访问寄存器ebx中的地址指向的内存

·        变址寻址 displaced:偏移量(%寄存器) 4(%ebx):访问寄存器ebx中的地址再加4指向的内存;

几个重要的汇编指令

Example instruction

What it does

Pushl %eax

Subl $4, %esp   //栈顶指针减4,栈在向下生长一个位置

Movl %eax, (%esp) //将eax中的值放入栈顶指针指向的内存位置

Popl %eax

Movl (%esp), %eax //从栈顶指针指向的内存中的值放入eax中

Addl $4, %esp //栈顶指针加4,栈在向上收缩

Call 0x12345

Pushl %eip //ip压栈

Movl $0x12345, %eip //将0x12345放入eip中

Ret

Popl %eip //ip出栈

 

使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码。

源代码如下:

int g(int x)
{ 
 return x + 9;
}
int f(int x)
{ 
 return g(x);
}
int main(void)
{
  return f(18) + 11;
}

编译后的代码如下:

g:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $9, %eax
    popl    %ebp
    ret

f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    g
    leave
    ret
    
main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    $18, (%esp)
    call    f
    addl    $11, %eax
    leave
    ret

堆栈变化过程

1.main函数--pushl %ebp + movl %esp,%ebp
技术分享
2.main函数--subl $4,%esp + movl $18,(%esp)
技术分享
3.main函数--call f
技术分享
4.f函数--pushl %ebp + movl %esp,%ebp
技术分享
5.f函数--subl $4,%esp + movl 8(%ebp),%eax + movl %eax, (%esp)
技术分享
6.f函数--call g
技术分享
7.g函数--pushl %ebp + movl %esp, %ebp + movl 8(%ebp), %eax
技术分享
8.g函数--addl $9,%eax + popl %ebp
技术分享
9.g函数--ret 下一步将运行第15行的指令也就是f函数的leave指令
技术分享
10.f函数--leave
技术分享
11.f函数--ret 下一步将运行第23行的指令也就是main函数的addl指令
技术分享

实验截图

技术分享

技术分享

 

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

以上是关于Linux内核分析第一周——计算机是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

《Linux内核分析》第一周学习小结 计算机是如何工作的?

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

Linux内核分析第一周——计算机是如何工作的

20135201李辰希《Linux内核分析》第一周 计算机是如何工作的?

Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的

《linux内核分析》 第一周