2018-2019-1 20189215《Linux内核原理与分析》第二周作业
本周学习了《庖丁解牛》第1章,以及《Linux内核设计与实现》第1、2、18章。通过视频和实验,学会了反汇编一个简单的C程序,也学习了Linux内核调试的一些小技巧和printk
函数。
反汇编一个简单的C程序
- 程序编写及编译
- 使用
vi
编辑源代码
返回值是15,我学号的后两位。 - 使用
gcc
命令编译为32位的汇编代码
- 汇编代码
- 使用
:g
删除辅助信息
- 精简后的汇编代码
- 汇编代码分析
接下来逐行分析堆栈、寄存器的变化。在此采用了和书中一样的简化表示方法,减4位转化为加1位,对应下移一格;加4位转化为减1位;对应为上移1格。
- 初始状态
- 第18行
将ebp
的值压栈,esp
减1,下移一格。 - 第19行
将esp
的值赋值给ebp
。 - 第20行
esp
下移一格。 - 第21行
立即寻址,立即值7赋值到esp
所指的位置。 - 第22行
call f
相当于push %eip
(仅仅这样表示 )和mov1 f, %eip
(仅仅这样表示),因此下一行第23行入栈,esp
下移一格,并将f函数的第一行9赋值给eip
。 - 第9、10行
cpu从eip
读取指令,程序运行第9行,将ebp
的值压栈,esp
减1,下移一格。
第10行将esp
的值赋值给ebp
。
第9、10行相当enter
指令,用于建立函数堆栈。 - 第11行
esp
下移一格。 - 第12行
移位寻址,将ebp
上移两格后所指的值赋值给eax
。 - 第13行
将eax
的值赋值给esp
所指向的位置。 - 第14行
call g
相当于push %eip
(仅仅这样表示 )和mov1 g, %eip
(仅仅这样表示),因此下一行第15行入栈,esp
下移一格,并将g函数的第一行2赋值给eip
。 - 第2、3行
cpu从eip
读取指令,程序运行第2行,将ebp
的值压栈,esp
减1,下移一格。
第3行将esp
的值赋值给ebp
。
第2、3行相当enter
指令,用于建立函数堆栈。一共建立了2个站,后面需要2两个leave
指令。 - 第4行
移位寻址,将ebp
上移两格后所指的值赋值给eax
。 - 第5行
将eax
的值加5,赋值给eax
。 - 第6行
出栈,并把值赋值给ebp
,赋值为4,ebp
指向4,esp
由于popl
操作上移一格。 - 第7行
ret
相当于popl %eip
(仅仅这样表示),执行一次出栈操作,eip
值变成15,esp
上移一格。 - 第15行
cpu从eip
读取指令,程序运行第15行,leave
是撤销函数堆栈,相当于movl %ebp,%esp
和popl %ebp
,esp
先指向与ebp
相同的位置4,再进行一次出栈操作,ebp
的值变为1,指向位置1;esp
上移一格。 - 第16行
ret
执行一次出栈操作,eip
值变成23,esp
上移一格。 - 第23行
cpu从eip
读取指令,程序运行第23行,将将eax
的值加3,赋值给eax
。 - 第24行
leave
是撤销函数堆栈,相当于movl %ebp,%esp
和popl %ebp
,esp
先指向与ebp
相同的位置1,再进行一次出栈操作,ebp
的值变为0,指向位置0;esp
上移一格,也指向0。 - 第25行
ret
执行一次出栈操作,此时栈内已经无数据了。最后eax
是默认的保存返回值的寄存器。
随着程序的进行,堆栈也发生了变化,最后回归初始状态。
《Linux内核设计与实现》读书小结
阅读本书,学会了一些与内核相关的知识。
- 使用
asm()
指令可以嵌入汇编代码。 - 分支声明
likely
和unlikely
。 - 内核中内存不分页,每多用一个字节,物理内存就减少一个字节。
- 内核并不能完美地支持浮点数的操作。
- 内核中要格外注意竞争条件引发的同步和并发。
- 调试bug需要先找到bug,最好能够复现。
- 在内核中使用
printk
函数。可以设定日志级别,<0><1><2><3><4><5><6><7>分别对应不同紧急程度的信息。 oops
是内核发出错误信息、寄存器信息、回溯信息的方式。- 原子操作——能够不分隔执行的代码;以及在执行中不能中断否则就是完不成的代码。
- 内核调用
BUG_ON()
标记bug,提供断言并输出信息,调用时会引发oops
。 - Magic SysRq key是调试、挽救即将崩溃的系统所必须的工具。
- 探测系统可以使用UID(用户ID)作为选择条件(与进程有关),使用条件变量(与进程无关)或者统计量。还可以进行重复频率限制和次数限制。
- 使用数学上的二分法可以更快的找出第一次BUG出现的内核版本。
总结
- 计算机是怎样工作的?
采用用冯诺依曼体系结构的计算机,其核心是存储程序计算机。这类计算机由内存、CPU、输入设备、输出设备组成。内存包括程序内存和数据内存,CPU包括运算器、控制器和寄存器。计算机在执行程序之前必须把要执行的相关程序和数据放入内存中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。其工作过程就是不断地取指令和执行指令的过程,最后将计算的结果放入指令指定的存储器地址中。
2018-2019-1 20189215《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程序漏洞实验> 二.本周学习内容 ...
随机推荐
- openstack的glance、nova、cinder使用ceph做后端存储
块设备与 OPENSTACK 通过 libvirt 你可以把 Ceph 块设备用于 OpenStack ,它配置了 QEMU 到 librbd 的接口. Ceph 把块设备映像条带化为对象并分布到集群 ...
- activemq 实战二 连接到ActiveMQ-Connecting to ActiveMQ
The main role of a JMS broker such as ActiveMQ is to provide a communication infrastructure for clie ...
- Excel 2010 如何在Excel的单元格中加入下拉选项
http://jingyan.baidu.com/article/03b2f78c4ba8a05ea237ae95.html 第一步:打开excel文档,选中需加入下拉选项的单元格. 第二步:点击 ...
- iOS 8 新特性介绍
来源:nshipster.cn 发布时间:2014-07-06 阅读次数:2152 随便去问任何人,他们都会告诉你WWDC2014是近年来最为激动的回忆. 整个大会没有发布任何新硬件,它是一次史无前例 ...
- mysql数据类型及存储过程
转自:http://www.cnblogs.com/mark-chan/p/5384139.html 存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为 ...
- Oracle各种表空间
system表空间:含数据字典信息 sysaux表空间:存储各种oracle应用的元数据(如AWR的操作数据) 创建表空间后,不能改变区尺寸 区尺寸管理:自动分配(AUTOALLOCATE):小段64 ...
- MyBatis DAO层传递参数到mapping.xml 几种方式
Dao层传递参数到mapping.xml文件的几种方式:(Mybatis传值总结) 第一种:传递单个参数 Dao层Code片段: /** * 根据articleId查询XXXX详情. * * @par ...
- 常用linq语法
1.简单的linq语法 var ss = from r in db.Am_recProScheme select r; var ss1 = db.Am_recProScheme; string sss ...
- Code Forces 149DColoring Brackets(区间DP)
Coloring Brackets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- linux设备驱动开发详解 笔记
在目录的 Makefile 中关于 RTC_DRV_S3C 的编译脚本为: obj -$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o 上述脚本意味着如果 RTC_DRV_S3 ...