存储程序计算机模型

冯诺依曼体系结构

冯诺依曼体系结构是存储程序计算机,什么叫存储程序计算机?从硬件角度说,假设有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. Trouble HDU - 4334

    Hassan is in trouble. His mathematics teacher has given him a very difficult problem called 5-sum. P ...

  2. Groovy实现原理分析——准备工作

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. flash数据交互

    新随笔 联系 订阅 管理 随笔 - 14  文章 - 5  评论 - 0 安卓中webview读取html,同时嵌入Flex的SWF,交互 安卓activity与html交互很简单,用javascri ...

  4. Codeforces Round #467 (div.2)

    Codeforces Round #467 (div.2) 我才不会打这种比赛呢 (其实本来打算打的) 谁叫它推迟到了\(00:05\) 我爱睡觉 题解 A. Olympiad 翻译 给你若干人的成绩 ...

  5. $HNOI\ 2010$ 解题报告

    HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...

  6. 【CJOJ P1333】【HNOI2012】矿场搭建

    [HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...

  7. Luogu4149:[IOI2011]Race

    题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG ...

  8. 论文笔记(8):BING: Binarized Normed Gradients for Objectness Estimation at 300fps

    译文: <基于二值化赋范梯度特征的一般对象估计> 摘要: 通过训练通用的对象估计方法来产生一组候选对象窗口,能够加速传统的滑动窗口对象检测方法.我们观察到一般对象都会有定义完好的封闭轮廓, ...

  9. tp5.带标签的缓存 创建和清除 测试

    原文:http://www.upwqy.com/details/24.html 测试设置了标签的缓存的获取方式 和清除标签缓存. 有时候我们可能会对同类型的一些数据做统一缓存.和统一清除更新处理. 那 ...

  10. 你真的了解interface和内部类么

    java 访问控制符 private     : 只能被当前类访问 protected : 可以被同包的类和任何子类访问(包内,包外) default    : 可以被包内的任何内访问 public  ...