80386提供了两种工作模式,其一为实模式,...,其二为保护模式。 ============================================ 根据Intel的手册,其实还应该有个系统管理模式。我没有碰到过在这个模式下工作的程序,感兴趣的同志请自行参考Intel的手册。 不同任务间的保护:通过把不同的任务放在不同的虚拟地址空间中去,来实现不同任务的隔离(即A程序不能访问B 程序的代码和数据) ============================================ 虚拟空间的概念对于刚刚碰386保护模式的同志可能有点难理解,其实是这样的:假设一个程序被你在多任务操作系统里启动了两遍,那么你这个程序在两个实例里看到的虚拟空间其实是一样的,都是0~4G,然而底层的寻址机制能够让这两个实例里同一个数据或者指令虽然具有相同的虚拟地址,然而却有不同的物理地址。我们知道,软件最终要落实到硬件,如果最终的物理地址不一样,那么这两个程序就不会相互干扰了。当然了,如果你硬要让两个程序的某一个虚拟地址对应同一个物理地址也可以,对于操作系统而言是小菜一碟,只要把转换表格小小修改一下就可以达到目的。(具体的寻址方法见下面) 《箴言》一书对386 CPU的保护模式下的寻址给出了flat, segmented模式的寻址方式。 ============================================ 386CPU在进入保护模式之前,实际上要在主存里面初始化好一大堆数据结构的。按照Intel手册自己的说法,The contents of the protected-mode system data structures loaded into memory during software initialization, depend largely on the type of memory management the protected-mode operatingsystem or executive is going to support: flat, flat with paging, segmented, or segmented with paging. 《箴言》一书给出的是一个简单的模型,可能早期的DOS程序员为了访问大内存,在没有OS的支持下选择这种方式。而在现在实际的操作系统里,不会用这种方式,基本上都是flat,paging模式。有的同志也许要问,《箴言》给出的访问模式不是挺好的嘛,简单易懂。那么为什么现在稍微好一点的操作系统不采用这种方式呢? 原因是为了支持“虚拟内存”,只有启用了CPU的paging模式后,才可以设计出高效的虚拟内存管理程序来。何谓虚拟内存,简单的说就是一般应用程序设计者和某些底层操作系统设计者看到的存贮器。我们知道,32位的机器可以寻址4G的地址范围(实际上较新的Intel CPU通过一定的方式可以访问超过4G的物理存贮器,然而它们可以直接访问的虚拟存贮器还是4G),而我们绝大多数的同志并没有这么多的存贮器,怎么办?利用paging功能,在OS的支持下,就可以给程序员提供一个虚拟的存贮器,其大小是4G(当然,现在的操作系统并没有把全部4G给普通程序,而是保留了一些给OS内核,比如Linux好像就是给应用程序留下了3G的虚拟空间)。这种所谓的“虚拟内存”是如何实现的呢,要回答这个问题就必须从CPU在启用了paging后如何得到物理地址的过程说起。 |
正在阅读:《编程高手箴言》读后感(2)《编程高手箴言》读后感(2)
2004-04-05 14:41
出处:CSDN
责任编辑:sdq
键盘也能翻页,试试“← →”键