x86的内存分段机制

        8086 是 Intel 公司第一款 16 位处理器,诞生于 1978 年,所以说它很古老。

一.8086 的通用寄存器

        8086 处理器内部共有 8 个 16 位的通用处理器,分别被命名为 AX、 BX、 CX、 DX、 SI、 DI、 BP、 SP。如下图所示。
        “通用”的意思是,它们之中的大部分都可以根据需要用于多种目的。

二.程序的重定位难题

2.1 代码段和数据段

        处理器是自动化的器件,在给出了起始地址之后,它将从这个地址开始,自动地取出每条指令并加以执行。

        只要每条指令都正确无误,它就能准确地知道下一条指令的地址。
        这就意味着:
(1)完成某个工作的所有指令,必须集中在一起,处于内存的某个位置,形成一个段,叫做代码段。
        若指令中间夹杂了其它非指令的数据,处理器将因为不能识别而出错。
(2)程序总要操作大量的数据,这些数据也应该集中在一起,位于内存中的某个地方,形成一个段,叫做数据段。
        我们并没有改变内存的物理性质,并不是真的把它分成几块。段的划分是逻辑上的,从本质上来说,是如何看待和组织内存中的数据。

2.2 单任务

        段在内存中的位置并不重要,因为处理器是可控的,我们可以让它从内存的任何位置开始取指令并加以执行。
        如下图,整个程序(包括代码段和数据段)在内存中的位置, 是由我们自己决定的。我们把数据段定在 0100H,把代码段定在 0120H。

2.3 多任务

        大多数时候,整个程序(包括代码段和数据段)在内存中的位置并不是我们能够决定的。
        程序在 Windows 里启动之前,内存已经被塞了很多东西。在这种情况下,你所运行的程序,在内存中被加载的位置完全是随机的,哪里有空闲的地方,它就会被加载到哪里,并从那里开始被处理器执行。
        如下图所示,因为程序现在从内存地址 1000H 处被加载的,所以,数据段的起始地址为 1000H。代码段依然紧挨着数据段之后,起始地址相应地是 1020H。
        只要所有的指令都是连续存放的,代码段位于内存中的什么地方都可以正常执行。但指令中包含的数据地址是绝对地址(物理地址),这样的程序是无法重定位的。
        为了让你写的程序在卖给别人之后,可以在内存中的任何地方正确执行,就只能在编写程序的时候使用相对地址或者逻辑地址了,而不是使用真实的物理地址。当程序加载时,这些相对地址还要根据程序实际被加载的位置重新计算。

2.4 解决-分段机制

           在任何时候,程序的重定位都是非常棘手的事情。当然,也有好几种解决的办法。在 8086 处理器上,这个问题特别容易解决,因为该处理器在访问内存时使用了分段机制。

三.内存分段机制

3.1 概述

        采用分段策略之后,一个内存单元的地址实际上就可以用“段:偏移”或者“段地址:偏移地址”来表示,这就是通常所说的逻辑地址。

        为了在硬件一级提供对“段地址:偏移地址”内存访问模式的支持,处理器至少要提供两个段寄存器,分别是代码段寄存器(CS)和数据段寄存器(DS)。
        对 CS 内容的改变将导致处理器从新的代码段开始执行。同样,在开始访问内存中的数据之前,也必须首先设置好 DS 寄存器,使之指向数据段。
        除此之外,最重要的是, 当处理器访问内存时,它把指令中指定的内存地址看成是段内的偏移地址,而不是物理地址。 这样,一旦处理器遇到一条访问内存的指令,它将把 DS 中的数据段起始地址和指令中提供的段内偏移相加,来得到访问内存所需要的物理地址。

3.2 8086 的内存分段机制

3.2.1 段寄存器
 

3.2.2 指令指针寄存器

        它只和 CS 一起使用,而且只有处理器才能直接改变它的内容。
        当一段代码开始执行时, CS 指向代码段的起始地址, IP 则指向段内偏移。这样,由 CS 和 IP 共同形成逻辑地址,并由总线接口部件变换成物理地址来取得指令。
        然后,处理器会自动根据当前指令的长度来改变 IP 的值,使它指向下一条指令。

3.2.3 地址线 20 根

        8086 的段寄存器和 IP 寄存器都是 16 位的,而地址线却有 20 根。
        为解决这个问题, 8086 处理器在形成物理地址时,先将段寄存器的内容左移 4 位,形成 20 位的段地址,然后再同 16 位的偏移地址相加,得到 20 位的物理地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE】String类详解

目录 前言 1. 什么是String类 1.1 String的构造 1.2 String类的基本操作:打印、拼接、求字符串长度 2. String类的常用方法 2.1 字符串查找 2.2 字符串替换 2.3 字符串拆分 2.4 字符串截取 2.5 字符串和其他类型的转换 2.6 去除字符串左右两边的空格 3.…

日赚2000万的短剧,还能火多久?

沈瑶初十年前就义无反顾地爱上高禹川,当他们两人再次相遇,她主动靠近高禹川,不料,她却意外怀孕,高禹川为了负责选择领证,但不公布两人的关系...... 这是一部情绪稳定女航医与傲娇疯批男机长的虐恋剧。在这个…

【MongoDB】一问带你深入理解什么是MongDB,MongoDB超超详细保姆级教程

目录 1、MongoDB概述2、MongoDB 主要特点2.1、文档2.2、集合2.3、数据库2.4、数据模型 3、Windows安装MongoDB3.1、下载MongoDB3.2、安装MongoDB3.3、配置MongoDB 4、Linux安装MongoDB4.1、下载MongoDB4.2、解压安装4.3、安装一个可视化工具 5、MongoDB基本操作及增删改查5.1、…

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述: 需要使用当前时间、日期,可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例: INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数): 规则(Date数据类型)

构建一个包含mvn命令的Java 17基础镜像

前言 官方提供的openjdk基础镜像,不包含mvn命令,无法用容器来打包代码。 在官方提供的镜像基础上安装maven。 前期准备,需要安装好docker。 一、安装maven 1、下载openjdk基础镜像,执行如下代码。 docker pull openjdk:17-j…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量:程序中临时存储数据的容器,在程序执行过程中,其值有可能发生改变的量(数据)。但是这个容器中只能存一个值。 应用场景:在我们登录页面的时候&#xf…

JavaSE day14笔记

第十四天课堂笔记 课上: 适当做笔记课下 : 总结 , 读代码 , 反复敲代码 , 做练习 数组★★★ 数组 : 存储多个 同一类型 的容器格式 :数组类型 : 引用数据类型, new运算符在堆中 分配一块连续的存储空间 , 系统会给数组元素默认初始化 , 将该数组的引用赋值给数组名 引用数据…

3月28号总结

java学习 1.this关键字 this关键字可以代表当前对象的引用。它可以在类的方法中使用,用于引用调用该方法的对象。通过this关键字,可以访问类的成员变量和方法,以及调用其他构造函数。 举一个实例来学习一下this关键字的作用。 比如&#…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文,英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国,请记住我给出的原理,不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步:我们打开Uni…

QT控件之显示控件

Qt Designer显示窗口部件提供的面板中,提供了10种显示小部件 (1) Label标签 (2) Text Browser文本浏览器 (3) Graphics View图形视图 (4) Calendar Widget日历 &…

IU5507低功耗DC-DC降压稳压器

IU5507T是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的 CMOS 降压DC/DC调整器。利用 PWM/PFM 自动切换控制电路达到可调占空比,具有全输入电压范围(3-18V)内的低纹波、高效率和大输出电流等特点。 IU5507T内置功率MOSFET,使用过压、过…

libVLC 捕获鼠标、键盘事件

在实现播放器的时候,我们需要捕获键盘、鼠标事件进行视频快进、快退,或者双击全屏/退出全屏窗口、鼠标右键弹出菜单栏。默认情况下,在使用libVLC库的时候,我们无法捕获这些事件,因为我们将Qt的视频窗口传递给了libVLC。…

损坏的RAID5csp

1.解题思路 这道题太抽象了&#xff0c;一开始都没太搞懂在讲啥。。。解决该题需要了解条带、磁盘号的定义。 下图以样例2&#xff0c;输入编号为5的块为例&#xff1a; 请务必加上ios::sync_with_stdio(false),否则会超时只有30分 2.满分代码 #include<iostream> us…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本&#xff1a; HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前&#xff0c;需要首先启动Hadoop&#xff0c;然后再启动HBase&#xff0c;并且启动HBase Shell&#xff0c;进入Shell命令提示符状态&#xff0c;具体命令如下&#xff1a; $ cd /usr/local…

Hello算法2:复杂度分析

Hello算法2&#xff1a;复杂度分析 本文是基于k神的Hello 算法的读书笔记&#xff0c;请支持实体书。 https://www.hello-algo.com/chapter_paperbook/ 算法效率 算法效率评估 设计算法时&#xff0c;我们追求以下两个目标&#xff1a; 找出解法找出最优解 最优解通常包含…

Douyin视频详情数据API接口(视频详情,评论)

抖音官方并没有直接提供公开的视频详情数据采集API接口给普通用户或第三方开发者。抖音的数据采集通常受到严格的限制&#xff0c;以保护用户隐私和平台安全。 请求示例&#xff0c;API接口接入Anzexi58 如果您需要获取抖音视频详情数据&#xff0c;包括评论、点赞等&#xff…

VMware虚拟机更换引导顺序

前言 我用wmware装了黑群晖测试&#xff0c;将img转成vmdisk的格式之后发现系统引导盘之后1G&#xff0c;有点太小了 我准备把wmware的黑群晖系统迁移到新添加的虚拟磁盘里 1.登录黑群晖的SSH 请先在黑群晖的控制面板中的终端机和SNMP里面启用SSH功能&#xff0c;才能使用ss…

创新指南|如何将人工智能应用于未来的创新管理——并不断付诸实践

ChatGPT 的推出加剧了围绕人工智能的炒作&#xff0c;现在我们看到了前所未有的巨大进展。对于我们这些热衷于创新的人来说&#xff0c;这是一个激动人心的时刻。他们正在共同采取措施&#xff0c;充分利用人工智能进行创新管理。本文将阐述人工智能能为创新管理做什么&#xf…

《米小圈动画汉字》—“动起来”汉字就能轻松记住啦!

为了迎合孩子们的兴趣&#xff0c;市面上推出了许多类型的动画片&#xff0c;所谓“动画”是让角色动起来&#xff0c;感染孩子&#xff0c;给孩子带来欢乐。但是&#xff0c;并不是所有动画片都对孩子有益&#xff0c;市面上的大多良莠不齐&#xff0c;孩子分辨不了还可能影响…

2020年天津市二级分类土地利用数据(矢量)

天津市&#xff0c;位于华北平原海河五大支流汇流处&#xff0c;东临渤海&#xff0c;北依燕山。地势以平原和洼地为主&#xff0c;北部有低山丘陵&#xff0c;海拔由北向南逐渐下降&#xff0c;地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形&#xff0c;平原约…