codecamp

计算机实模式和保护模式

实模式

在实模式下,内存被限制为仅有1M字节(220 字节)。有效的地址从00000到FFFFF (十六进制)。这些地址需要用20位的数来表示。显然,一个20位的数不适合任何一个8086的16位寄存器。Intel通过利用两个16位数值来决定一个地址的方法来解决这个问题。开始的16位值称为段地址(selector)。

段地址的值必须存储在段寄存器中。第二个16位值称为偏移地址(offset)。用32位段地址:

偏移地址表示的物理地址可以由下面的公式计算:

16 * selector + offset

在十六进制中乘以16是非常容易的,只需要在数的右边加0。例如:表示为047C:0048的物理地址通过这样得到:

047C:0048的物理地址

实际上,段地址的值是一节的首地址(看表1.2)。

内存单元
真实的段地址有以下的缺点:

1、一个段地址只能指向64K内存(16位偏移的上限)。如果一个程序拥有大于64K的代码那又怎么办呢?在CS里的一个单一的值不能满足整个程序执行的需要。程序必须分成小于64K的段(segment)。当执行从一段移到另一段时,CS里的值必须改变。同样的问题发生在大量的数据和DS 寄存器之间。这样使用是非常不方便的!

2、每个字节在内存里并不只有唯一的段地址。物理地址04808可以表示为:047C:0048,047D:0038,047E:0028 或047B:0058。这将使段地址的比较变得复杂。

16位保护模式

在80286的16位保护模式下,段地址的值与实模式相比解释得完全不同。在实模式下,一个段地址的值是物理内存里的一节的首地址。在保护模式下,一个段地址的值是一个指向描述符表的指针。两种模式下,程序都是被分成段。在实模式下,这些段在物理内存的固定位置而且段地址的值表示段开始处所在节的首地址。在保护模式下,这些段不是在物理内存

的固定的地址。事实上,它们根本不一定需要在内存中。


保护模式使用了一种叫做虚拟内存的技术。虚拟内存的基本思想是仅仅保存程序现在正在使用的代码和数据到内存中。其它数据和代码暂时储存在硬盘中直到它们再次需要时。当一段从硬盘重新回到内存中,它很有可能放在不同于它移动到硬盘之前时的位置的内存中。所有这些都由操作系统透明地执行。程序并不需要因为要让虚拟内存工作而使用不同的书写方法。


在保护模式下,每一段都分配了一条描述符表里的条目。这个条目拥有系统想知道的关于这段的所有信息。这些信息包括:现在是否在内存中;如果在内存中,在哪;访问权限(例如: 只读)。段的条目的指针是储存在段寄存器里的段地址值。


16位保护模式的一个大的一 个 非 常 著 名 的PC专 缺点是偏移地址依然是16位数。这个的后果就是段的大小依然限制为最大64K。这会导致使用大的数组时会有问题。


32位保护模式

80386引入了32位保护模式。386 32位保护模式和286 16位保护模式之间
最主要的区别是:

1. 偏移地址扩展成了32位。这就允许偏移地址范围升至4G。因此,段的大小也升至4G。

2. 段可以分成较小的4K大小的单元,称为内存页。虚拟内存系统工作在页的方式下,代替了段方式。这就意味着一段在任何一个时刻只有部分可能在内存中。在28616位保护模式下,要么整个段在内存中,要么整个不在。这样在32位模式下允许的大的段的情况下很不实用。

在Windows 3.x系统中,标准模式为286 16位保护模式而增强模式为32位保护模式。Windows 9X,Windows NT/2000/XP,OS/2和Linux都运行在分页管理的32位保护模式下。

中断

有时候普通的程序流必须可以被要求快速反应的处理事件中断。电脑提供了一个称为中断的结构来处理这些事件。例如:当一个鼠标移动了,硬件鼠标中断现在的程序来处理鼠标移动(移动鼠标,等等)。中断导致控制权转移到一个中断处理程序。中断处理程序是处理中断的程序。每种类型的中断都分配了一个中断号。在物理内存的开始处,存在一张包含中断处理
程序段地址的中断向量表。中断号是这张表中最基本的指针。

外部中断由CPU的外部引起。(鼠标就是这一类型的例子。)许多I/O设备引起中断(例如:键盘,时钟,硬盘驱动器,CD-ROM和声卡)。内部中断由CPU的内部引起,要么是由一个错误引起,要么由中断指令引起。错误中断称为陷阱。由中断指令引起的中断称为软中断。DOS使用这些类型的中断来实现它的API(应用程序接口)。许多现代的操作系统(如:Windows和UNIX)使用一个基于C的接口。

许多中断处理程序当它执行完成时,将控制权返回给被中断的程序。它们恢复寄存器,里面的值与中断发生之前的值相同。因此,被中断的程序就像没有任何事情发生一样运行(除了它失去了一些CPU周期)。陷阱通常不返回。通常它们中止程序。
计算机内存和CPU的基础知识
计算机汇编语言和指令操作
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }