|
|
|
|
| 指令"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 下用吗? - baowen [ 2005-06-26 12:54 | 141 byte(s)]
 Re: 指令"lgdt" 可以在protect mode 下用吗? - coly [ 2005-06-26 13:18 | 1,139 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
我看到手册上说"lgdt"用于在从real-mode 到 protect-mode的切换前.
我的问题是在protect-mode 状态下, lgdt 能用吗?
|
|
|
----
AVICINAR-AKA 无所为,无所不为.
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
那如果现在的映射方式是flat mode, 即:
1. 无page map.
2. base address 为 0.
在这种情况下,需要注意什么呢?
|
|
|
----
AVICINAR-AKA 无所为,无所不为.
|
|
[Original]
[Print]
[Top]
|
|
[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]
|
|
|