2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

1.基础学习内容

1.1 冯诺依曼体系结构

计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。
1800789-20190922145406774-1185242228.png
1.1.1 冯诺依曼计算机特点
(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中。
(2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
(3)指令由操作码和地址组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
(4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。
(5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
(6)数据以二进制表示。

1.2 汇编中的寄存器-以32bit系统为例

1.2.1 寄存器分类

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI)
2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP)
1个标志寄存器(EFlags)

1.2.2 通用及指令指针寄存器的详细介绍
1800789-20190922145447126-1161516225.png

CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。如下图。
1800789-20190922145504013-2027045209.png

1.3 计算机执行指令过程

根据PC(程序计数器,32位系统中为eip)取指令-->指令译码-->取操作数-->指令执行-->回写结果-->修改PC的值-->继续执行下一条指令。如图。
1800789-20190922145521723-1811956988.png

1.4 寻址方式
  • 立即寻址方式(immediate addressing)
    操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。
  • 寄存器寻址
    1800789-20190922145534532-1976699066.png

  • 立即数寻址
    1800789-20190922145545377-1132304969.png

  • 直接寻址
    1800789-20190922145553741-178056800.png

  • 间接寻址
    1800789-20190922145600022-1830569425.png

  • 变址寻址
    1800789-20190922145616367-1909767632.png

2.汇编语言学习

2.1汇编语言基本概念
  • 汇编指令:机器码的助记符,有对应的机器码
  • 伪指令: 没有对应的机器码,由编译器执行,计算机并不执行
  • 其他符号: 如: +、-、*、/ 等,由编译器识别,没有对应的机器码
  • 汇编语言的特点:
    ① 所占空间、执行速度与机器语言相仿
    ② 直接、简捷,能充分控制计算机的硬件功能

    2.2堆栈

    2.2.1堆栈的基本概念
    堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。如图。
    1800789-20190922145651594-1083322788.png

2.2.2堆栈向上增长和向下增长
假设堆栈大小为256,一般而言32位系统中堆栈方向是向下增长的。

  • 向下增长,就是从高地址向低地址增长。栈顶即为&Taskstk[255]。
  • 向上增长,就是从低地址向高地址增长。栈顶即为&Taskstk[0]。
    1800789-20190922145643578-1763112010.png

2.2.3堆栈中的基本操作及其对应的汇编语言

  • 进栈指令 PUSH
    1800789-20190922145706018-18887863.png

  • 出栈指令 POP
    1800789-20190922145713508-1745295560.png

  • 调用进程 CALL
    1800789-20190922145720382-1748405279.png

  • 返回进程 RET
    1800789-20190922145728599-271610871.png

  • 清除进程 LEAVE
    1800789-20190922145740486-547037268.png

2.3挑战问题

在实验楼环境下采用vim编辑器,编写一段简单c程序,并探究c语言在汇编语言下的转换格式和内容。 将c语言文件转化为32的汇编语言,代码中函数调用内核的情况,堆栈中的变化。

2.3.1 步骤
编写的C语言程序
1800789-20190922145754346-1958443647.png

  • gcc编译代码
    1800789-20190922145809933-1400624938.png

  • 转换为汇编语言
    1800789-20190922145903582-2002268060.png

  • 去掉辅助信息
    1800789-20190922145912602-2095853974.png

2.3.2 代码分析
调用流程 main函数
1800789-20190922145924172-486886212.png

汇编语言调用堆栈变化过程

  • 初始阶段,esp、ebp指针都是指向1000这个位置(假设堆栈大小为1000)
    1800789-20190922145937654-1633186843.png

  • 执行main函数1800789-20190922150124580-1655005583.png

1800789-20190922150134488-813232911.png

  • 执行1800789-20190922150150083-1301225634.png
    1800789-20190922150158996-359368690.png

  • 执行跳转到f函数执行1800789-20190922150240280-178735223.png
    1800789-20190922150253217-784718399.png

1800789-20190922150306857-563777001.png

  • 执行1800789-20190922150327778-1052958676.png

1800789-20190922150338077-1515136566.png

-执行跳转到g函数1800789-20190922150349014-69608725.png

1800789-20190922150359643-1248799209.png

  • 执行1800789-20190922150415907-690055261.png

1800789-20190922150425127-793190694.png

  • 执行1800789-20190922151248403-794761139.png

1800789-20190922150451759-1543930891.png

  • 执行1800789-20190922150501902-684416403.png

1800789-20190922150617590-651499647.png

  • 执行1800789-20190922150749995-425359455.png
    1800789-20190922150802424-1158631077.png
    1800789-20190922150829678-1437148785.png
    1800789-20190922150838078-1230133669.png

  • 执行1800789-20190922150850128-832107978.png
    1800789-20190922150902215-740580783.png

  • 执行1800789-20190922151115524-757174363.png
    1800789-20190922150934350-1651423432.png

  • 执行1800789-20190922150943614-373334349.png
    1800789-20190922150954833-156327955.png

以上展示了一段简单代码调用函数的过程.
展示了整个堆栈从占用->释放的过程.

总结

本周的的学习相对于上周的Linux基础是一个进阶,开始了解Linux的内核,学习了32位和16位,64位系统的区别,了解到寄存器的分类,以及寄存器的用处.学习了一些底层的调用,任何c语言在底层中都会转化为汇编语言,之前学习的简单加法程序就是由高级语言编写,并解释成汇编语言再对底层进行调用,由此可以发现高级语言虽然语法简单\可视性强,但是硬件无法直接识别,故其运行速度\可靠性并不如汇编语言.但是未来的趋势就是越来越封装的语言,未来知识越来越多\学习的时间越来越少\利用前人造好的零件去组装汽车这一行为越来越被人接受,火爆的python语言不就是符合未来的趋势吗?

转载于:https://www.cnblogs.com/morvalhe/p/11567506.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值