Hi list, AFAIK, in the initializaion phase, kernel builds pages tables with two mappings, identity and PAGE_OFFSET + C mapping. The provisional _global directory_ is contained in swapper_pg_dir variable. while the provisional _page tables_ are stored starting from pg0, right after _end.
There're some stuff that confused me for a full day about the code (head.S) that accomplishes the above words: movl $(pg0 - __PAGE_OFFSET), %edi movl $(swapper_pg_dir - __PAGE_OFFSET), %edx movl $0x007, %eax /* 0x007 = PRESENT+RW+USER */ 10: leal $0x007(%edi),%ecx /* Create PDE entry */ What does the address of 7 bytes displacement after %edi - the physical address of pg0 - represent ?. Why not just putting the address of %edi (the address of pagetable cell to be mapped by swapper_pg_dir) in %ecx without displacement? page_pde_offset = (__PAGE_OFFSET >> 20) movl %ecx,(%edx) /* Store identity PDE entry */ movl %ecx,page_pde_offset(%edx) /* Store kernel PDE entry */ Why the pde_offset is PAGE_OFFSET >> 20 instead of PAGE_OFFSET >> 22 ? * 22 to right shift the whole page_shift (12) and pgdir_shift (10) bits. [...] /* Initialize the 1024 _page table_ cells with %eax (0x007) */ movl $1024, %ecx 11: stosl addl $0x1000,%eax loop 11b The page table entries beginning from pg0 (pointed by %edi) and following pages are initialized with the series 7 + 8 + 8 + ... for each cell. This series has the property of setting the PRESENT+RW+USER bits in the whole entries to 1 but it sets lots of the entries BASE address to 0 too. Why is this done ? Thanks, -- Ahmed S. Darwish HomePage: http://darwish.07.googlepages.com Blog: http://darwish-07.blogspot.com - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/