This is the memory layout of a standard process : This can be changed by the app : - 0x00100000 to 0x20000000 Application's code and static data - 0x20000000 to 0xB0000000 Application's heap - 0xB0000000 to 0xBF000000 Stacks (automatically allocated by kernel, size 0x8000=32k each) This is necessary : - 0xC0000000 to 0xFFFFFFFF Kernel code and heap The beginning of the kernel code at 0xC0000000 corresponds to the linker-defined symbol k_highhalf_addr, that is used at as many places as possible. If this address was to be changed, it would have to be changed in two places : - link.ld, change address of k_highhalf_addr; - loader_.asm, update the temporary GDT structure data.