《Linux内核分析》课程第一周学习总结
姓名:何伟钦
学号:20135223
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
学习内容:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
第一部分:视频教学笔记总结
一、存储程序计算机
冯诺依曼体系结构概念:即具有存储程序计算机的体系结构,大多数拥有计算和存储功能的设备(手机、平板、计算机等)其核心构造均为冯诺依曼体系结构
冯诺依曼体系结构工作模型:

(一)从硬件角度来看
CPU与内存通过总线连接,CPU上的IP(16位CPU叫IP、32位CPU叫EIP、64位CPU叫RAP)总指向内存的某一块区域;IP指向代码段CS;CPU总是执行IP指向的指令,执行完这条指令后,接着执行下一条指令。内存保存指令和数据,CPU执行这些指令
(二)从软件角度来看
API:程序员与计算机的接口界面
ABI:程序与CPU的二进制接口,指令编码,主要是汇编指令,需要熟悉指令中涉及的寄存器布局,大多数指令可以访问内存。
X86中EIP在CPU执行完一条指令之后自动加一条指令,指令长度是不一样的,也可以被其它指令,如CALL,RET,JMP and conditional JMP等修改
二、x86汇编基础
堆栈段寄存器:EBP(堆栈基址寄存器)和ESP(堆栈顶指针寄存器)这两个寄存器比较常用使用于汇编程序
代码段寄存器:CPU实际取指令的时候通过cs:eip来描述
64位CPU与32位在核心机制上差别不大,64位的机器中,寄存器以R开头表示,例如RAX ,RBX
后缀b,w,l,q分别代表8,16,32,64位,立即数是以$开头的十六进制数值
常见汇编指令
寄存器寻址 movl %eax,%edx -----edx=eax
立即数寻址 movl $0x123,%eax-----%eax=0x123
直接寻址 movl 0x123,%eax -----edx=*(int32_t*)0x123;
变址寻址 movl 4(%ebx),%edx---edx = *(inet_32 *)(ebx+4),(ebx的值加4之后作为一个地址,将其指向的数据赋给%edx
大多数指令都可以直接访问内存地址)
A&T汇编格式与Intel汇编略有不同
Linux内核使用的是A&T汇编格式
重要的汇编指令(函数调用堆栈是理解C代码在CPU上执行的关键)
push %eax 相当于 subl $4 ,%esp;
movl %eax ,(%esp)
pop %eax 相当于 movl (%esp),%eax;
addl $4, %esp
call 0x12345 相当于 push %eip(*);
movl $0x12345,%eip(*)
ret 相当于 popl %eip(*)
enter 相当于 push %ebp
movl %esp,%ebp
leave 相当于 movl %ebp,%esp ;
pop %ebp
(补充说明 :ret就是把保存的eip从堆栈中弹出来,从函数调用的下一条指令执行,enter指令相当于在原来的堆栈上再建一个新的空堆栈;leave指令相当于撤销函数调用堆栈;函数调用堆栈是由逻辑上多个堆栈叠加起来的;函数的返回值默认用%eax存储,然后返回给上一级函数)
第二部分:实验与作业
(注:以下实验在本人计算机64位虚拟机上完成,非实验楼)
(1)创建code文件夹 ,使用vi在Linux环境下编写源代码,并运行源代码是否有错误

源代码如图所示:

(2)使用gcc –S –o main.s main.c -m32 命令编译成汇编代码


(3)将以"."开头的行删去,得到干净的汇编代码

分析汇编代码
(1)代码首先从main函数开始 执行,首先建立空栈

(2)pushl %ebp 相当于 subl $4 ,%esp; movl %eax ,(%esp)
即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)

(3)movl %esp, %ebp 将栈顶指针%esp指向的地址赋给%ebp

(4)subl $4, %esp 将%esp向下移动四位字节(移动一格)

(5)movl $15, (%esp) 将立即数15放在%esp指向的地址

(6)call f 调用f函数执行,将call f 后面的那条语句addl $5, %eax(这里用eip 23)压栈,此时eip指向f函数,程序执行f函数,建立f函数堆栈结构

(7)pushl %ebp 相当于 movl %ebp,(%esp);addl $4, %esp
即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)

(8)movl %esp, %ebp 将栈顶指针%esp指向的地址赋给%ebp

(9)subl $4, %esp 将%esp向下移动四位字节(移动一格)

(10)movl 8(%ebp), %eax
movl %eax, (%esp) 将此时%ebp地址加上8位字节所指向地址的存储的值赋给%eax,再将%eax的值(立即数15)放在%esp指定的位置

(11)call g 调用g函数执行,将call g 后面的那条指令leave(这里用eip 15表示)压栈,此时eip指向g函数,程序执行g函数,建立g函数栈结构

(12)pushl %ebp 将%ebp压栈 相当于 movl %ebp,(%esp);addl $4, %esp

即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)
(13)movl %esp, %ebp 将栈顶指针%esp指向的地址赋给%ebp

(14)movl 8(%ebp),%eax,将此时%ebp地址加上8位字节所指向地址的存储的值赋给%eax(此时eax=15),%esp不变

(15)addl $10,%eax,将%eax的值加上10,即此时eax=15+10=25 ,%esp不变

(16)popl %ebp,将%ebp3弹栈,%esp增4 相当于 movl (%esp),%ebp;addl $4, %esp

(17)ret 相当于popl %eip(*) 等同于于movl (%esp),%eip;addl $4, %esp

(18)f函数的leave 撤销函数堆栈 movl %ebp,%esp ;pop %ebp 将ebp指向地址赋值给esp ,ebp指向栈的ebp 2,esp加4,向上缩进一个栈单元

(19)ret 相当于popl %eip(*)

(20)addl $5,%eax,将eax加5(此时eax=25+5=30)

(21)main函数的leave操作,相当于 movl %ebp,%esp ;pop %ebp

最后结果返回值%eax=30
第三部分:学习总结
(一)堆栈结构:
1.堆栈生长方向是地址递减的方向。
2. 函数调用时参数的压栈顺序是逆序的,最后一个参数先压栈,第一个参数最后压栈,即堆栈遵循”先进后出”的原则。
3. 进入函数后,会对原有堆栈结构进行重新调整,首先将ebp压栈;然后将ebp指向当前的esp,也就是改变栈底指针,并且还改变了esp栈顶指针的值,就好像从新开辟了新的堆栈结构;接着在新的堆栈上进行函数代码实现;最后恢复原先栈结构。
4. call指令会自动将返回地址(eip)压栈,ret指令也会自动将返回地址(eip)出栈。
5.eax用于存放返回值
(二)学习认识:
按照冯·诺依曼存储程序的原理,计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,再按地址把结果送到内存中去。然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。其工作过程就是不断地取指令和执行指令的过程,最后将计算的结果放入指令指定的存储器地址中,这就是计算工作的基本原理。虽然这样看起来计算机是“笨拙”的,但无论是多大多复杂的程序都需要这种笨拙的方法。
《Linux内核分析》课程第一周学习总结的更多相关文章
- 《Linux内核分析》第一周学习笔记
<Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- 《Linux内核分析》第一周学习小结 计算机是如何工作的?
<Linux内核分析>第一周.计算机是如何工作的? 20135204 郝智宇 一.存储程序计算机工作模型 1. 冯诺依曼体系结构: 数字计算机的数制采用二进制:计算机应该按照程 ...
- 《Linux内核分析》第一周学习报告
第一周:计算机是如何工作的 姓名:王玮怡 学号:20135116 第一节 存储程序计算机工作模型(冯诺依曼体系结构) IP指向的内存地址,取指令执行,完成后,IP值自加一,取下一条指令再执行. AP ...
- LINUX内核分析第七周学习总结:可执行程序的装载
LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- LINUX内核分析第七周学习总结——可执行程序的装载
LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- LINUX内核分析第六周学习总结——进程的描述与创建
LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...
- LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)
LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...
- LINUX内核分析第八周学习总结
LINUX内核分析第八周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
- linux内核分析第六周学习笔记
LINUX内核分析第六周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
随机推荐
- DevExpress05、TileControl、AlertControl
TileControl控件 该控件是根据Windows 8的用户界面设计的,可以轻松地把各个控制块集成到窗体上. 1. IndertBetweenGroups属性 控制两个Group之间的间距: ...
- 使用JavaScript实现简单的小游戏-贪吃蛇
最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...
- ArcMap 导入Excel坐标数据
1 准备Excel坐标数据集合 2 ArcMap加入Excel数据 将excel文件放入arcmap工作区的物理路径下 在工作区的根图层上点键,选择添加数据,找到excel文件并选择相应的工作薄 ...
- [luogu2172] 部落战争
题面 我们可以将'.'抽象为一个可以通过的点, 将'x'抽象为一个不可通过的点. 那么题意便可以转化为: 一条路径可以看做从任意一个没有到达过的可通过的点出发到任意一个其他的可以通过却没有被到 ...
- oracle 按条件删除、查询表
---查询表的名称,字段信息以及字段注释 select us.table_name, --表名 ut.COLUMN_NAME,--字段名称 uc.comments,--字段注释 ut.DATA_T ...
- Kubernetes1.91(K8s)安装部署过程(六)--node节点部署
hi,everybody,我回来了,之前安装到flannel之后,文章一直没有更新,甚至不少小伙伴都来加qq询问是否继续更新了, 这里说明下原因,我在部署1.91node的时候的确出现了各种各样的问题 ...
- cloudstack secondary vm starting
等1个小时,差不多可以进入虚拟机,看日志/var/log/cloud.log
- day62
一.组件 组件都具有模板,template new Vue()创建的是根组件 组件与实例一一对应,创建一个实例就是创建了一个组件,同理创建一个组件就相当于创建了一个实例 根组件的挂载点一般就是根组件的 ...
- Oracle substr() instr() 用法
转载:oracle中substr() instr() 用法 substr(字符串,截取开始位置,截取长度) = 返回截取的字符串instr(源字符串,目标字符串,起始字符串,匹配字符串) = 返回要截 ...
- canvas绘画基础(一):认识canvas画布
html5提供了一个<canvas>标签,结合javascript的canvas api接口可以用来绘制图形和动画.最近工作中涉及到画图的任务,下面来了解一下canvas的基础:canva ...