关于Page Global Directory初始化的问题!
我现在看的是ULK2。内核的PGD初始化时,swapper_pg_dir的值关系到PGD在RAM中的位置。
但是我没看到书上写这个值是如何设定的,请高手指点一下。谢谢! jjww, can u explain this? i forget it already.:oops:
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恰好就是页目录表的起始地址。 hehe, thx.
:-D 明白了,非常感谢!
希望以后多多指导哈! 我的理解:
CR3是PDE在物理内存的地址
而PDE映射到虚拟地址是0xC0101000.
页:
[1]