zoukankan      html  css  js  c++  java
  • 计算机是如何工作的---linux内核学习笔记(一)

    内容一:实验报告相关说明。

    所学课程:《Linux内核分析》MOOC课程  

    链接:http://mooc.study.163.com/course/USTC-1000029000

    虚拟实验室实验截图

     

    内容二:汇编代码的工作过程中堆栈的变化分析

    分析分两部分:(堆栈地址的标号没有对齐,请谅解)

    第一部分是堆栈变换图。

    第二部分是变换图的说明。

     

    第一部分 图解

     

    第二部分 说明

    一:

    程序从main函数开始执行,此时假设ESP,EBP两个指针均指向位置0 ,表示堆栈为空。如图(1)

     二:

    执行语句 18,19

    pushl         %ebp

    movl          %esp,%ebp

    EBP,ESP的变化如图(2)所示,均指向位置1。位置0到位置1有4个字节大小的空间,用来存储 EBP寄存器内之前的内容。

    三:

    执行语句 20,21

    subl    $4, %esp          //esp的值减4相当于esp指向位置2

    movl   $90, (%esp)

    如图(3)所示,EBP,ESP分别指向位置1和位置2。寄存器EAX的值为90 。

    四:

    执行语句 22 ,call f 语句等价于

    pushl  %eip        // 此时eip的为下一条指令(第23条指令)用 eip(23)表示

    movl   函数f的地址 ,  %eip

    如图(4)所示,EBP,ESP分别指向位置1和位置3。 eip指向第9行的指令

    五:

    执行语句 9,10 ,11,12,13

           pushl         %ebp

           movl          %esp, %ebp

           subl           $4,%esp

           movl          8(%ebp), %eax

           movl          %eax, (%esp)

    如图(5)所示,EBP,ESP分别指向位置4和位置5。%eax的值为 *(8+ ebp),等于90 。红色方框所示。

    五:

    执行语句 14,2,3,4,5

           call   g

           pushl         %ebp

           movl          %esp, %ebp

           movl          8(%ebp), %eax

    如图(6)所示,EBP,ESP均指向位置7。

    %eax的值为 1014+90 = 1104 这个值可以保存下来。

    六:

    执行语句6  popl          %ebp,如图(7)所示,分别指向位置4和位置6

    七:

    执行语句7  ret  等价于popl %eip ,程序下一条执行的指令为语句15. 如图(8)所示,分别指向位置4和位置5 。

          

    八:

    执行语句15 ,leave 语句等价于

                      movl          %ebp,%esp

                       popl          %ebp

             相当于撤销函数f所使用的堆栈

    如图(9)所示,

    执行movl      %ebp, %esp  EBP,ESP均指向位置4。

    执行popl                %ebp EBP,ESP分别指向位置1和位置3。

    九:

    执行语句16  ret

    如图(10)所示,EBP,ESP分别指向位置1和位置2。程序下一条执行的指令为语句23。

    十:

    执行语句23,24

           addl $90, %eax

           leave

    如图(11)所示,EBP,ESP均执行0。此时堆栈为空。程序运行结果保存在EAX寄存器中。其值为eax+90 = 1104 + 90=1194 

    内容三:小结

    1:计算机读取的下一条指令总是存储在EIP中。

    2:程序是从main函数开始执行。

    3:当程序调用一个新的函数时,是通过CALL指令来实现的。CALL指令做了两件事,第一件事是将程序要执行的下一条指令(即EIP的值)存入堆栈中。第二件事是将EIP的值修改为该函数的地址。从而开始执行被调用的函数。

    4:调用被调函数时,总会想在堆栈区创立一个新的堆栈供函数使用。函数执行完毕后,会将其销毁。所以函数中的临时变量不起作用了。

  • 相关阅读:
    React——from
    React——条件渲染
    React——event
    React——组件
    React——JSX
    flask_mail使用
    flask开发restful api
    mysql limit和offset用法
    flask打包安装文件
    flask-sqlalchemy使用及数据迁移
  • 原文地址:https://www.cnblogs.com/esxingzhe/p/4322197.html
Copyright © 2011-2022 走看看