存储程序计算机模型

冯诺依曼体系结构

冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有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)--计算机是如何工作的的更多相关文章

  1. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

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

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  3. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  4. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  5. 《Linux内核分析》 之 计算机是如何工作的

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  6. Linux内核学习笔记之seq_file接口创建可读写proc文件

    转自:http://blog.csdn.net/mumufan05/article/details/45803219 学习笔记与个人理解,如有错误,欢迎指正. 温馨提示:建议跟着注释中的编号顺序阅读代 ...

  7. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  8. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

  9. 20135316王剑桥Linux内核学习笔记第四周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...

随机推荐

  1. ACM1007

    题目:DNA序列排序 DNA序列由一序列的大写英文字母表示,如ABCDEF.紊乱程度表示组成DNA序列的字母按照由小到大的顺序进行排列程度,如ABC的紊乱程度比ACB小,因为它字母都是由小到大排序的. ...

  2. html基础加强2

    1.表单元素 表单元素一定要提交在form标签里面 2.id和name 所有元素都有ID,但只有表单元素才有name ID不可以重复,name可以重复 name属性的目的时可以将数据提交到服务器.id ...

  3. VS2010插件

    Highlight all occurrences of selected words

  4. C#中string类型是值类型还是引用类型?

    .Net框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串. string类型(引用类型) 名称 CT ...

  5. Vue-开发工具的安装

    1. github官网下载vue工具:https://github.com/vuejs/vue-devtools.并解压 2.  在有package.json的文件夹下,按住shift右键,选择&qu ...

  6. MSIL实用指南-IL版hello world

    我们学习编程开始时,一般用输出"hello world"的一段程序. C#版的"hello world"是 using System; namespace L0 ...

  7. Django---第三方

    第三方: 3.富文本编辑器:此处以tinymce为例 使用编辑器的显示效果为: 1.下载安装 在网站pypi网站搜索并下载"django-tinymce-2.4.0" 解压 tar ...

  8. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...

  9. oled

    gnd.vcc.clk.miso.rst.mosi.cs

  10. SQL添加表字段

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smalli ...