Linux内核分析——第一周学习笔记20135308

时间:2022-12-25 23:46:41

第一周 计算机是如何工作的

第一节 存储程序计算机工作模型

1、冯·诺依曼结构模型:冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

2、CPU可以抽象成一个for循环,总是从内存中执行下一条指令。

  • 内存:保存指令数据
  • CPU:解释执行指令、数据

内存与CPU通过总线连接。

API:应用程序编程接口

ABI:二进制(指令编码)接口

Linux内核分析——第一周学习笔记20135308

例如:32位计算机X86,EIP指向内存的某条指令

1、自+1,即自动加到下一条指令

2、可被其他指令修改,如CALL,RET,JMP等。

第二节 X86汇编基础

一、X86 CPU的寄存器

Linux内核分析——第一周学习笔记20135308

如上图,是一个32位寄存器。

16位寄存器:AX,BX,CX,DX,BP,SI,DI,SP等

32位寄存器:EAX累加寄存器,EBX基址寄存器,ECX技术寄存器等 前面加上E的均为32位寄存器。

Linux内核分析——第一周学习笔记20135308

64位寄存器与32位寄存器区别不大,前面有R的为64位寄存器。

Linux内核分析——第一周学习笔记20135308

二、mov指令及几种内存寻址方式

Linux内核分析——第一周学习笔记20135308

1、movl:l为32位

  • 寄存器寻址%eax,%edx

即操作寄存器,与内存无关,相当于eax=edx

  • 立即寻址$0x123,%edx

123这个16进制数值放进寄存器edx中($表示立即数)

  • 直接寻址0x123,%edx

123这个地址指向寄存器edx(没有$表示地址)

  • 间接寻址(%ebx),%edx

(%ebx)表示ebx这个寄存器存的值为内存地址

  • 变值寻址4(%ebx),%edx

在间接寻址的基础上加上4

2、movb:b为8位

3、movw:w为16位

注意:

AT&T汇编格式与Intel汇编格式略有不同

Linux内核使用的是AT&T汇编格式

三、几个重要的汇编指令:push、pop、call、ret

Linux内核分析——第一周学习笔记20135308

1、pushl %eax

把eax压栈到堆栈栈底

即首先把esp减4

esp表示堆栈栈顶

ebp表示堆栈基址

2、popl %eax

把eax从堆栈栈顶取32位,放在寄存器eax中

即首先把栈顶esp的数值放在eax中,再把栈顶加4

3、call 0x12345

调用该地址

即将当前的eip(当前CPU执行命令的指针)压栈,赋给eip一个新值(CPU下一条执行的指令)

4、ret

即将call时保存的eip还原到eip寄存器,return call之前的那条指令

eip(*)这个*指程序员不能直接修改eip

四、分析一段汇编代码

1、

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

2、

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

3、

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

第三节 将C代码编译成汇编代码

实验:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

首先,通过vi编写luchang5308.c文件

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

通过gcc –S –o main.s main.c -m32命令将c文件编译成汇编代码

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

删除以.开头的说明语句

Linux内核分析——第一周学习笔记20135308

P.S. enter指令与leave指令

Linux内核分析——第一周学习笔记20135308

P.S. 函数的返回值默认使用eax寄存器存储返回给上一级函数

过程分析:

Linux内核分析——第一周学习笔记20135308

把ebp的值0压入栈,esp减4,指向下一个位置

Linux内核分析——第一周学习笔记20135308Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

esp的值赋给ebp,这样,ebp也指向标号1的位置

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

esp向下移动一个标号,指向2

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

将立即数6放在esp所指的位置

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

call命令包含

1.push eip

2.mov f eip

执行call命令,eip指向下一条指令,即23行代码,将eip压栈,eip指向f函数,指令从f函数开始执行,esp指向标号3的位置。

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

将ebp压栈,esp指向标号为4的位置

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

将esp的值赋给ebp

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

esp指向下一个位置,即标号为5的地方

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

ebp变址寻址8,即ebp从标号为4的地方,向上移动2个位置,内容为6,所以eax=6

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

把eax放在esp的位置,即5的位置

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

push eip

调用g函数,esp标号向下移动一位,标号为6的位置,eip15压栈,此时eip指向g函数

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

将ebp的值压栈

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

把ebp指向esp所在的位置

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

ebp上两个位置的值赋给eax,eax=6

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

eax加4,eax=10

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

弹栈,把ebp(4)放回ebp,即让ebp又指向了4的位置。同时,esp加4,指向6。

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

ret即popl %eip,此时eip所存为15,esp指向标号5的位置,同时eip指向了15

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

ebp指向4,esp也指向4,ebp弹栈,ebp指向1,esp加4,指向3

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

popl %eip eip为23,esp加4,指向2

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

eax加3,eax=13

Linux内核分析——第一周学习笔记20135308

Linux内核分析——第一周学习笔记20135308

movl %ebp,%esp

popl %ebp

首先,ebp,esp均指向了1

Linux内核分析——第一周学习笔记20135308

然后,ebp指向0,esp减4,指向0,回到了main函数最初的状态

Linux内核分析——第一周学习笔记20135308

该程序堆栈执行完毕

总结

对“计算机是如何工作的”理解

1、冯·诺依曼提出程序存储的思想,程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。

2、CPU可以抽象成一个for循环,总是从内存中执行下一条指令。内存负责保存指令数据,CPU负责解释执行指令、数据。内存与CPU通过总线连接。

3、通过使用高级语言,应用汇编语言,机器语言的编译,即计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。最终将指令的结果放入寄存器中。

攥写人:芦畅 学号:20135308

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

Linux内核分析——第一周学习笔记20135308的更多相关文章

  1. linux内核分析第一周学习笔记

    linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  2. 20135320赵瀚青LINUX内核分析第一周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.概述 第一周的学习内容主 ...

  3. Linux内核分析——第一周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...

  4. Linux内核分析——第二周学习笔记20135308

    第二周 操作系统是如何工作的 第一节 函数调用堆栈 存储程序计算机:是所有计算机基础的框架 堆栈:计算机中基础的部分,在计算机只有机器语言.汇编语言时,就有了堆栈.堆栈机制是高级语言可以运行的基础. ...

  5. LINUX内核分析第一周学习总结——计算机是如何工作的

    LINUX内核分析第一周学习总结——计算机是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  6. Linux内核分析第二周学习笔记

    linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  7. Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程

    Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...

  8. 三20135320赵瀚青LINUX内核分析第二周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机的三个法宝 存储程 ...

  9. Linux内核分析第一周学习总结:计算机是如何工作的?

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.冯诺依曼体系 ...

随机推荐

  1. spark 你要喧宾夺主么?好好干。

    嗯嗯,hadoop EcoSystem.

  2. java执行效率低,但效率就低吗?

    很多没用过java或者没怎么用过java的程序员都会说java执行效率低,这种言论时不时的在影响着我这个初级的java开发者. java执行效率低因如下几点导致(和C++比较): 1,java不允许内 ...

  3. Binder相关

    Binder分析 需了解C/S还有管理这些的ServiceManager. 简单来讲你(client)有个包裹(parcel)让快递员(proxy)送到公司(server),   公司(server) ...

  4. hdu 1423 最长公共递增子序列

    这题一开始把我给坑了,我还没知道LCIS的算法,然后就慢慢搞吧,幸运的是还真写出来了,只不过麻烦了一点. 我是将该题转换为多条线段相交,然后找出最多多少条不相交,并且其数值死递增的. 代码如下: #i ...

  5. ADO&period;Net对Oracle数据库的操作【转载】

    一 ADO.Net简介 访问数据库的技术有许多,常见的有一下几种:开放数据库互联(ODBC).数据访问对象(DAO).远程数据对象 (RDO). ActiveX数据对象(ADO).我们今天主要要学习A ...

  6. 集群&sol;分布式环境下5种session处理策略

    转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...

  7. 关于装双系统Ubantu16&period;04&plus;Win10引导问题

    1.装完双系统,必定会遇到时间不一致的问题解决问题如下 sudo apt-get install ntpdate sudo ntpdate time.windows.com sudo hwclock ...

  8. iOS开发的10个知识点

    1.关于关键字volatile 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这 ...

  9. android TextView 垂直自动滚动字幕实现

    参考网上一些做法然后进行了修改, 首先继承TextView /** * VerticalScrollTextView.java * 版权所有(C) 2013 * 创建者:cuiran 2013-12- ...

  10. HDU 6433&lpar;2的n次方 &ast;&ast;&rpar;

    题意是就是求出 2 的 n 次方. 直接求肯定不行,直接将每一位存在一个数组的各个位置即可,这里先解出 2 的 n 次方的位数,再直接模拟每一位乘以 2 即可得到答案. 求解 2 的 n 次方的位数的 ...