《Linux内核分析》课程第一周学习总结

姓名:何伟钦

学号:20135223

( *原创作品转载请注明出处*)

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

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

第一部分:视频教学笔记总结

一、存储程序计算机

冯诺依曼体系结构概念:即具有存储程序计算机的体系结构,大多数拥有计算和存储功能的设备(手机、平板、计算机等)其核心构造均为冯诺依曼体系结构

冯诺依曼体系结构工作模型:

(一)从硬件角度来看

CPU与内存通过总线连接,CPU上的IP(16位CPU叫IP、32位CPU叫EIP、64位CPU叫RAP)总指向内存的某一块区域;IP指向代码段CS;CPU总是执行IP指向的指令,执行完这条指令后,接着执行下一条指令。内存保存指令和数据,CPU执行这些指令

(二)从软件角度来看

API:程序员与计算机的接口界面

ABI:程序与CPU的二进制接口,指令编码,主要是汇编指令,需要熟悉指令中涉及的寄存器布局,大多数指令可以访问内存。

X86中EIP在CPU执行完一条指令之后自动加一条指令,指令长度是不一样的,也可以被其它指令,如CALL,RET,JMP and conditional JMP等修改

二、x86汇编基础

堆栈段寄存器:EBP(堆栈基址寄存器)和ESP(堆栈顶指针寄存器)这两个寄存器比较常用使用于汇编程序

代码段寄存器:CPU实际取指令的时候通过cs:eip来描述

64位CPU与32位在核心机制上差别不大,64位的机器中,寄存器以R开头表示,例如RAX ,RBX

后缀b,w,l,q分别代表8,16,32,64位,立即数是以$开头的十六进制数值

常见汇编指令

寄存器寻址   movl %eax,%edx  -----edx=eax

立即数寻址   movl $0x123,%eax-----%eax=0x123

直接寻址     movl 0x123,%eax -----edx=*(int32_t*)0x123;

变址寻址     movl 4(%ebx),%edx---edx = *(inet_32 *)(ebx+4),(ebx的值加4之后作为一个地址,将其指向的数据赋给%edx

大多数指令都可以直接访问内存地址)

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

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

重要的汇编指令(函数调用堆栈是理解C代码在CPU上执行的关键)

push %eax    相当于 subl $4 ,%esp;

movl %eax ,(%esp)

pop %eax     相当于 movl (%esp),%eax;

addl $4, %esp

call 0x12345 相当于 push %eip(*);

movl $0x12345,%eip(*)

ret               相当于  popl %eip(*)

enter            相当于 push %ebp

movl %esp,%ebp

leave            相当于 movl %ebp,%esp ;

pop %ebp

(补充说明 :ret就是把保存的eip从堆栈中弹出来,从函数调用的下一条指令执行,enter指令相当于在原来的堆栈上再建一个新的空堆栈;leave指令相当于撤销函数调用堆栈;函数调用堆栈是由逻辑上多个堆栈叠加起来的;函数的返回值默认用%eax存储,然后返回给上一级函数)

第二部分:实验与作业

(注:以下实验在本人计算机64位虚拟机上完成,非实验楼)

(1)创建code文件夹 ,使用vi在Linux环境下编写源代码,并运行源代码是否有错误

源代码如图所示:

(2)使用gcc –S –o main.s main.c -m32 命令编译成汇编代码

(3)将以"."开头的行删去,得到干净的汇编代码

分析汇编代码

(1)代码首先从main函数开始 执行,首先建立空栈

(2)pushl   %ebp 相当于 movl %ebp,(%esp);addl $4, %esp

即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)

(3)movl    %esp, %ebp  将栈顶指针%esp指向的地址赋给%ebp

(4)subl    $4, %esp      将%esp向下移动四位字节(移动一格)

(5)movl    $15, (%esp)    将立即数15放在%esp指向的地址

(6)call    f   调用f函数执行,将call f 后面的那条语句addl $5, %eax(这里用eip 23)压栈,此时eip指向f函数,程序执行f函数,建立f函数堆栈结构

(7)pushl   %ebp  相当于 movl %ebp,(%esp);addl $4, %esp

即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)

(8)movl    %esp, %ebp  将栈顶指针%esp指向的地址赋给%ebp

(9)subl    $4, %esp      将%esp向下移动四位字节(移动一格)

(10)movl    8(%ebp), %eax

movl    %eax, (%esp)  将此时%ebp地址加上8位字节所指向地址的存储的值赋给%eax,再将%eax的值(立即数15)放在%esp指定的位置

(11)call    g    调用g函数执行,将call g 后面的那条指令leave(这里用eip 15表示)压栈,此时eip指向g函数,程序执行g函数,建立g函数栈结构

(12)pushl   %ebp      将%ebp压栈     相当于 movl %ebp,(%esp);addl $4, %esp

即是将%ebp放在%esp指向的地址,%esp向下移动四位字节(移动一格)

(13)movl    %esp, %ebp  将栈顶指针%esp指向的地址赋给%ebp

(14)movl 8(%ebp),%eax,将此时%ebp地址加上8位字节所指向地址的存储的值赋给%eax(此时eax=15),%esp不变

(15)addl $10,%eax,将%eax的值加上10,即此时eax=15+10=25  ,%esp不变

(16)popl %ebp,将%ebp3弹栈,%esp增4  相当于 movl (%esp),%ebp;addl $4, %esp

(17)ret          相当于popl %eip(*)    等同于于movl (%esp),%eip;addl $4, %esp

(18)f函数的leave      撤销函数堆栈  movl %ebp,%esp ;pop %ebp   将ebp指向地址赋值给esp  ,ebp指向栈的ebp 2,esp加4,向上缩进一个栈单元

(19)ret  相当于popl %eip(*)

(20)addl $5,%eax,将eax加5(此时eax=25+5=30)

(21)main函数的leave操作,相当于 movl %ebp,%esp ;pop %ebp

最后结果返回值%eax=30

第三部分:学习总结

 

(一)堆栈结构:

1.堆栈生长方向是地址递减的方向。

2. 函数调用时参数的压栈顺序是逆序的,最后一个参数先压栈,第一个参数最后压栈,即堆栈遵循”先进后出”的原则。

3. 进入函数后,会对原有堆栈结构进行重新调整,首先将ebp压栈;然后将ebp指向当前的esp,也就是改变栈底指针,并且还改变了esp栈顶指针的值,就好像从新开辟了新的堆栈结构;接着在新的堆栈上进行函数代码实现;最后恢复原先栈结构。

4. call指令会自动将返回地址(eip)压栈,ret指令也会自动将返回地址(eip)出栈。

5.eax用于存放返回值

(二)学习认识:

按照冯·诺依曼存储程序的原理,计算机在执行程序时须先将要执行的相关程序和数据放入内存储器中,在执行程序时CPU根据当前程序指针寄存器的内容取出指令并执行指令,再按地址把结果送到内存中去。然后再取出下一条指令并执行,如此循环下去直到程序结束指令时才停止执行。其工作过程就是不断地取指令和执行指令的过程,最后将计算的结果放入指令指定的存储器地址中,这就是计算工作的基本原理。虽然这样看起来计算机是“笨拙”的,但无论是多大多复杂的程序都需要这种笨拙的方法。

时间: 2024-10-11 04:09:41

《Linux内核分析》课程第一周学习总结的相关文章

《Linux内核分析》第一周学习小结 计算机是如何工作的?

<Linux内核分析>第一周.计算机是如何工作的? 20135204 郝智宇  一.存储程序计算机工作模型 1.      冯诺依曼体系结构: 数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 内存保存指令和数据,CPU负责解释和执行这些指令. 2.    API: 程序员与计算机的接口界面. 3.    EIP: CALL  RET  IMP   二.X86汇编基础 1.      X86CPU的寄存器 E开头32位,R开头64位.   堆栈是计算机中非常基础性的东西. 2.    

LINUX内核分析第七周学习总结——可执行程序的装载

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 2.目标文件的格式ELF 3.静态链接的ELF可执行文件和进程的地址空间 (二)可执行程序.共享库和动态加载 1.装载可执行程序之前的工作 2.装载时动态链接和运行时动态链接应用举例 (三)

LINUX内核分析第六周学习总结——进程的描述和进程的创建

LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 进程的描述 进程描述符task_struct数据结构(一) 进程描述符task_struct数据结构(二) 进程的创建 进程的创建概览及fork一个进程的用户态代码 理解进程创建过程复杂代码的方法 浏览进程创建过程相关的关键代码 创建的新进程是从哪里开始执行的

LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 Linux中进程调度的基本概念与相关知识 schedule函数如何实现进程调度 Linux进程的执行过程(一般情况与特殊情况) 宏观描述Linux系统执行 二.学习笔记 (一)进程切换的关键代码switch_to分析 进程进度与进程调度的时机分析 1.

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 回顾: [计算机三个法宝] 1)存储程序计算机 2)函数调用堆栈 3)中断 [操作系统两把宝剑] 1)中断上下文的切换:保存现场和恢复现场 2)进程上下文的切换 一.使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开

《linux内核分析》第一周(2.22~2.28)

潘恒   原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的? 本节课主要通过了解分析汇编代码来理解计算机工作原理 存储程序计算机 冯诺依曼体系结构:具有存储程序的计算机体系结构:是目前大多数拥有计算和存储功能的设备的核心. 硬件角度:CPU与内存通过主线连接,CPU上的IP(可能是16.32.64位)总指向内存的某一块区域:IP指向的CS(代码段)也在内存中:CPU总

《Linux内核分析》第一周笔记 计算机是如何工作的

一.计算机是如何工作的? 1.存储程序计算机工作模型 1)冯诺依曼体系结构 学习研究计算机的基本概念.就是指存储程序计算机.所有的有计算功能的电子设备小到计算器,大到超级计算机核心部分都可以用这种体系结构来描述. 2)存储程序计算机工作模型 从硬件(计算机的主板):逻辑上抽象为,CPU与内存之间通过总线连接,CPU内部有一个关键寄存器IP(Instruction Pointer)(在16位CPU中叫IP,在32位CPU中叫EIP,在64位CPU中叫RIP),总是指向内存的某块区域,指向内存中的代

20135201李辰希《Linux内核分析》第一周 计算机是如何工作的?

计算机是如何工作的 1冯诺依曼体系结构:即具有存储程序的计算机体系结构 目前大多数拥有计算和存储功能的设备(智能手机.平板.计算机等)其核心构造均为冯诺依曼体系结构 从硬件来看:CPU与内存通过主线连接,CPU上的IP(可能是16.32.64位)总指向内存的某一块区域:IP指向的CS(代码段)也在内存中:CPU总是执行IP指向的指令. 从软件来看:API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口 2. x86(32位)的寄存器中,低16位作为16

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

第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 a.out可执行文件 预处理负责把include的文件包含进来及宏替换工作. 2.目标文件的格式ELF (1)常见的ELF格式文件: (2)ABI——应用程序二进制接口 在目标文件中,他已经是二进制兼容,即适应二进制指令. (3)ELF中三种目标文件: 一个可重定位(relocatable)文件保存着代码和

LINUX内核分析第七周学习总结:可执行程序的装载

一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exegcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤.预处理 => 编译 => 汇编 => 链接预处理:编译器将C源代码中包含的头文件编译进来和执行宏替换等工作.gcc -E hello.c -o hello.i编译:gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言.gcc –S hello.i –o