存储程序计算机模型

冯诺依曼体系结构

冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有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. 学习笔记:webpack深入与实践(一)

    一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...

  2. 简单使用Mysql-Cluster-7.5搭建数据库集群

    阅读目录 前言 mysql cluster中的几个概念解释 架构图及说明 下载mysql cluster 安装mysql cluster之前 安装配置管理节点 安装配置数据和mysql节点 测试 启动 ...

  3. 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)

    [BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...

  4. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  5. [BZOJ4071][APIO2015]八邻旁之桥

    BZOJ(这题是BZOJ权限题,有权限号的就去看看吧) Luogu(良心洛谷) 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好 ...

  6. Chrome 浏览器各版本下载大全【转载】

    随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...

  7. Oracle数据文件丢失,数据库如何打开或恢复

    (一)如果没有备份只能是删除这个数据文件了,会导致相应的数据丢失.SQL>startup mount--ARCHIVELOG模式命令SQL>Alter database datafile ...

  8. linux下线程的两种封装方式

    在网络编程的时候往往需要对Linux下原生的pthread库中的函数进行封装,使其使用起来更加方便,封装方法一般有两种:面向对象和基于对象,下面将分别介绍这两种方式,最后统一分析这两种方式的优缺点: ...

  9. Several ports (8005, 8080, 8009)被占用

    启动Tomcat服务器报错: Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are alre ...

  10. 为eclipse安装subclipse(SVN插件)

    1.打开eclipse,点击菜单Help->Install New Software 2.进入安装窗体后,点击安装窗体的右侧的Add按钮,然后在弹出的窗体中输入名称:Subclipse 1.12 ...