- 论坛徽章:
- 0
|
/*
* Enable paging
*/
movl $swapper_pg_dir-__PAGE_OFFSET,%eax
movl %eax,%cr3 /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 /* ..and set paging (PG) bit */
ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
如上是head.s中启用分页的代码。
其中第一句应该是取swapper_pg_dir变量的物理地址。__PAGE_OFFSET为0xc0000000,是内核线性地址的开始位置。
我的问题是怎么保证swapper_pg_dir的线性地址是0xc0000000之后的?
因为内核代码段和数据段的基址都是从0地址开始的,因此swapper_pg_dir的逻辑地址要大于0xc0000000.
是编译器把内核的起始逻辑地址放到0xc0000000位置?另外刚起机的一些初始化代码运行在实模式,逻辑地址不会超过0xc0000000,那么内核分为两个部分编译吗?
请各位高手指点一下,谢谢! |
|