当前位置:网站首页>C专家编程 第7章 对内存的思考 7.2 Intel 80x86内存模型以及它的工作原理
C专家编程 第7章 对内存的思考 7.2 Intel 80x86内存模型以及它的工作原理
2022-08-06 16:31:00 【weixin_客子光阴】
段(segment)这个术语至少有两种不同的含义(其实还存在第三种含义,它跟操作系统的内存管理有关)
*在UNIX中,段就是一块以二进制形式出现的相关内容。
*在Intel80x86内存模型中,段是内存模型设计的结果。在80x86的内存模型中,各处理器的地址空间并不一致(因为要保持兼容性),但它们都被分割成以64KB为单位的区域,每个这样的区域便称为段。
作为80x86内存模型最基本的形式,8086中的段是一块64KB的内存区域。由一个段寄存器所指向。内存地址的形成过程是:取得段寄存器的值,左移4位(相当于乘上16);或者换种思路,把段寄存器的值看成是20位的,也就是在值的右边扩充4个0.
然后就是16位的偏移地址,它表示段内的地址。如果把段寄存器的值(经过移位)加上偏移地址,就得到最终的地址。注意,正如两个数加起来等于24的例子有很多,不同的段地址加上偏移地址所形成的值可能指向同一个内存地址。
一般来说,大约有0x1000(4096)个不同的段地址/偏移地址组合可以指向同一个内存地址。
C语言编译器设计者必须确定,在PC中这些指针是以规范的方式进行比较的。否则的话,可能出现两个位模式不同但指向同一个内存地址的指针被错误地比较为不相等。如果使用了huge关键(使用huge内存模式),这些工作会自动完成,但如果使用了large模式,则不会如此。在Microsoft C中,far关键字表示指针存储了段寄存器的内容和偏移地址。near关键字表示指针只存储了16位的偏移地址,它的段地址使用当前数据段或堆栈段寄存器中的值。
在讨论数字概念时,需要注意所有的磁盘制造商都是使用十进制数(而不是二进制数)来表示磁盘的容量。
今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。准确地税,在内存和CPU的性能之间存在一道很深的鸿沟,而且是越来越深。
MS-DOC 640KB的限制缘何而来
在MS-DOS下运行的应用程序都面临一个严峻的内存限制,那就是可用内存只有640KB。这个限制源于Intel8086这个最初的DOS机器的最大地址范围。8086支持20位的地址,总共1MB的内存。之所以只能使用640KB,是因为某些段(64KB)必须予以保留,供系统所用。
段 保留用于
F000~FFFF 64KB,用于永久性的ROM区域BIOS、诊断信息等
D000~EEEE 128KB,用于ROM存储区域
C000~CFFF 64KB,用于BIOS扩展(XT硬盘)
B000-BFFF 64KB,用于常规型的内存显示
A000~AFFF 64KB,用于显示内存扩展
其余
0000~9FFF 640KB,用于应用程序
留下10个64KB的段归应用程序使用,其实地址为0(其中第0块的最低地址也保留给系统使用,用作缓冲区和MS-DOS的工作存储)
PC的内存模型
Microsoft C认可一下几种内存模型。
small:所有的指针都为16位,代码和数据都限定在一个单一的段中,程序最大规模为128KB(代码段和数据段各64KB)
large:所有的指针都为32位,程序可以包含许多个64KB的段。
medium:函数指针为32位,所以代码段可以有多个。数据指针为16位,所以只有一个64KB的数据段。
compact:medim的另一种形式。函数指针为16位,所以代码最多不超过64KB。数据指针为32位,所以数据可以占据多个段,但堆栈里的数据仍限制在一个64KB的段内。
Microsoft C认可下面这些非标准的关键字,当它们应用于对象指针或函数指针时,只覆盖相应类型的指针。
__near: 16位指针。
__far:32位指针,但它所指向的对象必须全部位于都一个段中(所有的对象均不得超过64KB)。
也就是说,一旦载入段寄存器后,你就可以取得段内所有对象的地址。
__huge:32为指针,上述所有对段的限制都不存在。
char __huge *banana;
注意这些关键字所修改的是它们右边紧邻的项目。与之相反的是,const和volatile类型修饰所修改
的是它们左边紧邻的项目。
在缺省设置之外,你总是可以在任何模式下自行显式地声明near、far和huge指针。huge指针始终会按照它的规范形式的值进行比较和指针运算。在规范形式下,指针的偏移地址的范围是0~15。如果两个指针都是规范形式的,那么以unsigned long为类型进行的比较将会得到正确的结果。
内存扩展方案(expander)和内存扩充方案(extender)
每一个运行于MS-DOS的程序都拥有了不受系统限制的特权,这样便很容易受到病毒软件的攻击。
边栏推荐
猜你喜欢

Common gadgets of shell (sort, uniq, tr, cut)

深入理解AVLTree【旋转控制平衡(单旋、双旋)】

我的笔记汇总(整理中)

Dreamweaving document for the manuscript to be reviewed causes the tag tag document to disappear bug fix

免费的云数据库平台Planetscale

Matplotlib

JVM:(二)类加载子系统

1408. 数组中的字符串匹配

《迁移学习导论》第2版,升级内容抢先看!(文末赠书)

13. Implementation of paging loading datasets for SAP ABAP OData service (Paging)
随机推荐
1408. 数组中的字符串匹配
ASEMI整流桥GBL610参数,GBL610尺寸,GBL610特征
个人应该如何开户炒股票?开户安全吗?
面渣逆袭:Redis连环五十二问!三万字+八十图详解 上
The number of items displayed on each page of the dedecms search result page does not take effect
[C Supplement] Example of the difference between int *a[1], int (*a)[10], int (*a)(int), etc.
ViewDataBinding找不到自定义view的类
Ali, phoenix architecture have to pay first book guide to build large-scale distributed systems so precious
为什么要ROS2而不是对ROS1修修补补?
Douyin slider verification scheme s_v_web_id parameter analysis
MODBUS to PROFINET gateway to connect power intelligent monitoring instrument to PROFINET network case
【瑞吉外卖】day02:后台系统登录、退出功能
[St. Regis Takeaway] day02: Log in and log out of the background system
数字化转型要避免“唯技术论”!
百盛新纪元代理2C快充方案(5)
挖财帮开通的华泰证券VIP账户是安全的吗?怎么开
n个数的全排列
Machine Learning: How to implement undersampling and oversampling?How to install imlearn?
好教程推荐系列:收录常见的Qt面试题
组件开发实战-数字输入框和标签页组件