Cyrill Gorcunov

Email: <gorcunov AT SPAMFREE gmail DOT com>

My notes on Linux kernel internals

x86-32 memory initialization

Paging is initialized in arch/x86/mm/init_32.c. The function 'paging_init()' is called once by setup_arch during kernel initialization. It immediately calls pagetable_init(). pagetable_init() starts by defining the base of the page table directory:

*pgd_base = swapper_pg_dir;

swapper_pg_dir is defined in head_32.S as

.section ".bss.page_aligned","wa"
        .align PAGE_SIZE_asm
        .fill 1024,4,0

that creates an array of 1024 entries each of 4 bytes length (Page Directory entries in terms of Intel manual). A such definition allows ld program to place swapper_pg_dir at special predefined memory address while linking a kernel. It points to 0x1000 above the 'root' of kernel memory. Kernel memory is defined to start at PAGE_OFFSET, which is 0XC0000000 for x86, or 3 gigabytes. (This is where the 3G/1G split is defined.) Every virtual address above PAGE_OFFSET is the kernel, any address below PAGE_OFFSET is a user space. Further is available on

x86-64 memory initialization

Will write soon...

x86-32 memory initialization (SMP)

To be continued... Probably ;)


LinuxMM: CyrillGorcunov (last edited 2017-12-30 01:05:10 by localhost)