2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容
1.1 冯诺依曼体系结构
计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。
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 通用及指令指针寄存器的详细介绍
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),每个寄存器都有自己的名称,可独立存取。如下图。
1.3 计算机执行指令过程
根据PC(程序计数器,32位系统中为eip)取指令-->指令译码-->取操作数-->指令执行-->回写结果-->修改PC的值-->继续执行下一条指令。如图。
1.4 寻址方式
-
立即寻址方式(immediate addressing)
操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数。 -
寄存器寻址
-
立即数寻址
-
直接寻址
-
间接寻址
-
变址寻址
2.汇编语言学习
2.1汇编语言基本概念
- 汇编指令:机器码的助记符,有对应的机器码
- 伪指令: 没有对应的机器码,由编译器执行,计算机并不执行
- 其他符号: 如: +、-、*、/ 等,由编译器识别,没有对应的机器码
- 汇编语言的特点:
① 所占空间、执行速度与机器语言相仿
② 直接、简捷,能充分控制计算机的硬件功能
2.2堆栈
2.2.1堆栈的基本概念
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。如图。
2.2.2堆栈向上增长和向下增长
假设堆栈大小为256,一般而言32位系统中堆栈方向是向下增长的。
- 向下增长,就是从高地址向低地址增长。栈顶即为&Taskstk[255]。
- 向上增长,就是从低地址向高地址增长。栈顶即为&Taskstk[0]。
2.2.3堆栈中的基本操作及其对应的汇编语言
-
进栈指令 PUSH
-
出栈指令 POP
-
调用进程 CALL
-
返回进程 RET
-
清除进程 LEAVE
2.3挑战问题
在实验楼环境下采用vim编辑器,编写一段简单c程序,并探究c语言在汇编语言下的转换格式和内容。 将c语言文件转化为32的汇编语言,代码中函数调用内核的情况,堆栈中的变化。
2.3.1 步骤
编写的C语言程序
-
gcc编译代码
-
转换为汇编语言
-
去掉辅助信息
2.3.2 代码分析
调用流程 main函数
汇编语言调用堆栈变化过程
-
初始阶段,esp、ebp指针都是指向1000这个位置(假设堆栈大小为1000)
-
执行main函数
-
执行
-
执行跳转到f函数执行
- 执行
-执行跳转到g函数
- 执行
- 执行
- 执行
-
执行
-
执行
-
执行
-
执行
以上展示了一段简单代码调用函数的过程.
展示了整个堆栈从占用->释放的过程.
总结
本周的的学习相对于上周的Linux基础是一个进阶,开始了解Linux的内核,学习了32位和16位,64位系统的区别,了解到寄存器的分类,以及寄存器的用处.学习了一些底层的调用,任何c语言在底层中都会转化为汇编语言,之前学习的简单加法程序就是由高级语言编写,并解释成汇编语言再对底层进行调用,由此可以发现高级语言虽然语法简单\可视性强,但是硬件无法直接识别,故其运行速度\可靠性并不如汇编语言.但是未来的趋势就是越来越封装的语言,未来知识越来越多\学习的时间越来越少\利用前人造好的零件去组装汽车这一行为越来越被人接受,火爆的python语言不就是符合未来的趋势吗?