本周学习了《庖丁解牛》第1章,以及《Linux内核设计与实现》第1、2、18章。通过视频和实验,学会了反汇编一个简单的C程序,也学习了Linux内核调试的一些小技巧和printk函数。

反汇编一个简单的C程序

  • 程序编写及编译
  1. 使用vi编辑源代码


    返回值是15,我学号的后两位。
  2. 使用gcc命令编译为32位的汇编代码

  3. 汇编代码

  4. 使用:g删除辅助信息

  5. 精简后的汇编代码

  • 汇编代码分析
    接下来逐行分析堆栈、寄存器的变化。在此采用了和书中一样的简化表示方法,减4位转化为加1位,对应下移一格;加4位转化为减1位;对应为上移1格。
  1. 初始状态
  2. 第18行

    ebp的值压栈,esp减1,下移一格。
  3. 第19行

    esp的值赋值给ebp
  4. 第20行

    esp下移一格。
  5. 第21行

    立即寻址,立即值7赋值到esp所指的位置。
  6. 第22行

    call f相当于push %eip(仅仅这样表示 )和mov1 f, %eip(仅仅这样表示),因此下一行第23行入栈,esp下移一格,并将f函数的第一行9赋值给eip
  7. 第9、10行

    cpu从eip读取指令,程序运行第9行,将ebp的值压栈,esp减1,下移一格。

    第10行将esp的值赋值给ebp
    第9、10行相当enter指令,用于建立函数堆栈。
  8. 第11行

    esp下移一格。
  9. 第12行

    移位寻址,将ebp上移两格后所指的值赋值给eax
  10. 第13行

    eax的值赋值给esp所指向的位置。
  11. 第14行

    call g相当于push %eip(仅仅这样表示 )和mov1 g, %eip(仅仅这样表示),因此下一行第15行入栈,esp下移一格,并将g函数的第一行2赋值给eip
  12. 第2、3行

    cpu从eip读取指令,程序运行第2行,将ebp的值压栈,esp减1,下移一格。

    第3行将esp的值赋值给ebp
    第2、3行相当enter指令,用于建立函数堆栈。一共建立了2个站,后面需要2两个leave指令。
  13. 第4行

    移位寻址,将ebp上移两格后所指的值赋值给eax
  14. 第5行

    eax的值加5,赋值给eax
  15. 第6行

    出栈,并把值赋值给ebp,赋值为4,ebp指向4,esp由于popl操作上移一格。
  16. 第7行

    ret相当于popl %eip(仅仅这样表示),执行一次出栈操作,eip值变成15,esp上移一格。
  17. 第15行

    cpu从eip读取指令,程序运行第15行,leave是撤销函数堆栈,相当于movl %ebp,%esppopl %ebpesp先指向与ebp相同的位置4,再进行一次出栈操作,ebp的值变为1,指向位置1;esp上移一格。
  18. 第16行

    ret执行一次出栈操作,eip值变成23,esp上移一格。
  19. 第23行

    cpu从eip读取指令,程序运行第23行,将将eax的值加3,赋值给eax
  20. 第24行

    leave是撤销函数堆栈,相当于movl %ebp,%esppopl %ebpesp先指向与ebp相同的位置1,再进行一次出栈操作,ebp的值变为0,指向位置0;esp上移一格,也指向0。
  21. 第25行
    ret执行一次出栈操作,此时栈内已经无数据了。最后eax是默认的保存返回值的寄存器。

随着程序的进行,堆栈也发生了变化,最后回归初始状态。

《Linux内核设计与实现》读书小结

阅读本书,学会了一些与内核相关的知识。

  1. 使用asm()指令可以嵌入汇编代码。
  2. 分支声明likelyunlikely
  3. 内核中内存不分页,每多用一个字节,物理内存就减少一个字节。
  4. 内核并不能完美地支持浮点数的操作。
  5. 内核中要格外注意竞争条件引发的同步和并发。
  6. 调试bug需要先找到bug,最好能够复现。
  7. 在内核中使用printk函数。可以设定日志级别,<0><1><2><3><4><5><6><7>分别对应不同紧急程度的信息。
  8. oops是内核发出错误信息、寄存器信息、回溯信息的方式。
  9. 原子操作——能够不分隔执行的代码;以及在执行中不能中断否则就是完不成的代码。
  10. 内核调用BUG_ON()标记bug,提供断言并输出信息,调用时会引发oops
  11. Magic SysRq key是调试、挽救即将崩溃的系统所必须的工具。
  12. 探测系统可以使用UID(用户ID)作为选择条件(与进程有关),使用条件变量(与进程无关)或者统计量。还可以进行重复频率限制和次数限制。
  13. 使用数学上的二分法可以更快的找出第一次BUG出现的内核版本。

总结

  • 计算机是怎样工作的?
    采用用冯诺依曼体系结构的计算机,其核心是存储程序计算机。这类计算机由内存、CPU、输入设备、输出设备组成。内存包括程序内存和数据内存,CPU包括运算器、控制器和寄存器。计算机在执行程序之前必须把要执行的相关程序和数据放入内存中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。其工作过程就是不断地取指令和执行指令的过程,最后将计算的结果放入指令指定的存储器地址中。

2018-2019-1 20189215《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. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 在centos命令行下安装软件

    考虑到用linux纯命令行模式时,通常都是用作服务器,所以,一般主要是安装一个php.mysql.apache的集成环境和ftp服务器,在这里用xampp集成包即可解决所有问题,在这里说一下我自己的做 ...

  2. JS-键盘事件之方向键移动元素

    注意三点: 1:事件名称onkeydown. 2:事件加给document,而非window. 3: 把元素的top,left值分别用offsetTop,offsetLeft来设定. <!DOC ...

  3. Android 菜单动态变化【添加或去除】

    <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android: ...

  4. ubuntu 14.04版本更改文件夹背景色为草绿色

    ENV:ubuntu 14.04 在这个版本上使用dconf 工具无法改变文件夹的背景了,下面介绍其他的方法,不需要dconf工具. 第一步:在home目录下创建.themes文件夹 第二步将/usr ...

  5. Linux学习之批量修改文件名

    1. 通过专业的改名命令rename实现 [root@oldboy oldboy]# ll total -rw-r--r-- root root Nov : stu_102999_1_finished ...

  6. ThinkPHP如果表名有下划线需要用Model应该怎么做?

    最近遇到一个问题,在用TP做系统的时候,我建立的表是 “tp_admin_user” 但是要用到的模型是 “AdminUserModel.model.class.php”,应该如何做? 解决方法: & ...

  7. 树链剖分-点的分治(链的点的个数为k的点对数)

    hdu4760 Cube number on a tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 ...

  8. 我的天$删除注册表$安装mysql最后一步不能启动服务的解决办法

    我是照着参考资料一步一步删除的,只是我的Win7 64位的电脑比较犟,硬是要我重启电脑才能成功!强烈建议最好是重启电脑再装! 使用MySQL都有过重装的经历,要是重装MySQL基本都是在最后一步通不过 ...

  9. A Benchmark Comparsion of Monocular Visual-Inertial Odometry Algorithms for Flying Robots论文笔记

    摘要: 本文主要比较单目VIO的算法在飞行机器人上运行的性能,测试使用统一数据集为EuRoC.其中评价指标为:姿态估计精度.每帧处理时间以及CPU和内存负载使用率,同时还有RMSE(运行轨迹与真实轨迹 ...

  10. 用Oracle实现ASH的数据透视图

    11g里面有个很有用的新特性,对数据透视图的支持. 简单而言,它可以实现宽表和窄表之间的转化.举一个例子,有一张表记录了全校所有班级所有学生的成绩(A,B,C,D,E),现在想统计每个班级里每个分数级 ...