关于x86系列CPU的段

x86系列的CPU是指最早由Intel公司生产的8086系列以及以后的后继产品,也包括了各CPU生产厂商仿制的产品。但不包括后来的各种形式的64位的CPU。
段是一个存储概念。
下面描述的主要是我的想象,你可以把它当成演义来看:),不必当真。
从8086 开始,Intel的CPU就已经是16位的了。所谓16位,是指它的数据总线,地址总线(注意,地址总线并不是如此的,后面会有详细的说明,事实上,它的地址总线是20位的),各个寄存器都是16位宽的。那真是一个简单的年代。16位地址总线意味着可以寻址64K的地址空间。甚至在那个年代,64K也有点小了。所以Intel决定(配合IBM的要求)采用20位地址总线。但这引发了一个问题,那就是:指令集如何设置?要知道,20位比16位多了4个位,这四个位放在何处?寄存器都是16位的!聪明的Intel的工程师开始想到了一个办法(我估计是受DEC的启发,它的CPU就是分段式的内存,不过, Intel的分段跟他还是有很大区别的,DEC的是不重叠的分段,而Intel的分段可以重叠),就是把地址空间分成两部分,一部分叫作段基址,一部分叫作段内地址。段内地址就是原始的16位地址,所以,段的大小最大是64K,那么段基址怎么办?我们知道,段基址要在20位的地址空间中(也就是1M的地址空间)表示一个地址,最合理的选择就是20位。但是,Intel的工程师当时认为,在一个16位的CPU中放置一个20位的寄存器不合情理,所以采用了一个聪明的偷懒办法。用一个16位的寄存器表达一个低4位为零的20位地址。说得明确一点,我用16进制表示,一个16位的寄存器,其值为NNNN,那么我们就把它看成NNNN0这样一个地址。这就是段基址寄存器。简单的叫做段寄存器。在我们想访问1M地址空间中的任意一个地址区域的时候,我们可以把段寄存器的值调整的靠近(所谓的靠近,也就是比这个地址空间小,但是不小于64K的某个地方)这个地址空间,然后通过段基址和段内地址之和,就可以访问1M内任意的地址空间了。修整段寄存器地址的这个动作叫作段切换。段内地址仍然是16位长,这也限制了段的长度是64K。看到这儿,你或许会想起些什么,或许会对所谓的近指针、远指针的概念有了一些回忆。哈哈。机制描述完了,我们开始看看这个设计引发的一些有趣的限制和问题。首先,段基址被限定为低4位为0,也就是NNNN0这种形式,那么,段基址一定是16的整数倍。呵呵,这个16被称作para(paragraph,段!注意,我们上面所描述的段被Intel 的工程师称为segment)。其次,由于FFFF0 + FFFF寻址的地址已经大于1M了(事实上,整整比1M大了一个segment的长度,64K),而实际上20位地址总线确实只能寻址1M的地址空间,这就说明了我们Intel工程师的这个设计其实没有达标!呵呵,确实没有想到会有这么一个问题。后来,应该是某个Intel的心理稍微有点变态的家伙说:我们让他回环吧。一开始,估计大家都觉得很失败,后来,大家都不禁被这个想法逗乐了,回环就这样被确定下来了。我说说回环是什么。很有意思。由于段基址+段内地址可以表达超过1M的地址空间,而地址总线只能寻址1M的地址空间,所以,所有超过1M地址空间的地址都减去1M。也就是说,所有大于1M的地址空间都重新从0开始计算,就好像又绕回来了一样。这就是回环。
8086CPU内部有5?个段寄存器。也就是说,同一时间我们可以维持5个段的存在。如果我们需要多于5个段的地址空间,段切换就行了。
这是段的缘起。
由于80186是失败的,而且可以到手的资料少得可怜,我就掠过去不说,80286问世了。她第一次引入了保护。我们想一下,由于我们可以把内存分段使用,所以似乎我们也可以简单的规定对某个段我们有什么可能的权利。比如:该段是TEXT段,只可以执行,或者该段是RDATA段,只能被读取什么的。所以,给最初的段机制加上保护似乎是顺理成章的事情。但是,286在加入保护这个问题上考虑的太少了,以至于其实是不完善的。
我们仔细的分析一下。由于段是在para的边界指定的。同时,只要在para的边界上,我们就可以指定一个段,再次强调,para是16。这说明:两个不同基址的段相差最少可以是 16。而段的最大长度却可以使64K。这回导致什么?这会导致段重叠。也就是说,一个真实的地址空间的地址,可以同时隶属于多个段。那么我们对它的保护是什么样子的?所有段的可访问性的总和?最小可访问性?没有什么定论。所以说,通过段进行存储空间的保护,在Intel的CPU上,学理不太通顺(我并不是要否定段保护,相反,完善的段保护机制非常有用,可惜,在x86的机器上行不通)。在x86的机器上,我们缺少了一些东西,一般认为,我们要加上段界限,同时禁止段重叠,才能真正的实施段保护。当然,286也确实实施了一定的保护,所以286的段切换要比8086代价高。原因自然是段切换需要切换的场景信息更多的缘故。
我上面的描述其实并不是事实,或者至少有一部分不是事实。那就是:286中的段寄存器存放的不再是简单的段基址了。它存放的是一个叫做段选择子的东西,这个东西指向存储空间中的段描述符表中的某一项,或者简单的说,指向段描述符。段描述符里面存放的才是真正的段基址什么的。用比较直白的术语,我们说它引入了一重间接性。
386出场了,看到别的CPU的寻址空间和OS都在飞速扩张,Intel终于搞出来一个32位的CPU出来。32位的地址空间逻辑上可以寻址4G的存储系统。简单的说,我们可以认为段内地址扩张成32位的了,但是段这个概念以及其实现方式跟286没有太大差别。386引入了一个页的概念,不过这与我们的主题无关。
我们说说OS方面的发展。由于地址空间扩大,而物理内存并没有同比例的扩大。(注:16 位扩展成32位,地址空间增加为原来的65536倍,就算从20位增加为32位,地址空间也增加了4096倍)。物理空间增加了大约500倍左右。这中间有一个巨大的差值。聪明的人们于是搞出来一个叫做虚拟内存的东西。希望能够尽量的使用地址空间。基本的策略就是用硬盘(或者别的外部存储设备)的一部分假装是内存。这样做有什么好处呢?这得从程序的特性说起,一个程序,不可能同时访问地址空间内所有的数据,而是相反,一段时间内集中在一个区域。这个特性叫做局部性。根据局部性,对于需要立即访问的放在物理内存中,不需要立即访问的放在虚拟内存中,等到需要访问时,再装入内存中以供访问。这简化了应用程序的逻辑,应用程序只需要按照自己的意图是用全部的地址空间就行了。这种物理内存和虚拟内存之间的倒腾由OS完成。实现虚拟内存需要CPU的支持(其实如果没有也行,不过性能根本就没办法保证),现在常用的甚至是唯一的方式就是内存分页,这个倒腾的过程也因而叫做换页。逻辑上,我们可以用分段来实现虚拟内存的(想想前面提到的段切换),但是由于段的不规整性(页的大小是一致的,规整的,而段不是,参见前面的描述),实现相对复杂,需要CPU的支持更多,性能更难以保证。所以,现代OS全都不约而同地采用分页的方式实现虚存,而没有采用分段的方式。
那么,对于x86这种既支持分段,有支持分页的CPU来说,OS究竟怎么办?其实,很简单,简单的忽略分段就行了。那位说了,这不是你想忽略就忽略的吧。x86CPU访问存储空间地址的时候就是采用段基址+段内地址的呀,这是硬件的实现,岂是我们可以忽略的?呵呵,如果我们把段基址规定成0怎么样?这样我们就可以不关心段了。是的,现代OS都是这样做的。
比如:Windows系统,其几个段寄存器(存放的是段选择子了)都是指向28(好像是)号段描述符,而28号段描述符都是0基址的。
持平的说,x86系列CPU的段机制设计的还算是比较好的,颇有巴洛克的味道,跟Intel第一次64位CPU的尝试安腾一样。呵呵。
上面所说的一切都是记忆,不提供任何正确性担保,聪明人都不会看它的,当然,看了的人更聪明。
CPU架构有多少种?X86与ARM有哪些不同之处? CPU架构有多少种?X86与ARM有哪些不同之处?看完这篇你就懂了_ly930156123的博客-优快云博客_cpu架构有几种一台服务器、一台电脑、一台手机最重要的电子零部件是什么?没错,就是CPU处理器。它主要负责数据计算、控制功能,是最核心的部分。不过你又知道有多少种CPU架构吗?主流的X86、ARM到底有什么区别?下面就给大家介绍一下几种常见的CPU架构:X861978年6月8日,Intel发布了史诗级的CPU处理器8086,由此X86架构传奇正式拉开帷幕。首次为8086引入X86作为计算机语言的指 阅读详情

相关推荐

CPU两大架构X86 和 ARM

(1)中央处理单元(CPU):   主要由运算器、控制器、寄存器三部分组成。运算器就是起着运算的作用,控制器就是负责发出CPU每条指令所需要的信息,寄存器就是保存运算或者指令的一些临时文件,这样可以保证更高的速度。   CPU有着处理指令、执行操作、控制时间、处理数据四大作用。移动设备很复杂, CPU需要执行数以百万计的指示,才能使它向期待的方向运行,而CPU的速度和功率效率是至关重要的。速度

zhaol_90的博客 1万+

数据线和地址线的问题

20根地址线16根数据线的CPU的寻址范围里面为什么按字节的范围是1M? 1M的储存单元中每个单元里面是存有16位的2进制码吗?这里很困惑::?? 答: 地址线的数目决定寻址的字节数,数据线决定存储字的位数。 20根地址线 从0000 0000 0000 0000 0000 到1111 1111 1111 1111 1111 我们知道变化

习惯就好zz的专栏 8149

从零开始系列(四):一文看懂arm架构和x86架构有什么区别

从零开始系列(四):一文看懂arm架构和x86架构有什么区别 相关系列文章推荐:   从零开始系列(一):在github上搭建自己的博客   从零开始系列(二):数据库基础篇   从零开始系列(三):Windows10安装Linux子系统(WSL教程) 【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权); 本博客的内容来自于:; 学习、合作与交流联系q384660495; 本博客的内容仅供学习与参考,并非营利; 文章目录从零开始系列(四):一文看懂arm架构和x86架构有什么区别 .

qq_44159782的博客 9396

按字寻址和按字节寻址

寻址指当CPU请求数据时获得该数据在内存上的位置的过程。内存上存储的所有数据都会有一个可以区分的地址,这与其存放的位置相对应,当CPU请求数据时,内存中的电路会根据CPU的地址线上的信号利用数据总线向CPU返回数据。那么内存是如何编码数据保存的位置的?这里涉及到上文所述的字节的概念。内存每一个存储位置的最小单元都可以储存0或1,即一个位的内容,而内存将8个位设定为一个存储空间的基本单位。而在地址线上每一个地址的编号便对应的是一个存储位置的最小的基本单位。

qq_63514555的博客 2985

CPU两大架构:X86与ARM的区别

CPU架构:ARM与X86区别

Edward2022的博客 4万+

Tessy学习系列(三):单元测试——官方例程isValueInRange

注意:工程名称以及路劲不能包含空格和中文

不吃鱼的猫的博客 2348

微型计算机技术及应用

第2章 16位和32位微处理器 微处理器的性能指标最主要的是以下两项:1.字长2.主频 一、16位微处理器8086 8086是Intel系列的16位微处理器,有16根数据线和20根地址线。从功能上,8086分为两部分,即总线接口部件和执行部件 总线接口部件:功能是负责与存储器、I/O端口传送数据。8086的总线接口部件有下列各部分组成: 4个段地址寄存器——1)CS:16位的代码段寄存器2)DS:16位的数据段寄存器3)ES:16位的附加段寄存器4)SS:16位的堆栈段寄存器 16位的指令指针寄存器

Answer_G的博客 422

海波龙(Oracle Hyperion)单点登陆问题记录

Oracle海波龙套件已经多年未更新,按Oracle官方文档实施单点登陆启用之后,SmartView工具通过专用链接方式无法登陆系统。 在抓包逆向分析之后 定位到HspSmartViewServlet类在执行以下代码时获得的ssotoken无效导致,在某大厂工作的时候曾通过在filter中截获请求的方式植入Attribute,保留账号密码并在单点程序中处理实现登陆。 但在完美世界的环境中...

cainiaoEzu的专栏 1970

地址总线,字长,内存容量,寻址范围 之间的计算

http://blog.sina.com.cn/s/blog_7dc29ca00100x0c7.html 地址总线,字长,内存容量,寻址范围 之间的计算     处理机字长是指处理机能同时处理(或运算)的位数,即同时处理多少位(bit)数据。比如Intel Pentium 4处理器字长为32位,它能同时处理32位的数据,也即它的数据总线为32位。以前的处理器比如8086,则为16位处理器,现

1万+

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7798

Python 爬虫实战:爬取 B 站 UP 主的全部视频数据

本文详细介绍了基于Python开发B站UP主视频数据爬虫的技术方案。通过分析B站API接口,使用requests库发送HTTP请求并处理JSON数据,结合pandas进行结构化存储。文章重点解决了接口鉴权、分页爬取、反爬策略等核心难点,实现获取视频标题、播放量、点赞数等关键指标。同时强调数据爬取需遵守平台规范,仅限技术研究使用。该方案为B站视频内容分析提供了可靠的数据采集基础,具有实际应用价值。

2503_91057718的博客 2492

页、块、程序间的关系

页式存储 注意页和块的对象的不同 对程序进行分页存储 对内存进行分块存储 文章最后会给出我总结的页和块的关系 逻辑地址和物理地址 a)逻辑地址:由两部分组成,即页号 + 页内地址 设逻辑地址由总长度为m的二进制数表示,页内地址为n位,则页号为m-n位。 注意: 块内地址=页内地址=2n,同理最大的程序可允许有 > >2m-n个页面。 计算公式: 页号 = 逻辑地址/页长(商) 页内地址 = 逻辑地址%页长(余数) ...

qq_43634879的博客 3093

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程。

本文介绍了三相四线制整流器在不平衡负载下的中点电位平衡控制方法。首先分析了中点电位漂移的物理机理和控制策略(零序电压注入)。接着详细讲解了Simulink建模步骤:搭建三相四线制主电路、设计平衡控制算法、实现PWM调制。通过对比有无平衡控制的仿真结果,验证了控制方法的有效性。最后提供了工程建议:零序注入需限幅、考虑中性线寄生电感影响、采用稳健的PI参数。该方案能有效抑制中点电位波动,保障三电平系统在不平衡工况下的稳定运行。

MHD0815的博客 61

Intel x86 CPU系列的寻址方式

Intel可以说是资格最老的微处理器芯片制造商了,历史上的第一个微处理器芯片4004就会Intel制造的。所谓x86系列,是指Intel从16位微处理器8086开始的整个CPU芯片系列,系列汇总的每种型号都保持与前面的各种型号兼容,主要有8086、8088、80186、80286、80386、80486以及各种型号的Pentium芯片。自从IBM选择8088用于PC个人计算机以后,x86系列的发证就与IBM PC及其兼容机的发展休戚相关了。其中80186并不广为人知,就与IBM当初决定停止在PC机中使用80

guoguangwu的专栏 1355

PCIe-Orders set Blocks之symbol对齐

有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data

weixin_44700185的博客 813

25 - GRACE Mascon数据缺失月份数据插值

本篇基于文章的相关内容和文章公开的奇异谱分析(SSA)插值算法程序包,对grace Mascon数据种缺失的月份进行 插值 ,总结了使用程序包的相关过程,可以将该程序应用到其他数据处理插值计算中。

weixin_43339605的博客 1843

关于保护模式必须搞清楚的一点基础内容

1.实模式下段的用法,段基址,段内偏移计算物理地址方法。 2.保护模式下段的作用。 3.描述符结构   以下代码摘自《自己动手写操作系统》。起初对以下代码不太理解,有2个问题: 1.shl eax, 4 ;为什么这样做,有什么效果。所以了解段基址及段内偏移计算物理地址方法后就能够完全理解。(后面附了一篇文章,和我一样的小白可以看看) 2.mov word [LABEL_DESC_COD

无止无休 1389

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

内核管理之CPU基本组件

要想弄懂Linux内核的工作原理,就必须懂点基本的硬件知识。这里我们主要介绍Intel 80x86系列CPU保护模式下最核心的部件中几个寄存器的作用,这些寄存器在Linux内核运行时起着至关重要的作用。至于其他那些各式各样的硬件设备,我们在讲解设备驱动时会针对具体的驱动程序来介绍的。首先,大家先看看CPU的主要架构:   EU(通用寄存器、运算器和控制器)执行部件:完成指令所要求的功能。 S

farmwang的专栏 2213

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

x86系列CPU寄存器和汇编指令总结

本文介绍了x86系列cpu的发展及其寄存器作用、x86 cpu汇编指令、nasm汇编介绍等

weixin_38597669的博客 2457

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【CPU 架构】x86、x86_64、x64、arm64、aarch64

非 x86 服务器:使用 RISC(精简指令集)或 EPIC(并行指令代码)处理器,并且主要采用 UNIX 和其它专用操作系统的服务器,指令系统相对简单,它只要求硬件执行很有限且最常用的那部分执令,CPU 主要有 Compaq 的 Alpha、HP 的 PA-RISC、IBM 的 Power PC、MIPS 的 MIPS 和 SUN 的 Sparc、Intel 研发的 EPIC 安腾处理器等。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统。

Data · Model · Agent · Repeat 2万+

X86系列CPU标准寄存器

1 16位和32位CPU的寄存器2 通用寄存器  通用寄存器包括数据寄存器、指针寄存器、变址寄存器。除完成规定的专门用途外,均可用于传送和暂存数据,可以保存算术逻辑运算的操作和运算结果。通用寄存器的长度取决于机器字长。   16位cpu通用寄存器共有8个:AX、BX、CX、DX、BP、SP、SI、DI。八个寄存器都可以作为普通的数据寄存器使用。但有的有特殊的用途:AX为累加器,CX为计数器,BX,

liao20081228的博客 5084

X86架构(CPU、总线、内存)

先了解计算机底层最基本的工作原理,以便于以后能理解Linux系统的运作模式!! 总体概要 原文中对于x86架构的总结图片,重点牢记这些寄存器的作用,以及段的工作模式 计算机的工作模式(了解一下) 1、 CPU、总线、内存 对于一个计算机来讲,所有功能看似是输入输出设备的功劳,实际干活的还是CPU。同时CPU通过内存不断的保存和取出中间数据,然后基于中间结果进行进一步的计算。总线是CPU和其...

本末实验室 1万+

什么是X86 CPU?

深入PC的核心——了解X86 CPU CPU的基本概念1.什么是X86系列及兼容CPU  X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世界第一台PC机中的CPU— i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X

tanliyoung的专栏 9626

了解X86 CPU

 CPU的基本概念1.什么是X86系列及兼容CPU  X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世界第一台PC机中的 CPU— i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。

Welcom to zougangx's blog 1192

x86架构CPU市场格局

PC市场:英特尔占主导(78.9%),AMD快速追赶(21.1%),国产厂商份额微小,局限于中国。服务器市场:英特尔出货量领先(75.9%),但AMD收入增速更快(24.1%份额,2024年Q3收入超英特尔)。ARM占8%,国产x86厂商(如海光)在国内有增长空间。超算市场:英特尔和AMD主导,AMD凭借EPYC高性能逐渐渗透,国产自研架构影响力有限。未来展望:x86架构短期内仍主导PC和服务器市场,但AMD的性价比策略和ARM的能效优势将持续施压英特尔。

u011732210的博客 4401
上一篇: 什么是所谓的Windows子类化
下一篇: 关于软件工程,我还有话说
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值