I have two questions about virtual address layout of kernel on x86 and x64 system.As far as I know, x86 uses the splited memory layout that is highmem and lowmem.If my understanding is correct, the only difference between highmem and lowmem is whether it has 1:1 virtual to physical address mapping or not. Also, it seems that lowmem contains code and data frequently accessed by the kernel program and highmem contains the page tables or userlevel program data which is not frequently accessed. However, I cannot understand the reason the x86 kernel splits the virtual address spaces and locates the frequently accessed data and code to lowmem. What is the advantage of it? It seems that regardless of the location of the kernel memory, page table walking should be invoked to get virtual to physical mappings. If it is correct, it seems that there is no advantage of the highmem and lowmem. Here, my first question is, if lowmem uses the 1:1 mappings (i.e., physical address + constant(0x80000000) => kernel virtual address) why the MMU spends its clock to walk the page table to know the virtual to physical mappings. If possible, we can modify the MMU logic to make it only minus magic constant from the virtual address to get a physical address if it is located in lowmem region.or is there any other reasons to locate frequently accessed data and code into the lowmem? And why only the lowmem uses the 1:1 mappings...?My second question is does lowmem and highmem memory split mechanism deployed in the x64 linux system also? Thanks in advance 
Questions about kernel virtual address layout
linux;virtual memory;x86
Highmem and lowmem are related to the Physical Address Extension on x86 processors. This mechanism enables the processor to address 64GB of memory, instead of the conventional 4GB. However, because the instruction set is unchanged, and the registers and pointers are still 32 bit long, the virtual address space is still limited to 4GB. Machine instructions always use virtual addresses, not physical addresses.The consequence of this is that highmem cannot be directly addressed at all until it is mapped into the addressable region. This is why only lowmem uses the 1:1 mapping; mapping to highmem is not possible.Your next question was: why can't the MMU logic be simplified to skip page tables and do a simple subtraction to get the physical address? The MMU is implemented in hardware, and it is designed to use page tables (and the TLB) to do its job. Huge pages exist, though, which skip one level in the page tables, making the page size 4MB instead of 4kB on the x86.Your last question: is the memory split in lowmem and highmem on the x64 architecture too? No. The PAE mechanism is a bit of a kludge to extend the lifetime of the x86. The x64 with its much larger address spaces (both physical and virtual) does not need it.