|
作者:小牛呼噜噜
大家好,我是呼噜噜,由于x86保护模式是比较复杂晦涩的,所以特地单拉出来,实模式和保护模式一个重要的更新就是对内存的管理与保护,并且随着软件的发展,为了极致地压榨CPU的性能,硬件和软件都做出了许多努力,为了更好的管理内存,引入分段,分页,段页等等。本文会沿着内存的主线,穿插于实模式和保护模式之间,并结合历史渊源,更好地讲解这里面的发展与变化。
实模式
代号8086
当计算机启动时,实模式运行的时间对我们人来说是无感的,但是并不是其不重要,本文笔者想讲的故事,它的起点来源一个产品,一个划时代芯片,8086,其是Intel公司推出的最早,也是最流行的面向个人电脑的CPU型号
我们可以看到上图有10个引脚,由于芯片是对称的,所以8086芯片一共(只)有20个引脚。不像现在的CPU那样成百上千的都有,脚这么多可不仅仅是为了爬得快
我们一起来看下8086的引脚图:
这些引脚有哪些作用?主要有下面这几种:
- 电源线Vcc(40),地线GND(1和20)
- 地址/数据引脚
- 地址/数据 分时复用引脚AD15-AD0(39,2-16):传送地址时单向输出,传送数据时双向输入或输出
- 地址状态 分时复用引脚A19/S6~ A16/S3(35-38):输出、三态引脚。T1状态做地址线,T2-T4状态用于输出状态信息
- 所谓分时复用就是在同一根传输线上,在不同时间传送不同的信息,所以8086对应的地址线16+4=20根
- NMI(17):非屏蔽中断请求信号,不受IF影响,此信号一出现,当前指令,执行结束后立即进行中断处理。
- INTR(18):可屏蔽中断请求信号,输入高电平有效。
- CLK(19):系统时钟,输入
- RESET(21):复位信号,输入,高电平有效。复位信号使处理器马上结束现行操作,对处理器的内部寄存器进行初始化
- READY(22):数据准备好信号线,输入,高电平有效,由存储器或I/O端口发来。CPU在每个总线周期的T3状态对READY采样,若为低电平,则自动插入一个或几个等待状态Tw,直到变为高电平才能进入T4状态
- TEST(23):等待测试信号,输入,CPU执行 WAIT指令时,每隔5个时钟周期对引脚进行一次测试,若为高电平,CPU处于等待状态;低电平时执行下一条指令。
- RD(32):读控制信号,输出。RD=0,表示执行一个对存储器或I/O端口的读操作。
- BHE/S7(34):高八位数据总线允许/状态复用引脚输出。
- MN/MX(33):最小/最大工作方式控制信号,输入。接高电平时为最小工作方式。
- ...大家了解一下即可
复制代码 这里需要特别注意地址总线,我们知道CPU除了还能访问内存,还能访问硬件,这些都是通过总线来实现的。
总线是贯穿整个系统的是一组电子管道,是连接各个部件的信息传输线,是各个部件共享的传输介质,称作总线,它携带信息字节并负责在各个计算机部件间传递。总线按系统总线传输信息内容的不同,可以分为3 种:数据总线、地址总线和控制总线。
我们可以发现8086的寻址空间是1M,这个是怎么得来的呢?寻址空间主要受地址总线宽度影响,地址总线宽度20,也就表示有20根地址线,又因为内存的单位是字节Byte,所以2^20B=1024KB=1MB
对总线感兴趣地,拓展可见:什么是计算机中的高速公路-总线?
分段机制
由于8086那个时代CPU、内存都很昂贵, CPU 和寄存器等宽度都是 16 位的,在段不重叠的情况下,能表示的最大地址0xFFFF,最大可寻址2^16=64KB,然而8086有20根地址线,可寻址的最大内存空间是1MB。CPU和寄存器的寻址能力远远不能满足使用
所以Inte工程师们耗尽头发,发明了分段技术,将内存分为一个个"段",段最大可为64KB,段由三部分组成:
- 段基址(Base address):段的初始地址
- 段界限(limit):表示段的长度,段界限决定了偏移量的最大值,也就是段内偏移最大能够寻址到的位置,
- 段属性(Attributes):表示段的属性,比如是否可读,可写,权限等
那么16 的位的寄存器究竟该如何能访问20位的地址空间呢?
计算方式是: 实际物理地址 = segment段基址 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|