庖丁解牛Linux内核学习笔记(1)--计算机是如何工作的
存储程序计算机模型
冯诺依曼体系结构
冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有cpu和内存,两者通过总线连接,在cpu内部有一个寄存器叫ip(instruction pointer),即X86型CPU中的指令指针寄存器(相当于ARM型CPU中的程序计数器PC)。ip总是指向内存中的代码段,然后cpu从ip指向的区域取出一条指令,并且执行该指令,然后ip自动加1,指向紧邻的下一条指令,cpu取出该指令并执行,然后ip再自动加1,cpu再执行。。。这样,程序代码存储在内存里,cpu通过ip寄存器依次顺序执行程序代码。这就是硬件角度的冯诺依曼体系结构,目前所有的具有计算功能的计算机都是冯诺依曼体系结构。
从程序员角度说,存储程序计算机可以抽象为下图,其中cpu被抽象为for循环,总是在执行next struction。内存里主要是保存instruction(指令)和data数据,也就是代码区和数据区。工作原理是内存存储指令和数据,cpu逐条解释执行指令。

API和ABI
CPU识别什么样的指令,涉及到API(Application Programming Interface,应用程序编程接口)和ABI(Application Binary Interface应用程序二进制接口),其中API是程序员与计算机的接口界面,ABI是程序与CPU的接口界面,这个接口界面涉及到3个方面的内容:1)汇编指令编码 2)指令使用过程中使用到的寄存器3)大多指令可以访问内存。其中在x86机器上,cpu的执行的每条指令都存放在eip(32位机的指令寄存器),eip是自增的,通过eip自增可实现cpu顺序执行指令,而eip也是可以被jmp(跳转指令)、ret、call等指令修改的,从而实现cpu跳转执行指令。
x86汇编基础
x86 CPU中的寄存器
x86 cpu中的寄存器有32位、16位、8位的,16位的寄存器叫做AX、BX、CX、DX、BP、SI、DI、SP等,32位寄存器是将16位的进行扩展,然后在寄存器命名时添加E,比如16位寄存器AX扩展为32位命名为EAX,寄存器分为通用寄存器和专用寄存器,具体用途如下:

段寄存器属于专用寄存器:

在段寄存器中代码段和堆栈段使用率较高,因为指令存储在代码段,CPU在取指令时使用cs:eip来准确定位一个指令,另外每一个进程都有自己的堆栈,所以代码段和堆栈段使用频繁一些。除了上述寄存器还需要了解的是一个标志寄存器EFLAGS,该寄存器标识当前处理器处于什么状态。
当前主流的机器是x86_64位机,在核心机制上x86_64和x86差别不大,只是寄存器从32位扩展为64位,命名的时候在寄存器名称前面加R:RAX、RBX等等,状态寄存器命名为RFLAGS等。
x86汇编指令和寻址方式
比较常用的汇编指令有mov指令、push、pop指令、call指令和ret指令。其中mov指令是将第一个操作数数据存入第二个操作数中。根据不同的寻址方式数据来源和存储位置均可能为寄存器、存储器等。语法中%表示寄存器,$表示立即数,()表示取内存中的数据,*表示程序员不能直接修改eip,可使用call和ret修改。

push、pop指令是入堆栈和出堆栈的指令,具体可参考Push, Pop, call, leave 和 Ret 指令图解中的图解~call指令和ret指令是一一对应的,一个是保存eip寄存器的值入栈,然后将子函数的地址写入eip,ret是将保存入堆栈的eip的值恢复回去。
堆栈的概念
堆和栈是数据结构,需要注意的是,进程在内存里的结构如下图:

上图中的堆栈准确的说应该叫做堆区和栈区,其中箭头是指各个区域的增长方向。具体堆和栈的区别可参考堆和栈的区别
总结
存储程序计算机模型相关知识、CPU中的寄存器这两方面内容在《计算机组成原理》课程中详细介绍,汇编指令以及寻址方式会在《嵌入式系统设计》课程里介绍,寻址方式在计算机组成原理中也会介绍。
庖丁解牛Linux内核学习笔记(1)--计算机是如何工作的的更多相关文章
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- 《Linux内核分析》 之 计算机是如何工作的
[李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...
- Linux内核学习笔记之seq_file接口创建可读写proc文件
转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代 ...
- Linux内核学习笔记
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档 [力荐] 5. ...
- 20135316王剑桥Linux内核学习笔记第三周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...
- 20135316王剑桥Linux内核学习笔记第四周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...
随机推荐
- Django学习-21-表关系参数
一对多关系 ForeignKey(ForeignObject) # ForeignObject(RelatedField) to, # 要进行关联的表名 to_field=None, # 要关联的表中 ...
- gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot
主要步骤 ggplot2 数据处理成矩阵形式,给行名列名 hclust聚类,改变矩阵行列顺序为聚类后的顺序 melt数据,处理成ggplot2能够直接处理的数据结构,并加上列名 ggplot_tile ...
- spring配置datasource三种方式及具体信息
1.使用org.springframework.jdbc.datasource.DriverManagerDataSource说明:DriverManagerDataSource建立连接是只要有连接就 ...
- ListView 无 DataSource 依然用 DataPager 翻页
ListView 有 DataSource 使用 DataPager 翻页ListView 无 DataSource 使用 DataPager 翻页问题描述点击两次才能翻页返回上一页,内容为空解决方法 ...
- js拖拽分析
js拖拽分析 思路 1.三个鼠标事件,mousedown,mousemove,mouseup 2.可移动性absolute 3.边界限制 得到鼠标点击处和div边界的距离,然后得出top 和 left ...
- mysql中的union用法以及子查询综合应用
union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集. 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1.能否从2张表查询再uni ...
- ssm整合快速入门程序(三)之Data类型转换器
今天就写写springmvc配置Data类型转换器 首先在创建一个转换器的包cn.my.ssm.controller.converter,创建一个CustomDateConverter类实现Conve ...
- 2018java平均工资,想转行学java的快点上车
很多人选择工作的原因很简单:要么有钱,要么自己开心,当然绝大多数人是既没有钱也不开心...(现实就是这么残酷).哪有钱多事少的活,请告诉我,我第一个去!!我想大部分人对java充满好奇的一个原因就是钱 ...
- error:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
问题:调用的方法在一个接口类中,但我并没有注入那个被调用的类 解决:在UserEntity前加上@Autowired @Controller public class MainController { ...
- Android中Activity.this,getApplicationContext(),getBaseContext()和this详解
转自:http://android.tgbus.com/Android/tutorial/201103/346236.shtml 在使用Android上下文参数的时候经常分不清Activity.thi ...