URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 8 » 指令"lgdt" 可以在protect mode 下用吗?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
指令"lgdt" 可以在protect mode 下用吗?
指令"lgdt" 可以在protect mode 下用吗? - baowen [2005-06-25 13:47 | 138 byte(s)]
 
Re: 指令"lgdt" 可以在protect mode 下用吗? - coly [2005-06-25 22:41 | 137 byte(s)]
 
 
Re: 指令"lgdt" 可以在protect mode 下用吗? - coly [2005-06-26 13:18 | 1,139 byte(s)]
 
Subject: 指令"lgdt" 可以在protect mode 下用吗?
Author: baowen    Posted: 2005-06-25 13:47    Length: 138 byte(s)
[Original] [Print] [Top]
我看到手册上说"lgdt"用于在从real-mode 到 protect-mode的切换前.
我的问题是在protect-mode 状态下, lgdt 能用吗?
----
AVICINAR-AKA
无所为,无所不为.
[Original] [Print] [Top]
Subject: Re: 指令"lgdt" 可以在protect mode 下用吗?
Author: coly    Posted: 2005-06-25 22:41    Length: 137 byte(s)
[Original] [Print] [Top]
可以使用。但是在保护模式下使用的时候,似乎输入的应该是gdt描述符的物理地址。所以一定要搞清楚当前的虚拟地址是怎么映射到物理地址的,才可以哦
----
[Original] [Print] [Top]
Subject: Re: 指令"lgdt" 可以在protect mode 下用吗?
Author: baowen    Posted: 2005-06-26 12:54    Length: 141 byte(s)
[Original] [Print] [Top]
那如果现在的映射方式是flat mode, 即:
1. 无page map.
2. base address 为 0.

在这种情况下,需要注意什么呢?
----
AVICINAR-AKA
无所为,无所不为.
[Original] [Print] [Top]
Subject: Re: 指令"lgdt" 可以在protect mode 下用吗?
Author: coly    Posted: 2005-06-26 13:18    Length: 1,139 byte(s)
[Original] [Print] [Top]
关键得看你的源代码的虚拟地址是从什么地方开始的。
如果你在连接脚本中制定让代码从0xc000000开始连接的话,那就必须要有页表将0xc0000000的虚拟地址转换到对应的物理地址(除非你有4GB的内存,那样就可以直接映射到3GB以上的物理内存了)。如果你的源代码的虚拟地址是从0x开始的,那可以不需要页表,直接将gdt中的各个段的base设置为0x0,那么加载gdtr后,通过长跳转更新段描述符后,就可以使用了。

一般来说,如果gdt的基地址为0x0,limit为4GB的话,那就是扁平模式,这时虚拟地址和线性地址数值上是一样的。

我自己写了一个打印hello world的程序,就是将代码连接到0xc0000000上的,所以就不能直接使用全局变量,要引用全局变量,就得使用一个宏:va_to_phy(x) ((x)-0xc0000000)
然后才能在汇编代码中引用变量,但是当设置了gdt和页表之后,将连接到0xc0000000上的虚拟地址可以转换到对应的物理地址后,就可以直接引用全局变量而不需要进行地址转换了。

我觉得,如果你将内核的虚拟地址安排在0x0开始的话,那可能应用程序就要连接到内核地址的虚拟地址空间以上的位置。例如,可以安排内核空间在虚拟地址空间的0-1G,应用程序在1-4G。这样也可以,就是得修改链接应用程序的链接教本。但是这么做的方案也是非常多的,例如menuetos,gisizos
----
[Original] [Print] [Top]
« Previous thread
NP能用于什么样的应用?
CPU 与 编译器
8
Next thread »
error when installing gcc4.0!
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:27, cost 0.049048900604248 ms.