博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018-2019-1 20189221《Linux内核原理与分析》第二周作业
阅读量:5139 次
发布时间:2019-06-13

本文共 1866 字,大约阅读时间需要 6 分钟。

读书报告


《》

第 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:附加段寄存器,存放附加数据段的段基址或段选择字

《》第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

过程如图:

1506284-20181018124526022-2093289114.png

  • 打开main.s,删除辅助信息,查看汇编代码
    使用g/.s*/d删除所有以“.”打头的字符
    结果如图:
    1506284-20181018124749191-2038196579.png

实验分析

汇编代码工作过程

从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语言结合起来,真正了解很多时候的代码优化原理;

入栈出栈:

  • 复习了堆栈中入栈出栈的步骤
  • 学习栈在程序执行过程的作用,特别是编译之后用汇编语言的执行过程

转载于:https://www.cnblogs.com/gdman/p/9808421.html

你可能感兴趣的文章
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
企业级应用与互联网应用的区别
查看>>
itext jsp页面打印
查看>>
Perl正则表达式匹配
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
网站搭建(一)
查看>>
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>