Java千百问_01基本概念(017)_内存物理地址在CPU中如何形成

点击进入_更多_Java千百问

1、什么是内存的物理地址

我们通过8086CPU来说明内存地址是如何形成的。

首先我们要了解物理地址,当CPU需要访问一个内存单元时,需要给出内存单元的地址,而每一个内存单元在物理内存空间中都有一个唯一的地址,即可以通过这个地址定位到内存单元,而这个地址即为物理地址。

CPU通过地址总线将一个内存单元的物理地址送入存储器,而后CPU便可以通过这个物理地址来访问这个物理地址所指向的内存单元了。

2、内存物理地址在CPU中如何形成

首先,我们知道8086CPU的地址总线是20根,即每次都可以传输20位的地址,从而寻址能力有2^20,也就是1MB的大小。但是,8086CPU的寄存器只有16位,也就是在8086CPU的内部,处理、传输、暂存的地址都只能是16位,即8086CPU不能完整的保存下一个物理地址(物理地址为20位)。

如果以最简单的方式(即直接用16位寄存器来保存物理地址)的话,寻址能力只有2^16,也就是64KB大小,难道8086CPU只能支持64KB大小的内存吗?

当然不是,8086CPU在这里采取了一定的措施,使其寻址能力达到1MB。

8086CPU在内部把两个16位的地址进行合成,从而形成一个20位的物理地址,8086CPU的寻址能力便可以达到1MB。具体是如何将两个16位的地址合成为一个20位的物理地址的呢?

当CPU在访问内存时,其会使用一个16位的基地址,然后再使用一个16位的偏移地址,通过将两个地址传入8086CPU的地址加法器中进行合成,即可以构造出20位的物理地址。

至于合成的方式如下:

将段地址左移4位,形成基地址,然后将基地址和偏移地址相加便形成了20位的物理地址。如下图:

3、内存段是什么

其实在物理内存中是没有内存段这一概念的,内存段的概念来自于CPU中的段寄存器。

我们将若干个地址连续的内存单元看做是一个段,通过将一个段地址左移4位形成基地址,然后通过这个基地址来定位这个段的起始地址,最后再通过偏移地址便可以精确定位到段中的内存单元了。

由于内存段的起始地址是一个段地址左移4位,所以内存段的起始地址肯定是16的倍数。而且一个内存段内部的内存单元只能通过偏移地址来定位,而偏移地址为16位,所以一个段的长度也就是2^16也就是64KB的大小。

在编程时,可以将一段内存定义成为一个段,分为数据段,代码段,栈段这三种类型的段。具体如下:

  1. 数据段

    存放我们所需要使用数据的内存段(当然段起始地址肯定是16的倍数,并且段长度<=64KB)。

  2. 代码段

    存放代码(也就是指令)的内存段。

  3. 栈段

    我们将一段内存当做栈来使用就称为栈段。

一个简单的例子:

MOV BX, 1000H   ;
MOV DS, BX????  ;向DS段寄存器传入1000H段地址。
MOV AX, [1234H]?;将内存地址1000H:1234H(即11234H)中的值读到AX寄存器中。
时间: 2024-10-19 18:35:57

Java千百问_01基本概念(017)_内存物理地址在CPU中如何形成的相关文章

Java千百问_01基本概念(004)_Java都能做些什么

点击进入_更多_Java千百问 1.Java都能做些什么 在讨论Java能干什么之前,我们要说一下软件系统的体系结构. 你不知道Java是什么?请看这里:什么是Java 2.什么是纯C架构系统 完全脱离网络就可独立使用的软件系统(即客户端C,client),这类软件不受限于网络,只依赖于操作系统. 如:PC上的word.视频播放器等软件. 3.什么是C/S架构系统 拥有自己独立的一个或多个服务端系统(即服务端S,server),每个使用者拥有自己独立的客户端软件(即C,client),客户端与服

Java千百问_01基本概念(001)_什么是Java

点击进入_更多_Java千百问 1.什么是Java Java是一种开发语言(核心特点:跨平台,面向对象,名称由来看这里:J2EE里面的2是什么意思),对于开发者来讲,Java基本等于Jdk. Jdk的版本介绍看这里:[Java都有那些版本][3] 开发人员一般通过IDE(Eclipse.NetBeans.JBuilder等)编写.编译Java代码(在远古没有IDE的时代,都是用文本编辑器编写,使用javac编译),在这个过程中,会使用到Jdk与第三方Jar包(Jar包即一组编译后的类打成的压缩包

Java千百问_01基本概念(002)_Java都有那些版本

点击进入_更多_Java千百问 1.Java都有那些版本 Java最初由sun公司出品,2009年被orcale公司(即甲骨文)收购,它的版本体系分为两个纬度,纵向和横向. 纵向的版本即为我们常说的Jdk版本,通过近20年的时间,从1996年正式发布1.0版本,发展到2014年的8.0版本. 横向的版本即为我们所说的Java体系,从Java 2.0开始有所区分. 2.什么是Java体系 Java SE(J2SE,Java2 Platform Standard Edition,标准版) Java

Java千百问_01基本概念(003)_J2EE里面的2是什么意思

点击进入_更多_Java千百问 1.J2EE里面的2是什么意思 J2SE,J2SE,J2ME中2的含义要追溯要1998年. 1998年Java 1.2版本发布,1999年发布Java 1.2的标准版,企业版,微型版三个版本,为了区分这三个版本,分别叫做Java2SE,Java2EE,Java2ME,简称J2SE,J2EE,J2ME.故,2的含义为1.2版本. 但是,这种叫法已经在2005年Java 1.6发布后取消,J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Jav

Java千百问_01基本概念(012)_Socket是什么

点击进入_更多_Java千百问 1.什么是Socket Socket也称作"套接字".网络上的两个应用程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,所以Socket都是成对出现的.Socket通常用来实现客户方和服务方的连接,一个Socket由一个IP地址和一个端口号唯一确定. Socket是TCP/IP协议的一个十分流行的解决方案,是支持TCP/IP协议的网络通信的基本操作单元.Socket所支持的协议种类不只TCP/IP一种,只不过在Java环境

Java千百问_01基本概念(009)_CLASSPATH是什么

点击进入_更多_Java千百问 1.CLASSPATH是什么 CLASSPATH是Java解释器中用来指定搜索包路径的集合,Java解释器是这样工作的: Java解释器找到环境变量CLASSPATH(将Java或者具有Java解释能力的工具,如浏览器,安装到机器中时,通过操作系统环境变量进行设定). CLASSPATH包含了一个或多个目录,它们作为一种特殊的"根路径"使用,从这里展开对.class文件的搜索.从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从

Java千百问_01基本概念(007)_线程的状态有哪些

点击进入_更多_Java千百问 1.线程的状态有哪些 在java中java.lang.Thread类有一个变量threadStatus,标示了该线程的当前状态,它是一个int类型,但是对应的get方法返回值是一个枚举(Thread的内部类),源码如下: public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable th

Java千百问_01基本概念(014)_同步、异步有什么区别

点击进入_更多_Java千百问 1.同步.异步有什么区别 在进行网络编程时,我们通常会看到同步.异步.阻塞.非阻塞四种调用方式以及他们的组合. 了解阻塞.非阻塞看这里:[阻塞.非阻塞有什么区别][2] [2]: 其中同步方式.异步方式主要是由客户端(client)控制的,具体如下: 同步(Sync) 所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行.我们在说同步.异步的时候,一

Java千百问_01基本概念(011)_static有什么用

点击进入_更多_Java千百问 1.static有什么用 static是java的关键字,用static声明达到静态的目的.所谓静态,就是在程序编译后就能被使用,不需要创建任何实例.static能够修饰类.方法.变量以及类代码块,具体如下: static方法 被static声明的方法叫做静态方法,不需要实例化对象通过类名直接调用的方法,最常见的是main(). 了解main方法看这里:main方法是什么 例如: public class TestStatic { public static vo