20169211《Linux内核原理与分析》第二周作业
一、《linux内核分析》实验一实验报告
在进行实验楼操作之前,先听授了网易云课堂中孟老师关于“计算机是如何工作的?”的介绍。其中主要涉及到了冯诺依曼体系结构,或称为存储程序计算机、从硬件角度和程序员的角度对计算机中内存与CPU之间关系的理解、API——程序与计算机的接口界面、ABI——程序与CPU的接口界面、16位和32位以及64位的X86体系结构的寄存器,其中印象最深的是堆栈指针、段寄存器和EIP等。而对于堆栈指针,在本科阶段学习数据结构课程的时候已经有过相关的编程与实践,但是却没有真正在汇编中进行过相关的操作。紧接着做了一下实验楼中的实验——反汇编一个简单的C程序,下边是我的操作过程,以及我对这部分汇编代码的理解。
C程序代码:
实验楼给出的代码中,简单修改了一下参数,最后的返回结果为11。那么计算机是如何执行的呢?C作为一门高级程序设计语言,计算机是读不懂这段代码的。根据孟老师的讲解,计算机首先借助于gcc命令将这段程序编译成汇编程序,然后通过汇编翻译程序将其翻译成计算机二进制机器指令,最后CPU中的IP寄存器读取到内存中这段程序对应的一大串二进制指令进行计算执行,最后将结果进行输出。实验中,将这段程序保存为main.c文件,通过gcc main.c进行编译,得到一个a.out的文件,执行./a.out,最后通过gcc -S -o main.s main.c -m32命令将main.c的源程序反汇编成对应的汇编代码,按孟老师所讲,main.s里面所有以.开头的代码主要是一些用于链接的辅助信息,并不会被执行,在这里为了方便学习,可以先把它们删除掉,从而得到一个纯净的汇编代码,如下图所示:
不难发现,不管是main函数还是g和f函数,它们编译成汇编之后,前两行的汇编指令都是相同的。这个和函数栈帧有关。机器是用栈来传递过程参数,存储返回信息的过程,过程调用开始时,都会为当前这个过程建立一个栈帧。%ebp是帧指针,%esp是栈指针。这两句的意思是保存旧的帧,创建新的栈帧。由于函数可以调函数,这里的当前基地址,实际上是上一个函数的栈基地址。在这里,f函数中的这两条指令,实际上是保存的main函数的栈基地址、g里边保存的是f函数的栈基地址。
接着分析:
subl $4, %esp
movl $2, (%esp)
参数进栈,将立即数2保存到esp所指向的内存地址——栈顶。然后执行call指令,调用f函数。f函数前两行指令保存main函数的栈基地址,然后接着参数进栈,将立即数8保存到栈顶,并与立即数3相加,并将结果放入栈顶。接着调用g函数。那么问题来了,函数是如何退出的呢?观察mian和f函数,发现退出函数使用的如下指令:
leave
ret
leave指令相当于如下指令:
movl %ebp, %esp //清空当前函数所使用的栈
popl %ebp //把ebp恢复到前一个函数的栈基地址
接着ret恢复指令指向:popl %eip。
为什么g函数没有leave呢?因为g函数内部没有任何的变量声明和函数调用,栈一直都是空的,所以编译器优化了指令。下边以一张图来说明上边指令的执行过程。
实验补充:程序执行过程堆栈图分析
二、《linux内核设计与实现》第1、2、18章学习总结
从第1章的linux内核简介到第2章的从linux内核出发,再到第18章所讲述的如何对linux内核进行调试以及调试中需要注意的一些事项和问题,最后结合网易云课堂孟老师对如何构造一个简单的linux系统MenuOS的视频讲解与操作演示,我开始尝试用自己的Linux系统环境来搭建这样一个MenuOS,首先是从https://www.kernel.org中下载到linux-3.18.6.tar.xz的源代码,然后进行解压缩、编译;这个过程还算顺利。不过编译的时间确实比较长,花了大概15分钟。但是,在制作根文件系统时,遇到了一些问题,当执行:
gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
命令时,遇到了如下问题:
通过参考nixCraft的描述,发现我自己的系统环境中缺少32位嵌入式GNU的C库,安装后得以解决了。
yum install glibc-devel.i686
可是还存在一个问题,如下:
[root@localhost menu]# gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
gcc: –lpthread: No such file or directory
对于这个问题,网上尝试查找相关解决办法,但未能解决。很遗憾没能成功制作出根文件系统,时间原因,博客就先写到这里,后续遗留问题将跟进解决。
参考文档:
20169211《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内核原理与分析第九周作业> 这个作业的目标 & ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
随机推荐
- dalao&话
最大权闭合子图 正负点权之间连边,容量为无穷大,代表正负之间有联系,跑最小割,要么舍弃正的要么舍弃负的,就是把图割开
- nodejs文件压缩-使用gulp命令(安装过程)
为了代码安全问题,一般发布程序的时候需要将js代码进行压缩,记录一下安装流程.避免忘记. 安装插件
- Handlerbars基础笔记
此笔记摘抄于杨元的博客(http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) 引入 <script type=&qu ...
- windows安装zookeeper和kafka,flume
一.安装JDK 过程比较简单,这里不做说明. 最后打开cmd输入如下内容,表示安装成功 二.安装zooeleeper 下载安装包:http://zookeeper.apache.org/release ...
- 【CodeForces】932 E. Team Work
[题目]E. Team Work [题意]给定n和k,n个人中选择一个大小为x非空子集的代价是x^k,求所有非空子集的代价和%1e9+7.n<=10^9,k<=5000. [算法]斯特林反 ...
- 【CodeForces】913 E. Logical Expression
[题目]E. Logical Expression [题意]令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至 ...
- redis笔记之两种持久化备份方式(RDB & AOF)
Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...
- discuz 积分按日重新计算,(摒弃以前24小时计算)
修改\source\module\forum\forum_misc.php将 foreach(C::t('forum_ratelog')->fetch_all_sum_score($_G['ui ...
- 大端小端转换,le32_to_cpu 和cpu_to_le32
字节序 http://oss.org.cn/kernel-book/ldd3/ch11s04.html 小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台 ...
- input只读属性 设置和移除 选择数字
设置只读属性 $('#stage').attr("readonly", "readonly"); 移除 只读属性 $("input").r ...