鱼C论坛

 找回密码
 立即注册
查看: 2740|回复: 0

[学习笔记] X86汇编语言-从实模式到保护模式—笔记(36)-第14章 任务和特权级保护(2)

[复制链接]
发表于 2017-12-7 22:01:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 兰陵月 于 2017-12-15 12:21 编辑

14.1.2 全局空间和局部空间

每个任务实际上包括两个部分:全局部分和私有部分。全局部分是所有任务共有的,含有操作系统的软件和库程序,以及可以调用的系统服务和数据;私有部分则是每个任务各自的数据和代码,与任务所要解决的具体问题有关,彼此并不相同。如图14-002和图14-003。

14-002.png


14-003.png

任务实际上是在内存中运行的,所以,所谓的全局部分和私有部分,其实是地址空间的划分,即全局地址空间和局部地址空间,简称全部空间和局部空间。

地址空间的访问是依靠分段机制来进行的。具体地说,需要先在描述符表中定义各个段的描述符,然后再通过描述符来访问它们。因此,全局地址空间是用全局描述符表(GDT)来指定的,而局部地址空间则是由每个任务私有的局部描述符表(LDT)来定义的。

从程序员的角度来看,任务的全局空间包含了操作系统的段,是由别人编写的,但是他可以调用这些段的代码,或者获取这些段中的数据;任务局部空间的内容是由程序员自己创建的。通常,任务会在自己的局部空间运行,当它需要操作系统提供的服务时,转入全局空间执行。

每个段描述符对应着一个内存段。很显然,在一个任务的全局地址空间上,可以划分出2^13个段,也就是8192个段。又因为段内偏移是32位的,段的最大长度可以达到4GB,因此,一个任务的全局地址空间,其总大小为2^13×2^32=2^45字节,即32TB。同样的道理,局部描述符表LDT可以定义2^13个,也就是8192个描述符,每个段的最大长度也是4GB,所以一个任务的局部地址空间最大也是32TB。

这样一来,每个任务的总地址空间为64TB。在一个只有32根地址线的处理器上,无论如何也不可能提供这样巨大的存储空间,但是不要紧张,这只是虚假的,或者说虚拟的地址空间。操作系统允许程序的编写者使用该地址空间来写程序,即,使用虚拟地址或者逻辑地址来访问内存,就像他真的拥有这么巨大的地址空间一样。
编译器不考虑处理器可寻址空间的大小,也不考虑物理内存的大小,它只是负责编译程序。当程序编译时,编译器允许生成非常巨大的程序。但是,当程序超出了物理内存的大小时,或者操作系统无法分配这么大的物理内存空间时,怎么办呢?

同一块物理内存,可以让多个任务,或者每个任务的不同段来使用。当执行或者访问一个新的段时,如果它不在物理内存中,而且也没有空闲的物理内存空间来加载它,那么,操作系统将挑出一个暂时用不到的段,把它换出到磁盘中,并把那个腾出来的空间分配给马上要访问的段,并修改段的描述符,使之指向这段内存空间。下一次,当被换出的那个段马上又要用到时,再按相同的办法换回到物理内存。所有这一切,任务(如果它有思维的话)和程序的编写者是不必关心的,这就是虚拟内存管理的一般方法。




本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 05:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表