2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告
《庖丁解牛Linux内核分析》
第 1 章 计算工作原理
1.1 存储程序计算机工作模型
1.2 x86-32汇编基础
1.3汇编一个简单的C语言程序并分析其汇编指令执行过程
因为本科时期学过《微机原理与接口技术》课程,学习过8086/8088的汇编语言,所以基本上算是复习。
- 通用寄存器
EAX:累加器,是算术运算的主要寄存器,I/O指令使用该寄存器与外设传送信息
EBX:通用寄存器,常用作基址寄存器
ECX:通用寄存器,在循环时作为隐含的计数器
EDX:通用寄存器,可以和AX一起存储双字,DX存放高位
ESP:用来指示栈顶的偏移地址
EBP:常用作堆栈区中的基地址指针
ESI:源变址寄存器,具有自动增/减功能
EDI:目的变址寄存器,具有自动增/减功能- 段寄存器
CS:代码段寄存器,存放代码段的段基址或段选择字
DS:数据段寄存器,存放数据段的段基址或段选择字
ES:附加段寄存器,存放附加数据段的段基址或段选择字。
SS:堆栈段寄存器,存放堆栈段的段基址或段选择字
FS:附加段寄存器,存放附加数据段的段基址或段选择字
GS:附加段寄存器,存放附加数据段的段基址或段选择字
《Linux内核原理与实现(第3版)》第1、2、18章
第 1 章 Linux内核简介
- Linux与Unix的渊源及历史
- 操作系统和内核
- Linux内核的特点
第 2 章 从内核出发
- 内核源码的获取
- 内核和编译内核
第 18 章 调试
- 调试准备
- 内核bug的分类
- 调试方法
- printk( )
- oops
- 配置选项
- BUG( )和BUG_ON( )
- 系统请求键
- gdb和kgdb
- 探测系统
- 二分搜索
本科时学习过操作系统课程,对于内核态有一定了解,但未自己进行内核开发,第 2 章进行学习准备,第 18 章先学习怎样处理之后内核开发可能会遇到的问题,十分合理。
- Linux内核获取
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
$ git pull
- 结合上次所学,对gdb的使用更加了解,但gdb无法修改内核数据。
- 近期俗事缠身,未能真正完全按照老师教导的方式深入学习第 18 章,没能对内核调试函数进行一个个详细的分析学习。
读书收获
- mov指令中,movl中的l是指32位,movb中b指8位,movq中q指64位;
- 对Linux内核有了一个初步的浅显的了解,获取了内核源码,学习了几种调试方法,为之后的内核编程做准备;
- 两年以后再次学习汇编语言,很有意思,有不少新的感悟,希望能用于以后的编程实现中;
- 之前学过的操作系统知识终于要用于编程实现,希望在之后的Linux内核开发中获得更多乐趣。
实验报告
实验过程
- 使用vim按照要求编辑main.c
可通过实验楼支持的复制/粘贴数据传递- 使用gcc编译main.c,产生汇编代码文件main.s
$ gcc -S -o main.s main.c -m32
过程如图:

- 打开main.s,删除辅助信息,查看汇编代码
使用g/.s*/d删除所有以“.”打头的字符
结果如图:
实验分析
汇编代码工作过程
从main程序开始执行
- ebp入栈
- 把ebp值赋予给esp
- 将esp值减4,指向下一存储空间(栈单位存储空间)
- 将数值20181018(日期)存在esp所指的存储空间中
调用f函数
- ebp入栈
- 把ebp值赋予给esp
- 将esp减4,指向下一地址空间
- 将ebp加8所指向的存储空间内的内容赋予给累加寄存器eax
- 将eax的内容赋予给esp
调用g函数
- 对ebp进行压栈
- 把ebp值赋予给esp
- 将ebp加8所指向的存储空间内的内容赋予给累加寄存器eax
- 将eax储存的数值加20189221(学号)
- 出栈
返回main函数
- 返回到f函数的leave命令
- 撤销函数堆栈
- 返回到主函数的leave命令
- 将eax储存的数加9527
- 撤销函数堆栈
- 返回程序运行值
实验收获
汇编语言:
- eave指令包含着两个步骤
- 将esp指向ebp的位置;
- 将当前ebp所指向的内存单元里的内容弹出,并存入eip及存取
- 再次熟悉了汇编语言,对于mov指令有了更为深入的了解;
- 真正将汇编语言与C语言结合起来,真正了解很多时候的代码优化原理;
入栈出栈:
- 复习了堆栈中入栈出栈的步骤
- 学习栈在程序执行过程的作用,特别是编译之后用汇编语言的执行过程
2018-2019-1 20189221《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内核原理与分析第九周作业> 这个作业的目标 & ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业
2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...
随机推荐
- hadoop程序实例
安装了Eclipse及hadoop-eclipse-plugin后学着<hadoop权威指南>中的气温例子写了一个输出气温的程序,数据是我自己简单写的,但是输出却不是我预想的,这中间还有很 ...
- 使用Python往手机发送短信(基于twilio模块)
官网是https://www.twilio.com twilio的一句话介绍——提供SDK帮你连接世界上所有人,你可以很方便的调用他们提供的接口来给指定手机发短信,打电话. 首先在twilio的官网注 ...
- 拓展 NLog 优雅的输送日志到 Logstash
在上上篇博客通过对aspnetcore启动前配置做了一些更改,以及对nlog进行了自定义字段,可以把请求记录输送到mysql,正式情况可能不会这么部署.因为近期也在学习elk,所以就打算做一个实例,结 ...
- manjaro 设置 国内源
注意,如果安装过程中出现无法连接服务,请参看第 4条. 1. 设置官方镜像源(包括 core, extra, community, multilib ) $ sudo pacman-mirrors - ...
- 修改Jenkins的主目录步骤
在使用Jenkins做持续集成过程中,在构建很多次后发现有时在构建的时候系统提示磁盘空间不足,此时检查发现Jenkins的主目录挂载区放在了服务器根目录下,占用空间较大,此时除了对服务器的磁盘进行扩容 ...
- [No000014D]chrome console 调试 引入 jquery等外部库
var importJs=document.createElement('script') //在页面新建一个script标签 importJs.setAttribute("type&quo ...
- /etc/apt/sources.list" E212: Can't open file for writing解决方案
:w !sudo tee % > /dev/null 解决.
- C语言中gets(), scanf()区别
C语言中gets(), scanf()区别 相同点: gets()和 scanf() 1.函数都可用于输入字符串 2.都在stdio.h头文件中定义. 3.字符串接受字符结束后自动加'\0' 不同点: ...
- [skill] C语言数组名到底是个啥
1. 正常情况下,数组名是个地址常量. 2. sizeof(数组名)的时候,数组名就代表数字名,其类型为 type array[], 返回数组元素个数. 3. 除了2的情况以外,可以理解为一个指针常量 ...
- LeetCode 872 Leaf-Similar Trees 解题报告
题目要求 Consider all the leaves of a binary tree. From left to right order, the values of those leaves ...
