《Linux内核原理与分析》第二周作业


一.上周问题总结:

  • 未能及时整理笔记
  • Linux还需要多用
  • markdown格式不熟练
  • 发布博客时间超过规定期限

二.本周学习内容:

《庖丁解牛Linux内核分析》第一章

2.1 汇编语言的学习与实践

汇编语言, 即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令,比如:用“ADD”代表数字逻辑上的加减,“ MOV”代表数据传递等等,通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的bug修复以及运营维护都变得更加简单方便。

在实验楼配套实验1中,我们使用vim编辑器编辑main.c程序,代码如下:

  1. int g(int x)
  2. {
  3. return x + 3;
  4. }
  5. int f(int x)
  6. {
  7. return g(x);
  8. }
  9. int main(void)
  10. {
  11. return f(8) + 1;
  12. }

在“实验楼”的虚拟机环境下粘贴代码并保存:

编译main.c代码文件,查看程序返回值,再将其编译成以“.s”作为扩展名的汇编代码文件,代码如下:

  1. #编译C语言代码文件
  2. gcc main.c
  3. #执行a.out可执行文件
  4. ./a.out
  5. #输出程序返回值
  6. echo $?
  7. #将c语言程序编译为main.s汇编文件
  8. gcc S o main.s main.c -m32
  9. #用vi方式打开汇编文件
  10. vi main.s

具体效果如下:

打开后的源码非常繁冗且复杂:

  1. #在命令模式下取除"."开头的辅助信息
  2. g/\.s*/d

简化后的清爽代码如下:

2.2 云班课视频《计算机是如何工作》

这部分课程主要涉及到了冯诺依曼体系结构,或称为存储程序计算机、从硬件角度和程序员的角度对计算机中内存与CPU之间关系的理解、API——程序与计算机的接口界面、ABI——程序与CPU的接口界面、16位和32位以及64位的X86体系结构的寄存器,其中印象最深的是堆栈指针、段寄存器和EIP等。

  • 通用寄存器

    EAX:累加器

    EBX:基地址寄存器

    ECX:计数寄存器

    EDX:数据寄存器

    EBP:堆栈基址针

    ESI、EDI:变址寄存器

    ESP:堆栈顶指针
  • 段寄存器

    CS:代码段寄存器。

    DS:数据段寄存器。

    ES:附加段寄存器。

    SS:堆栈段寄存器。

    FS:附加段寄存器。

    GS:附加段寄存器。
  • mov指令及寻址方式,其中l指32位,b指8位,w指16位,q指64位,如下表展示:
指令 相当于 寻址方式
movl %eax %edx edx=eax 寄存器寻址,以%开头的寄存器标识符
movl $0x123 %edx edx=0x123 立即寻址,立即数以$开头的数值
movl $0x123 %edx edx=*(int32_t)0x123 直接寻址,直接访问一个指定的内存地址的数据
movl (%ebx)%edx edx=(int32_t)ebx 间接寻址,将寄存器的值作为一个内存地址来访问内存
movl 4(%ebx)%edx edx=(int32_t)(ebx+4) 变址寻址,在间接寻址之时改变寄存器的数值

三.总结与疑难

本次Linux学习主要学习了计算机冯·诺依曼体系结构、计算机CPU工作原理以及汇编语言执行过程中堆栈的变化情况,了解到寄存器的分类,以及寄存器的用处.学习了一些底层的调用。学会了如何将C语言转化为汇编语言。

QUSTION:

  • 对于堆栈指针,在本科数据结构课程的时候已经有过相关的编程与实践,但是却没有真正在汇编中进行过相关的操作,关于汇编代码的工作栈分析看得还不透彻
  • 工作栈变化状态图因时间原因还未完成
  • 按照课本步骤,在保存并退出文本编辑器时候,按“shift”+“:”,并不能进入命令模式。后询问同学,发现需要先按esc退出编辑模式

四.下周计划安排

  • [ ] Linux还要多用,下周得配置好电脑环境与虚拟机,摆脱实验楼
  • [ ] 完成书本上的课后习题
  • [ ] 补完汇编代码的工作栈分析图

2019 年 09月 22日

2019-2020-1 20199329《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. Apache本地服务器搭建(Mac版)

    由于Mac自带apache服务器,所以无需下载,apache默认处于开启状态. 可以在浏览器输入localhost,显示It works!,代表目前处于开启状态,默认文件目录为/Library/Web ...

  2. 写给程序员的机器学习入门 (二) - pytorch 与矩阵计算入门

    pytorch 简介 pytorch 是目前世界上最流行的两个机器学习框架的其中之一,与 tensoflow 并峙双雄.它提供了很多方便的功能,例如根据损失自动微分计算应该怎样调整参数,提供了一系列的 ...

  3. Spring 中使用 WebSocket 笔记

    编写 WebSocket 消息处理类,比较简单的方式就是直接继承AbstractWebSocketHandler,并覆写其中的处理方法,下面为一个简单的 demo public class WebSo ...

  4. laravel使用创建的request作为表单验证类

    1.使用命令行工具创建request php artisan make request:validateLoginRequest 2.创建后进入app/Http/Requests目录下找到创建的文件 ...

  5. Nginx-高性能的反向代理服务器

    Nginx Nginx作为一款反向代理服务器,现在大多数网站都有使用,自己在项目中几乎都有用到,自己的网站也使用到了它. 了解Nginx 上面图可以直观的看出Nginx的用处,可以将请求转发至Web服 ...

  6. flask-类视图

    flask-类视图 标准类视图 from flask import Flask, render_template, views, jsonify app = Flask(__name__) class ...

  7. 【numpy】新版本中numpy(numpy>1.17.0)中的random模块

    numpy是Python中经常要使用的一个库,而其中的random模块经常用来生成一些数组,本文接下来将介绍numpy中random模块的一些使用方法. 首先查看numpy的版本: import nu ...

  8. 自动生成四则运算题目(C语言)

    Github项目地址:https://github.com/huihuigo/expgenerator 合作者:马文辉(3118005015).卢力衔(3118005013) 项目简介 1题目:实现一 ...

  9. 页面DIV弹出层 JS原生脚本

    <script type="text/javascript"> /*         * 弹出DIV层         */ function showDiv() { ...

  10. 【硬核】使用替罪羊树实现KD-Tree的增删改查

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习的第16篇文章,我们来继续上周KD-Tree的话题. 如果有没有看过上篇文章或者是最新关注的小伙伴,可以点击一下下方的传送门: ...