读书报告


庖丁解牛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内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  10. 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...

随机推荐

  1. Saltstack设置安装源为阿里源

    Saltstack设置安装源为官方源有时候在国内网络不好安装较慢或者安装不上,可设置为阿里源 比如对于 Centos 7 系统,在 saltstack 的官网提供的配置初始化手册是: sudo yum ...

  2. python-Beautiful rose

    热爱python,热爱生活,python需要浪漫,让我带大家走进浪漫的国度...写的不好的地方请大佬指教 import turtle import time class Rose: def __ini ...

  3. imu_tk标定算法原理

    imu_tk代码地址 https://bitbucket.org/alberto_pretto/imu_tk II. S ENSOR E RROR M ODEL 对于理想的IMU,加速度计三元组的3个 ...

  4. ThinkPHP最简教程

    这里不讲原理,只讲操作. 这里不说MVC,只说目录(文件夹)结构. 假设Apache Http Server.PHP.MySql都已经安装完毕并已配置完毕,能够输出phpinfo(). 框架是什么? ...

  5. [No000017E]改善C#程序的建议7:正确停止线程

    开发者总尝试对自己的代码有更多的控制.“让那个还在工作的线程马上停止下来”就是诸多要求中的一种.然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停.无 ...

  6. 查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题

    MySQL CPU 使用率高的原因和解决方法_产品性能_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/51587.html ...

  7. es_5.4.4 reinstall log and upgrade to V6.5.4--APM

      elastic-APM opbeat is deadhttps://blog.csdn.net/chenwenhao0304/article/details/83302942https://www ...

  8. https://pypi.org/project/py-mysql2pgsql/

    https://packages.ubuntu.com/trusty/postgresql-server-dev-9.3 所以使用下面的命令即可安装python-dev: yum install py ...

  9. # 20165225 《Java程序设计》第一周学习总结

    20165225 <Java程序设计>第一周学习总结 1.视频与课本中的学习: 首先是为了运行和开发Java分别安装了JRE和JDK,具体做法在老师给的<Java2 实用教程(第五版 ...

  10. mmu裸机程序

    硬件平台:JZ2440 init.c     -->  初始化sdram,创建页表 leds.c   -->  使用init.c初始化的VA地址控制led start.s  -->  ...