ttao_wu 发表于 2003-8-18 12:24:48

关于Page Global Directory初始化的问题!

我现在看的是ULK2。
内核的PGD初始化时,swapper_pg_dir的值关系到PGD在RAM中的位置。
但是我没看到书上写这个值是如何设定的,请高手指点一下。谢谢!

Dragonfly 发表于 2003-8-18 23:27:31

jjww, can u explain this? i forget it already.:oops:

jianliang79 发表于 2003-8-27 12:58:27

Re: 关于Page Global Directory初始化的问题!

我现在看的是ULK2。
内核的PGD初始化时,swapper_pg_dir的值关系到PGD在RAM中的位置。
但是我没看到书上写这个值是如何设定的,请高手指点一下。谢谢!

swapper_pg_dir的值是在内核连接后确定的,而整个内核连接后的首地址由vmlinux.lds文件指定,是0xC0100000。swapper_pg_dir的值就是0xC0100000加上它在整个内核中的偏移量。head.s中有如下语句:

.org 0x1000
ENTRY(swapper_pg_dir)

也就是说swapper_pg_dir的偏移是0x1000,因此最终swapper_pg_dir的值是0xC0101000。

内核初始化CR3寄存器的语句如下:
movl $swapper_pg_dir-__PAGE_OFFSET,%eax
movl %eax,%cr3

这里的__PAGE_OFFSET就是0xC0000000。因此最终cr3中的内容是0x101000。由于内核加载时被放在内存的1MB开始的地方,也就是0x100000,这样0x101000恰好就是页目录表的起始地址。

Dragonfly 发表于 2003-8-27 21:28:26

hehe, thx.
:-D

ttao_wu 发表于 2003-8-28 11:37:03

明白了,非常感谢!
希望以后多多指导哈!

yusong 发表于 2003-9-14 23:55:55

我的理解:

CR3是PDE在物理内存的地址

而PDE映射到虚拟地址是0xC0101000.
页: [1]
查看完整版本: 关于Page Global Directory初始化的问题!