第一部分:学习MOOC网Linux内核分析的课程。

首先对冯诺依曼体系结构和存储程序计算机工作模型进行了了解,查阅资料,对冯诺依曼体系的特点与课堂上的相结合,真实明白了模型的特点。

在汇编C语言程序时,首先了解了cpu是怎样执行内存中的数据的,cpu会通过调用不同的指令,对计算机上不同位置的数据进行不同的处理,从而实现了各式各样的程序。随后,我查阅相关资料对Cpu的寄存器和指令进行了一个简单的归纳。

首先命令行后最后的字母b,w,l,q分别代表计算机中的8位,16位,32位和64位。

eax 累加器 accumulator

ebx 基地址寄存器base register

ecx 计数寄存器 count register

edx 数据寄存器 data register

ebp 堆栈基指针 base pointer

esi edi 变址寄存器

esp 堆栈顶指针 stack pointer

cs 代码段寄存器 code segment register 值为代码段的段值

ds 数据段寄存器 data segement register 值为数据段的段值

ds 附加段寄存器 extra segment register 值为附加数据段的段值

ss 堆栈段寄存器 stack segment register 值为堆栈段的段值

fs 附加段寄存器 extra segment register 值为附加数据段的段值

gs 附加段寄存器 extra segment register 值为附加数据段的段值 %指的是寄存器标示符

movl %eax,%edx edx=eax; register mode寄存器寻址

movl $0x123,%edx edx=0x123; immediate 立即数寻址

movl 0x123,%edx edx=(int32_t)0x123; direct直接寻址,直接取地址中的数值()里面强制类型转换

movl (%ebx),%edx edx=(int32_t)ebx; indirect 间接寻址

movl 4(%ebx),%edx edx=(int32_t)(ebx+4); displaced 变址寻址

指令分析:

pushl %eax:压栈

subl $4,%esp esp 堆栈栈顶-4增加一个位置,间接寻址把esp放进去

movl%eax,(%esp)

popl %eax

movl(%esp),%eax

addl $4,%esp

call 0x12345 函数调用,调用地址

pushl %eip ()伪指令,不能直接修改,

movl $0x12345,%eip(
)

ret

popl %eip(*)

enter

pushl %ebp

movl %esp,%ebp

leave

movl %ebp,%esp

分析代码:

pushl $8 把立即数放入栈里,esp-4 增加一个位置

movl %esp,%ebp 把堆栈的地址放入基址寄存器

subl $4,$esp esp-4 在增加一个位置

movl $8,(%esp) 把8放入esp中存的地址

pushl $8                 存8
movl %esp,%ebp 同指向
pushl $8 再放8
popl %ebp
基础知识具备后开始在实验楼中实验:
![](http://images2015.cnblogs.com/blog/1028827/201610/1028827-20161002185507005-1402999599.png)

编辑文件为C语言代码如图:



调用gcc -S -o main.s main.c -m32 进行反汇编,得出文件main.s



打开并整理汇编文件得到:





////////////////////////////////////////////

这里是对整理过的汇编代码进行分析;假设从地址为2000的地址快开始,以四个字节来分,依次为1996,1992,1988,1984,1980......

eip ebp esp

main:

1.pushl %ebp 将ebp的此时指向入栈,栈指针减四。 eip=2 ebp=2000 esp=1996 2000入栈,位置1996

2.movl %esp,%ebp;将ebp也指向esp的位置。 eip=3 ebp=1996 esp=1996

3.subl $4,%esp,地址减四,留出一个栈位置。 eip=4 ebp=1996 esp=1992

4.movl $8,(%esp)将8放入此时esp指向的位置。 eip=5 ebp=1996 esp=1992 8入栈,位置1992

5.call f; //pushl %eip()将以前执行的程序下一个进栈,栈顶指针减四 eip=6 ebp=1996 esp=1988 eip=6入栈,位置1988

//movl f,%eip(
)将f程序的入口地址给eip eip=11 ebp=1996 esp=1988

f:11.pushl %ebp;将ebp的值入栈,栈顶指针减四; eip=12 ebp=1996 esp=1984 ebp=1996入栈,位置1984

12.movl %esp,%ebp;ebp指向esp eip=13 ebp=1984 esp=1984

13.subl $4,%esp;esp减四,留出一个位置。 eip=14 ebp=1984 esp=1980

14.movl 8(%ebp),%eax;将8赋值给eax eip=15 ebp=1984 esp=1980 8赋值给eax

15.movl %eax,(%esp)将eax存到esp指向的位置。 eip=16 ebp=1984 esp=1980 8入栈,位置1980

16.call g //pushl %eip()将以前执行的程序下一个进栈,栈顶指针减四eip=17 ebp=1984 esp=1976 eip=17入栈,位置1976

//movl f,%eip(
)将f程序的入口地址给eip eip=21 ebp=1984 esp=1976

g:21.pushl %ebp; eip=22 ebp=1984 esp=1972 ebp=1984入栈,位置1972

22.movl %esp,%ebp; eip=23 ebp=1972 esp=1972

23.movl 8(%ebp),%eax; eip=24 ebp=1972 esp=1972 eax=8

24.addl $3,%eax; eip=25 ebp=1972 esp=1972 eax=8+3=11

25.popl %ebp; eip=26 ebp=1984 esp=1976 1984出栈,位置1976

26.ret; eip=17 ebp=1984 esp=1972 17出栈,位置1980

17.leavl //movl %ebp,%esp eip=18 ebp=1984 esp=1984

//popl %ebp eip=18 ebp=1996 esp=1988

18.ret //popl eip eip=6 ebp=1996 esp=1992

6.addl $1,%eax; eip=7 ebp=1996 esp=1992 eax=11+1=12;

7.leave; //movl %ebp,%esp eip=8 ebp=1996 esp=1996

//popl %ebp eip=8 ebp=2000 esp=2000

8.ret; //popl eip 结束

////////////////////////////////////////////

对比C语言程序与汇编语言,相互比对后对C语言和汇编语言有了清晰的认识。

在此期间,这次实验真正的让我理解了汇编语言的实现原理,也开始对汇编语言的语发有所了解,虽然在试验中遇到不少问题,例如vi在试验楼里能对文件进行编译,但在自己虚拟机里面却不能,但后来查阅资料发现这是权限的问题。

第二部分:读Linux内核设计与实现部分

第一章关于Unix的历史以及Linux和Unix的一些区别做了简单介绍,初步懂得了Linux的产生以及后期的发展历史。

Linux和其他系统的区别以及他的优势所在。

第二章内容中提到获取Liunx内核,参照实验楼中的实验开始逐步尝试下载Linux内核。





因为用的不是实验楼中给出的平台,用的是自己虚拟机中的Linux。所以用 wget httpsL//www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz从Linux官网下载最新内核,下载速度较慢,大概持续20分钟左右。

xz -d linux-3.18.6.tar.xz

tar -xvf linux-3.18.6.tar

解压缩后的界面为:



在编译过程中遇到了这样的问题:



在网上查阅后得知这是由于目前正在运行的内核的版本号比要编译的内核版本高的原因。因为新内核可能有一些选项旧内核不支持。

第十八章介绍的内核调试的一些方法,比较常用的方法有单步调试,日志等级,还有输出信息来调试。再介绍了关于探测系统的一些信息,因为新的内核暂时没有下载,所以没有在Linux尝试,只看了书上介绍的方法和信息。

////////////////////在markdown下面语法的文字的位置有所变化,所以截图出来。

20169207《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. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

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

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

随机推荐

  1. 长时间没有操作putty就会断开连接是怎么回事?

    seconds between keepalives 设置为10就好了, 这个值有什么含义,服务器为了节省资源采取了一些措施,其中一条就是如果检测一个会话(session)几分钟或者几小时没有数据流入 ...

  2. Linux系统安装过程

    一.安装VMware® Workstation 14 Pro,有一些安装时会出现virtual XT的错误,这需要重启电脑进入BIOS,开户虚拟加速开关:有些win8/10会出现虚拟网卡安装失败的情况 ...

  3. 开发中,android手机WIFI无法使用,无SIM卡故障解决

    用eclipse 开发android中,突然出现,android手机WIFI无法使用,无SIM卡故障解决 发现故障后,想办法刷机(没有成功),触点清洁都搞了. 最后恢复出厂设置居然解决了,留资料给同行 ...

  4. django添加装饰器

    引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...

  5. [Python] 代码中有中文注释会报错

    原因 如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明. 解决方法 在第一行或是第二行加入这么一句# -- coding: utf-8 -- ASCII知识普及: ASCII(Ameri ...

  6. [SoapUI] 从上一个测试步骤获取ID list,通过Groovy脚本动态生成 Data Source 供后面的步骤使用

    https://support.smartbear.com/readyapi/docs/testing/data-driven/types/groovy.html 从官网拷贝code到SoapUI里面 ...

  7. Internet

    0x01 URL的解析/反解析/连接 解析 urlparse()--分解URL # -*- coding: UTF-8 -*- from urlparse import urlparse url = ...

  8. 高级设计总监的设计方法论——5W1H需求分析法 KANO模型分析法

    本期开始进入设计方法论的学习,大湿自己也是边学边分享,算是巩固一遍吧: 另外这些理论基本都是交叉结合来应用于工作中,我们学习理论但不要拘泥于理论的框架中,掌握后要灵活运用一点- 这些理论一部分来自于我 ...

  9. Oracle安装配置

    很久没有使用Oracle了,一直做产品使用Mysql,前段时间使用Oracle的一些新经验,占位. 需要整理下....

  10. Ajax在jQuery中的应用 (4)向jsp提交表单数据

    ajax技术带给我们的是良好的用户体验,同时,使用jquery可以简化开发,提高工作效率. 下面就介绍一下大致的开发步骤. 工具/原料 本文中使用的是 jquery-1.3.2.min.js 方法/步 ...