Linux内核分析——第一周学习笔记20135308
第一周 计算机是如何工作的
第一节 存储程序计算机工作模型
1、冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。


2、CPU可以抽象成一个for循环,总是从内存中执行下一条指令。
- 内存:保存指令数据
- CPU:解释执行指令、数据
内存与CPU通过总线连接。
API:应用程序编程接口
ABI:二进制(指令编码)接口

例如:32位计算机X86,EIP指向内存的某条指令
1、自+1,即自动加到下一条指令
2、可被其他指令修改,如CALL,RET,JMP等。
第二节 X86汇编基础
一、X86 CPU的寄存器

如上图,是一个32位寄存器。
16位寄存器:AX,BX,CX,DX,BP,SI,DI,SP等
32位寄存器:EAX累加寄存器,EBX基址寄存器,ECX技术寄存器等 前面加上E的均为32位寄存器。

64位寄存器与32位寄存器区别不大,前面有R的为64位寄存器。

二、mov指令及几种内存寻址方式

1、movl:l为32位
- 寄存器寻址%eax,%edx
即操作寄存器,与内存无关,相当于eax=edx
- 立即寻址$0x123,%edx
123这个16进制数值放进寄存器edx中($表示立即数)
- 直接寻址0x123,%edx
123这个地址指向寄存器edx(没有$表示地址)
- 间接寻址(%ebx),%edx
(%ebx)表示ebx这个寄存器存的值为内存地址
- 变值寻址4(%ebx),%edx
在间接寻址的基础上加上4
2、movb:b为8位
3、movw:w为16位
注意:
AT&T汇编格式与Intel汇编格式略有不同
Linux内核使用的是AT&T汇编格式
三、几个重要的汇编指令:push、pop、call、ret

1、pushl %eax
把eax压栈到堆栈栈底
即首先把esp减4
esp表示堆栈栈顶
ebp表示堆栈基址
2、popl %eax
把eax从堆栈栈顶取32位,放在寄存器eax中
即首先把栈顶esp的数值放在eax中,再把栈顶加4
3、call 0x12345
调用该地址
即将当前的eip(当前CPU执行命令的指针)压栈,赋给eip一个新值(CPU下一条执行的指令)
4、ret
即将call时保存的eip还原到eip寄存器,return call之前的那条指令
eip(*)这个*指程序员不能直接修改eip
四、分析一段汇编代码
1、


2、


3、


第三节 将C代码编译成汇编代码
实验:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
首先,通过vi编写luchang5308.c文件


通过gcc –S –o main.s main.c -m32命令将c文件编译成汇编代码


删除以.开头的说明语句

P.S. enter指令与leave指令

P.S. 函数的返回值默认使用eax寄存器存储返回给上一级函数
过程分析:

把ebp的值0压入栈,esp减4,指向下一个位置



esp的值赋给ebp,这样,ebp也指向标号1的位置


esp向下移动一个标号,指向2


将立即数6放在esp所指的位置


call命令包含
1.push eip
2.mov f eip
执行call命令,eip指向下一条指令,即23行代码,将eip压栈,eip指向f函数,指令从f函数开始执行,esp指向标号3的位置。


将ebp压栈,esp指向标号为4的位置


将esp的值赋给ebp


esp指向下一个位置,即标号为5的地方


ebp变址寻址8,即ebp从标号为4的地方,向上移动2个位置,内容为6,所以eax=6


把eax放在esp的位置,即5的位置


push eip
调用g函数,esp标号向下移动一位,标号为6的位置,eip15压栈,此时eip指向g函数


将ebp的值压栈


把ebp指向esp所在的位置


ebp上两个位置的值赋给eax,eax=6


eax加4,eax=10


弹栈,把ebp(4)放回ebp,即让ebp又指向了4的位置。同时,esp加4,指向6。


ret即popl %eip,此时eip所存为15,esp指向标号5的位置,同时eip指向了15



ebp指向4,esp也指向4,ebp弹栈,ebp指向1,esp加4,指向3


popl %eip eip为23,esp加4,指向2


eax加3,eax=13


movl %ebp,%esp
popl %ebp
首先,ebp,esp均指向了1

然后,ebp指向0,esp减4,指向0,回到了main函数最初的状态

该程序堆栈执行完毕
总结
对“计算机是如何工作的”理解
1、冯·诺依曼提出程序存储的思想,程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。
2、CPU可以抽象成一个for循环,总是从内存中执行下一条指令。内存负责保存指令数据,CPU负责解释执行指令、数据。内存与CPU通过总线连接。
3、通过使用高级语言,应用汇编语言,机器语言的编译,即计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。最终将指令的结果放入寄存器中。
攥写人:芦畅 学号:20135308
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux内核分析——第一周学习笔记20135308的更多相关文章
- linux内核分析第一周学习笔记
linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 20135320赵瀚青LINUX内核分析第一周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.概述 第一周的学习内容主 ...
- Linux内核分析——第一周学习笔记
20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...
- Linux内核分析——第二周学习笔记20135308
第二周 操作系统是如何工作的 第一节 函数调用堆栈 存储程序计算机:是所有计算机基础的框架 堆栈:计算机中基础的部分,在计算机只有机器语言.汇编语言时,就有了堆栈.堆栈机制是高级语言可以运行的基础. ...
- LINUX内核分析第一周学习总结——计算机是如何工作的
LINUX内核分析第一周学习总结——计算机是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...
- Linux内核分析第二周学习笔记
linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程
Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...
- 三20135320赵瀚青LINUX内核分析第二周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机的三个法宝 存储程 ...
- Linux内核分析第一周学习总结:计算机是如何工作的?
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.冯诺依曼体系 ...
随机推荐
- yaml格式
yaml中允许表示三种格式,分别为常量值.对象和数组 例如: 其中#作为注释,yaml中只有行注释 基本格式要求: 1.大小写敏感:2.使用缩进代表层级关系: 3.缩进只能使用空格,不能使用tab键, ...
- vue组件-子组件向父组件传递数据-自定义事件
自定义事件 我们知道,父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,应该怎样做?那就是自定义事件!
- http的长连接和短连接(数据库也一样)
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...
- SAP客户端 测试机、开发机、生产机
SAP客户端 测试机.开发机.生产机 客户端(即Client),是SAP组织架构里最高层的组织单元,所有数据,包括静态数据(科目.客户.供应商.物料.资产等).业务数据(采购订单.销售订单. ...
- android与JS交互,互相调用方法,跳转到网页
在main下面New - Folder - Assets Folder,在Assets下面新建一个js_android.html <html><head> <meta h ...
- 开源仓库Harbor搭建及配置过程
1.Harbor介绍 Harbor是Vmvare中国团队开发的开源registry仓库,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务. 2.安装 ...
- C++ 虚函数的使用
虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: #include <iostream> using na ...
- BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...
- [Baltic 2011]Lamp BZOJ2346
分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...
- 领域驱动设计理解&总结
领域驱动设计理解&总结 这篇文章主要是通读<实现领域驱动设计>之后自己的理解和总结(同时也参照一些博文的分析来加深自己的理解): 有些疑问是自定义内容,虽然有自己的理解,但依然感觉 ...