James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1033回复:8

请教大家一个保护模式的概念。(立刻给分)

楼主#
更多 发布于:2002-06-06 14:31
下面是我看到的一些概念:

WIN32 程序运行在保护模式下的,保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而只是说能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范,否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此\"看\"到别的程序的内容,这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。
和 16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是\"平坦\"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间,这对于程序员来说是非常方便的,这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程,有许多重要的规则需要遵守。有一条很重要的是:Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,这样当您要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们,一个最显著的应用例子就是 Windows 的 CallBack 函数中。


我不明白的是:
每个程序只能有一个段吗?每个任务不是有一个LDT表吗?LDT表不就是描述一个程序有几个段吗?

究竟一个程序编译完毕以后,到底有几个段,是谁划分的?

请大虾指教。

[编辑 -  6/6/02 by  Jim_little]
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-06 15:32
大家帮帮忙吧!谢谢!立即给分。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-07 08:39
没人回答吗?
失望中。。。。。。
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-07 08:51
段,页 是管理内存的概念。 段是实模式下的内存管理概念。
在保护模式没有 段 的概念。只有 页 的概念。

一个进程的所有 代码和数据都在 一个 4G 空间中。



努力呀,还有许多东西不会呢。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-07 09:10
shou jian xiang
fnight
驱动小牛
驱动小牛
  • 注册日期2001-10-20
  • 最后登录2005-06-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-07 09:12
 

我不明白的是:
每个程序只能有一个段吗?每个任务不是有一个LDT表吗?LDT表不就是描述一个程序有几个段吗?
究竟一个程序编译完毕以后,到底有几个段,是谁划分的?
 

1.win32程序
sorry,
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-07 09:27
回Fnight:
/********
一个程序编译完毕以后,就一段.哕\行
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
fnight
驱动小牛
驱动小牛
  • 注册日期2001-10-20
  • 最后登录2005-06-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-07 15:06
1.OS在LDT中是不区分代码段和数据段的,它只是虚拟地址到食地址的弈
sorry,
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-07 15:15
谢谢大家!
以前这部分老是迷惑,现在有些懂了!
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
游客

返回顶部