2018-2019-1 20189206 《Linux内核原理与分析》第二周作业
Linux内核分析 第二周学习
知识总结
操作系统与内核
- 操作系统 指在整个系统中负责完成最基本功能和系统管理的那些部分
- 内核 实际是操作系统的内在核心
- 内核独立于普通应用程序,拥有受保护的内存空间和访问硬件设备的所有权限,这种空间被称为内核空间
- 当内核运行的时候,系统以内核状态进入内核空间执行
- 当应用程序通过系统调用与内核通信时,我们称内核正在代其执行
- 应用程序称为通过系统调用在内核空间运行,内核被称为运行于进程上下文中
- 实际上,应用程序通常调用库函数,然后库函数通过系统调用界面,让内核完成不同任务
- linux是一个单内核,但拥有模块化设计、抢占式内核、支持内核线程及动态装载内核模块的能力
计算机工作原理
冯诺依曼体系结构
根据冯诺依曼提出的理论:把程序本身当作数据来对待,程序和数据处理用同样的方式

- CPU 是计算机硬件的基础,与内存和I/O设备进行交互,其中PC程序寄存器总是指向下一条要执行的命令
- API 程序与计算机的接口
ABI 程序与CPU的接口
x86-32汇编基础
CPU的寄存器
8086CPU中一共有14个16位寄存器,分别为:
- 数据寄存器
- AX 累加寄存器
- BX 基地址寄存器
- CX 计数器寄存器
- DX 数据寄存器
- 指针寄存器
- SP 堆栈指针寄存器
- BP 基指针寄存器
- 变址寄存器
- SI 源变址寄存器
- DI 目的变址寄存器
- 控制寄存器
- IP 指令指针寄存器
- FLAG 标志寄存器
- 段寄存器
- CS 代码段寄存器
- DS 数据段寄存器
- SS 堆栈段寄存器
- ES 附加段寄存器
【注】在32位CPU中,32位寄存器EAX EBX ECX EDX 不仅可以传送数据、暂存数据保存算数罗运算结果,还可以作为指针寄存器。
在定位一个指令时,使用CS:EIP来指明它的地址
寻址方式和常用汇编指令
- 操作数
- 立即数 即常数,用$后跟一个数值表示
- 寄存器数 表示某个寄存器保存的值 用%eax表示
- 存储器引用 根据计算出来的有效地址,访问存储器的某个位置
- 常见汇编指令
- 寄存器寻址 操作寄存器而不和内存打交道
movl %eax,%edx表示将寄存器eax中的内容放到ebx中
- 立即寻址
movl $0x123, %eax表示将0x123这个16进制数放入eax这个寄存器中
- 直接寻址
movl 0x123,%edx表示将0x123内存地址所指向的那块内存里存储的数据放到EDX寄存器中
- 间接寻址
movl (%ebx),%edx表示取ebx寄存器中存储的地址的值,放入edx中
- 变址寻址
movl 4(%ebx),%edx表示在间接寻址的基础上,在原地址上加上一个立即数4
- 出栈入栈
pushl %eax- 相当于
subl $4,%esp movl %eax,(%esp)将栈顶指针向下移动一位,再将eax的内容放入esp指向的内存中 - 由于堆栈是向下增长的,所以用减指令栈顶指针向下移动
- 相当于
popl %eax- 相当于
movl (%esp),%eax addl $4,%esp将栈顶数值放在eax寄存器中,esp指针向上移动,栈在收缩
- 相当于
- 函数调用
call 0x12345- 相当于
pushl %eip(*) movl $0x12345, %eip(*)将当前eip(指向下一条要运行的指令地址)入栈,然后将新的地址赋给eip - 由于不能直接对eip进行操作,所以以上的等价操作都是伪指令
- 相当于
- 函数返回
ret- 相当于
popl %eip(*)就是把当前堆栈栈顶的一个存储单元放到eip寄存器中
- 相当于
- 宏指令
leave用来撤销函数堆栈- 相当于
movl %esp,%ebp popl %ebp
- 相当于
enter用来建立函数堆栈相当于
pushl %ebp movl %esp,%ebp
- 寄存器寻址 操作寄存器而不和内存打交道
实验部分
实验一 反汇编一个简单的C程序
通过linux系统的gcc编译命令的参数-S 编译出汇编程序main.s 利用vim查看其中的代码。


其中,产生的汇编代码中所有以.开头的命令都是用于链接的辅助信息,为了查看到纯汇编程序,我们可以将所有带点的命令删除,得到的就是汇编代码。


对汇编代码的分析
- pushl %ebp ebp指针指向栈底,将ebp指向的位置入栈,栈顶指针esp向下移动
- movl %esp , %ebp ebp和esp指向同一个位置
上面两条命令相当于建立main函数自己的函数调用空间 - subl $4,%esp esp指针减4 表示指针向下移动一个位置
- movl $2,(%esp) 将立即数2存入esp指向的位置
- call f 相当于 pushl %eip
movl f,%eip 实际上就是将eip指针指向的代码地址入栈,之后将eip指针指向f函数,实现了函数的跳转
之后再跳转执行f函数的代码。
【注】EAX寄存器是默认存储函数返回值的寄存器
所有函数的头两行指令用于初始化函数自己的函数调用堆栈空间
对应的堆栈变化




遇到的问题
- movl %eax,%ebx 是将eax寄存器中存储的内容给了ebx
movl %esp,%ebp 是将ebp指针指向和esp指针指向的同一个位置
我刚开始就对这两条命令不是很清楚,为什么第一条就可以是存储内容,而第二条就是改变了指针的指向。后来我反应过来,esp和ebp这两个寄存器存储的是地址,是堆栈的栈底和栈顶的位置,从实质来看,改变的仍旧是寄存器中的内容。
2.刚开始的堆栈总是画不对,后来发现是概念错误

pushl %esp 首先将esp指针向下移动一位,再将esp指向的地址入栈。

2018-2019-1 20189206 《Linux内核原理与分析》第二周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业
<Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...
随机推荐
- securecrt配置经验总结(home.key和颜色)
还是用securecrt portable方便,配好了,换个机器,打包拷贝过去就行了.不用从两个地方去打包. 参考了网上的资料,颜色参考http://www.jackxiang.com/post/58 ...
- 4.C#虚方法virtual详解
C#虚方法virtual详解 在C++.Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外. 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数 ...
- 开源unittest测试报告源码BSTestRunner.py
开源BSTestRunner 生成HTML测试报告源码: 保存代码到BSTestRunner.py 配合Unittest使用,很完美. python2: """ A Te ...
- 关于 CGI,Fastcgi和php-fpm 理解
首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.h ...
- mysql优化(四)
一.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where / group by / order by 涉及的列上建立索引. 1.索引失效情况. SQL什么条件会使用索引? 当字段上建有索引时, ...
- Marlin 溫度感應器 數值轉換對應表
Marlin 溫度感應器 數值轉換對應表 (2014/03/27)Update: 自己實測了這個自動產生的對應表,結果測得的溫度與實際值仍有相當大的誤差.看來還是要回頭用測量的方式來校正溫度... ...
- Gambler Bo (高斯消元求特解)
对于图中的每一个点假设点击Xi * m + j 然后每个点都有那么对于每一个点可以列举出一个方程式,n*m个点解n*m个未知数.利用高斯消元就可以解决. 问题就在这个题目可能不止有一个特,所以我们需要 ...
- intelj idea安装和配置
1|0优势 intellij idea 是目前公认的java最好的开发工具之一,商业版的IntelliJ应该包含了对 HTML5.CSS3.SASS.LESS.JavaScript.CoffeeScr ...
- MQ(转)
1. 到底什么时候该使用MQ? 1). 典型场景一:数据驱动的任务依赖 采用MQ的优点是: a. 不需要预留buffer,上游任务执行完,下游任务总会在第一时间被执行 b. 依赖多个任务,被多个任务依 ...
- Integer诡异特性
package 代码测试; public class ceshi { public static void main(String[] args) { Integer i1=100; Integer ...