【深入理解计算机系统02】ISA 与内存模型
第二篇:认识ISA(Instruction Set Architecture)
重要概念:
- 【ISA】
- 【IA-32】:Intel把32位x86架构的名称x86-32改称为IA-32,一种身边很常见的ISA
- 【内存模型】
- 【过程调用】
•ISA(Instruction Set Architecture)位于软件和硬件之间
•硬件的功能通过ISA提供出来
•软件通过ISA规定的"指令"使用硬件
•ISA规定了:
–可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定;
–指令可以接受的操作数的类型;
–操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途;
–操作数所能存放的存储空间的大小和编址方式;
–操作数在存储空间存放时按照大端还是小端方式存放;
–指令获取操作数的方式,即寻址方式;
–指令执行过程的控制方式,包括程序计数器、条件码定义等。
IA-32 规定的几个方面:
『IA-32是CISC 复杂指令集』
- IA-32支持的数据结构类型和格式
- IA-32的寄存器组织
- IA-32的标志寄存器
- IA-32的寻址方式
- 浮点寄存器栈和多媒体扩展寄存器组
- IA-32 常用指令类型
》 程序的转换与机器级表示
了解高级语言与汇编语言、
汇编语言与机器语言之间的关系
掌握有关指令格式、
操作数类型、
寻址方式、
操作类型等内容
了解高级语言源程序中的语句与机器级代码之间的对应关系
了解复杂数据类型(数组、结构等)的机器级实现
0. IA-32寄存器模型
》 理解计算机是如何工作的
程序由指令组成
程序在执行前:
数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC
(原材料和菜谱都放在厨房外的架子上, 每个架子有编号。妈妈从第5个架上指定菜谱开始做)
开始执行程序:
第一步:根据PC取指令(从5号架上取菜谱)
第二步:指令译码(看菜谱)
第三步:取操作数(从架上或盘中取原材料)
第四步:指令执行(洗、切、炒等具体操作)
第五步:回写结果(装盘或直接送桌)
第六步:修改PC的值(算出下一菜谱所在架子号6=5+1)
继续执行下一条指令(继续做下一道菜)
》☆ 内存模型
作者注:
『不同语言有不同的内存模型。只有掌握了内存模型,才算是真正具有了对程序的时间和空间效率进行分析的基本能力。
如编译性语言C、C++,对它们的分析要结合编译出的汇编语言,同时也要注意操作系统和编译器对内存管理的影响。
至于操作系统和编译器对内存模型产生了何种影响,还需要进一步学习。』
Process virtual address space.
【图片摘自 CSAPP 3rd】
. Heap.The code and data areas are followed immediately by the run-time heap. Unlike the code and data areas, which are fixed in size once the process begins running, the heap expands and contracts dynamically at run time as a result of calls to C standard library routines such as malloc and free.
堆,用于存放程序动态创建的数据。
. Shared libraries.Near the middle of the address space is an area that holds the code and data for shared libraries such as the C standard library and the math library. The notion of a shared library is a powerful but somewhat difficult concept.
共享存储区:
静态存储区:存放共享数据
. Stack. At the top of the user's virtual address space is the user stack that the compiler uses to implement function calls. Like the heap, the user stack expands and contracts dynamically during the execution of the program. In particular, each time we call a function, the stack grows. Each time we return from a function, it contracts.
栈:用于程序调用过程中的数据存储,局部变量。
. Kernel virtual memory. The kernel is the part of the operating system that is always resident in memory. The top region of the address space is reserved for the kernel. Application programs are not allowed to read or write the contents of this area or to directly call functions defined in the kernel code.
核心虚拟存储区:操作系统专用存储区。
》过程调用的机器级表示:
每次递归调用都会增加一个栈帧,所以空间开销很大。
》IA-32的寄存器使用约定
调用者保存寄存器:EAX、EDX、ECX
当过程P调用过程Q时,Q可以直接使用这三个寄存器,不用将它们的值保存到栈中。如果P在从Q返回后还要用这三个寄存器的话,P应在转到Q之前先保存,并在从Q返回后先恢复它们的值再使用。
被调用者保存寄存器:EBX、ESI、EDI
Q必须先将它们的值保存到栈中再使用它们,并在返回P之前恢复它们的值。
EBP和ESP分别是帧指针寄存器和栈指针寄存器,分别用来指向当前栈帧的底部和顶部。
》过程调用中两种传递参数的方式:
1. 按值传递
2. 按地址传递
》数组的分配和访问:
1. 分配到静态区
全局变量、静态数据
2. 分配在栈中,通过EBP来定位
局部变量、入口参数
》栈桢:
push %ebp
mov %esp,%ebp
每次跳转都会执行两跳语句构成栈底(在高地址)。ebp存放的是原ebp值
》 有时间可以去学习一下程序如何对应机器指令,即编译成汇编语言的过程。
》 数据的访问:
其中2、4没有访存操作,明白指针在提高执行效率时的厉害之处了吧。
》 数据的对齐
机器字长为固定的32位或64位。数据按字节编址,每一次访问可能会跨越地址。
对齐的目的是:减少访存次数,提高时间和空间效率。(毕竟数据总线每次读好多个字节呢!)
> 数据的对齐
x86-64中各类型数据遵循一定的对齐规则,而且更严格
x86-64中存储器访问接口被设计成按8字节或16字节为单位进行存取,其对齐规则是,任何K字节宽的基本数据类型和指针类型数据的起始地址一定是K的倍数
例如int类型占用4个字节,地址只能在0,4,8等位置上。
> 对齐方式:
#pragma pack(n)
•为编译器指定结构体或类内部的成员变量的对齐方式。
•当自然边界(如int型按4字节、short型按2字节、float按4字节)比n大时,按n字节对齐。
•缺省或#pragma pack() ,按自然边界对齐。
__attribute__((aligned(m)))
•为编译器指定一个结构体或类或联合体或一个单独的变量(对象)的对齐方式。
•按m字节对齐(m必须是2的幂次方),且其占用空间大小也是m的整数倍,以保证在申请连续存储空间时各元素也按m字节对齐。
__attribute__((packed))
l不按边界对齐,称为紧凑方式。
不同操作系统对齐策略可能有所不同。导致不同的结构声明顺序的内存利用效率不同。
Windosws策略:
Linux策略:
{
待补充~~
}
Ps:学习完这些就可以为后边的缓冲区溢出做好准备了。
我来总结一下:
从以上内容可以看出来,人们做了大量工作去减少访存次数,提高系统的时间和空间效率。因为相比访问寄存器,访问存储器的开销还是很大的。
注意在软件方面同样可以采取很多有效的措施减少访存次数。
各种各样的寻址方式也都是为了适应高级语言中的数据类型产生的访存需要。
转载请注明出处:http://www.cnblogs.com/learn-to-rock/p/5876337.html
【深入理解计算机系统02】ISA 与内存模型的更多相关文章
- 【深入理解JVM】:Java内存模型JMM
多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...
- 深入理解JVM(二)——内存模型、可见性、指令重排序
上一篇我们介绍了JVM的基本运行流程以及内存结构,对JVM有了初步的认识,这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存 ...
- 深入理解Java虚拟机(一)——JVM内存模型
文章目录 程序计数器 定义 作用 特点 Java虚拟机栈 定义 特点 本地方法栈 定义 Java堆 定义 特点 方法区 定义 特点 运行常量池 直接内存 总结 Java虚拟机的内存空间分为五个部分: ...
- 从 CPU 讲起,深入理解 Java 内存模型!
Java 内存模型,许多人会错误地理解成 JVM 的内存模型.但实际上,这两者是完全不同的东西.Java 内存模型定义了 Java 语言如何与内存进行交互,具体地说是 Java 语言运行时的变量,如何 ...
- Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解
目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...
- 深度解析Java多线程的内存模型
内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...
- 《深入理解Java内存模型》读书总结
概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...
- 对Java内存模型即JMM的理解
类似物理上的计算机系统,Java虚拟机规范中也定义了一种Java内存模型,即Java Memory Model(JMM),来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
随机推荐
- javascript 函数初探 (一)--- 神马是函数
神马是函数? 所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,以便与之后的调用.下面,我们来示范以下函数的声明: function sum(a, b){ var c = ...
- arcgis server10.2.2发布地图基础服务的具体步骤
1.直接打开制作好的.mxd文档,比如这里: 2.打开mxd文档之后,打开菜单:file-share as -services 弹出地图发布服务的界面: 点击publish之后,耐心的等待一段时间,地 ...
- 更改Visual Studio 2015 默认的语言设置
Vs支持多种语言,但有可能创建项目时,默认的开发语言不是你需要的,比如:默认是Visual C++ 你可以通过"工具"----选项----导入和导出设置来修改. 引用: https ...
- Event 8306 5021 5059 5057发布安全令牌时异常
现象:站点访问一个,应用程序池就自动停掉一个 日志报错 解决: 1.受域策略影响,作为批处理作业登录选项被锁定,需修改域策略: 更新后: 2.确保程序池账户倒在IIS_IUSER组 ...
- 两种方法设置disabled属性
//两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr("disabled&qu ...
- IOS开发基础知识--碎片4
十七:返回到主线程进行操作,对UI进行更新只能在主线程进行 /*将数据显示到UI控件,注意只能在主线程中更新UI, 另外performSelectorOnMainThread方法是NSObject的分 ...
- 基于Flume+LOG4J+Kafka的日志采集架构方案
本文将会介绍如何使用 Flume.log4j.Kafka进行规范的日志采集. Flume 基本概念 Flume是一个完善.强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说 ...
- TNS-12541: TNS:no listener TNS-12560 TNS-00511: No listener
为了测试需要,系统管理员帮忙将一台ORACLE数据库服务器克隆到虚拟机上,我上去删除了root.oracle.tomcat账号下的crontab定时作业,然后启动了ORACLE数据库实例,删除 ...
- hibernate 注解 唯一键约束 uniqueConstraints
@Table 注解包含一个schema和一个catelog 属性,使用@UniqueConstraints 可以定义表的唯一约束. 如果是联合约束就用下面这种 @Table(name="tb ...
- ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法
定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...