计算机是如何工作的---linux内核学习笔记(一)

---恢复内容开始---

内容一:实验报告相关说明。

真实姓名 谢润帮

原创作品转载请注明出处 

所学课程:《Linux内核分析》MOOC课程  

链接:http://mooc.study.163.com/course/USTC-1000029000

虚拟实验室实验截图

内容二:汇编代码的工作过程中堆栈的变化分析

分析分两部分:(堆栈地址的标号没有对齐,请谅解)

第一部分是堆栈变换图。

第二部分是变换图的说明。

第一部分 图解

第二部分 说明

一:

程序从main函数开始执行,此时假设ESP,EBP两个指针均指向位置0 ,表示堆栈为空。如图(1)

二:

执行语句 18,19

pushl         %ebp

movl          %esp,%ebp

EBP,ESP的变化如图(2)所示,均指向位置1。位置0到位置1有4个字节大小的空间,用来存储 EBP寄存器内之前的内容。

三:

执行语句 20,21

subl    $4, %esp          //esp的值减4相当于esp指向位置2

movl   $90, (%esp)

如图(3)所示,EBP,ESP分别指向位置1和位置2。寄存器EAX的值为90 。

四:

执行语句 22 ,call f 语句等价于

pushl  %eip        // 此时eip的为下一条指令(第23条指令)用 eip(23)表示

movl   函数f的地址 ,  %eip

如图(4)所示,EBP,ESP分别指向位置1和位置3。 eip指向第9行的指令

五:

执行语句 9,10 ,11,12,13

pushl         %ebp

movl          %esp, %ebp

subl           $4,%esp

movl          8(%ebp), %eax

movl          %eax, (%esp)

如图(5)所示,EBP,ESP分别指向位置4和位置5。%eax的值为 *(8+ ebp),等于90 。红色方框所示。

五:

执行语句 14,2,3,4,5

call   g

pushl         %ebp

movl          %esp, %ebp

movl          8(%ebp), %eax

如图(6)所示,EBP,ESP均指向位置7。

%eax的值为 1014+90 = 1104 这个值可以保存下来。

六:

执行语句6  popl          %ebp,如图(7)所示,分别指向位置4和位置6

七:

执行语句7  ret  等价于popl %eip ,程序下一条执行的指令为语句15. 如图(8)所示,分别指向位置4和位置5 。

八:

执行语句15 ,leave 语句等价于

movl          %ebp,%esp

popl          %ebp

相当于撤销函数f所使用的堆栈

如图(9)所示,

执行movl      %ebp, %esp  EBP,ESP均指向位置4。

执行popl                %ebp EBP,ESP分别指向位置1和位置3。

九:

执行语句16  ret

如图(10)所示,EBP,ESP分别指向位置1和位置2。程序下一条执行的指令为语句23。

十:

执行语句23,24

addl $90, %eax

leave

如图(11)所示,EBP,ESP均执行0。此时堆栈为空。程序运行结果保存在EAX寄存器中。其值为eax+90 = 1104 + 90=1194

内容三:小结

1:计算机读取的下一条指令总是存储在EIP中。

2:程序是从main函数开始执行。

3:当程序调用一个新的函数时,是通过CALL指令来实现的。CALL指令做了两件事,第一件事是将程序要执行的下一条指令(即EIP的值)存入堆栈中。第二件事是将EIP的值修改为该函数的地址。从而开始执行被调用的函数。

4:调用被调函数时,总会想在堆栈区创立一个新的堆栈供函数使用。函数执行完毕后,会将其销毁。所以函数中的临时变量不起作用了。

时间: 2024-08-22 21:40:30

计算机是如何工作的---linux内核学习笔记(一)的相关文章

可执行程序的装载和启动---linux内核学习笔记(七)

内容一:实验报告相关说明 真实姓名 谢润帮 原创作品转载请注明出处  所学课程:<Linux内核分析>MOOC课程   链接:http://mooc.study.163.com/course/USTC-1000029000 内容二:可执行文件的创建(自己本身对这块不熟,是通过查资料来学习的,篇幅有点多) 2.1 预处理阶段 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白字符. 其中预处理指令主要包括以下四个方面: 2

linux内核学习笔记-2.进程管理

部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.进程 进程是正在执行的程序代码的实时结果,包含打开的文件.挂起的信号等.线程是进程中的活动的对象,内核调度的对象是线程.在Linux内核对线程与进程并不加以区分,线程只不过是一种特殊的进程. 2.进程描述符 内核把进程的信息存放在task list的双向循环链表中,链表中的每一项都是类型为task_struct.成为进程描述符的的结构,包含一个具体进程的所有信息

Linux内核学习笔记

1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5.Linux内核之旅 6.时钟管理系统和中断子系统 7. http://www.cnblogs.com/bastard/category/412387.html

Linux内核的系统调用---linux内核学习笔记(四)

内容一:实验报告相关说明. 真实姓名 谢润帮 原创作品转载请注明出处  所学课程:<Linux内核分析>MOOC课程   链接:http://mooc.study.163.com/course/USTC-1000029000 代码来源于孟宁老师的课件 虚拟实验室实验截图 实验结果图 实验代码截图

分析进程创建的过程---linux内核学习笔记(六)

内容一:实验报告相关说明. 真实姓名 谢润帮 原创作品转载请注明出处  所学课程:<Linux内核分析>MOOC课程   链接:http://mooc.study.163.com/course/USTC-1000029000

Linux内核学习笔记——内核内存管理方式

一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页大小8KB 内核用相应的数据结构表示系统中的每个物理页: <linux/mm_types.h> struct page {} 内核通过这样的数据结构管理系统中所有的页,因此内核判断一个页是否空闲,谁有拥有这个页 ,拥有者可能是:用户空间进程.动态分配的内核数据.静态内核代码.页高速缓存…… 系统中

Linux内核学习笔记——VFS

概念: ①硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接.即硬链接就是同一个文件使用了多个别名.硬链接可由命令 link 或 ln 创建. 其特性: 文件有相同的 inode 及 data block: 只能对已存在的文件进行创建: 不能交叉文件系统进行硬链接的创建: 不能对目录进行创建,只可对文件创建: 删除一个硬链接文件并不影响其他有相同 inode 号的文件. ②软连接:若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接.软链接就是一个普通文件,只

Linux内核学习总结

李泽源 原创作品 转载请注明出处 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 [Linux内核学习总结] 幸福来得很突然,这门课就快结束了…… 是时候,总结下这段时间的坚持了,也给同样对Linux内核有兴趣的你一个指南. 在这门课的学习过程中,按照老师的要求,每次课后都写一篇博文,这是一个很好的学习方式.每当写这些文章的时候,总是要多看几遍视频,再查查相关的资料,才能勉强凑成一个完整的文档:同时也把自己学

Linux内核学习-进程

先说几个术语: 一.Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的.重点:代码段.数据段.堆栈段,这是一个概念堆.栈.全局区.常量区,这是另一个概念1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作--它是不可写的.代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分