I am confused with the ZONEs and HIGH memory.
Memory within ZONE_NORMAL is
directly mapped by the kernel into the upper region of the linear
address space. This is the physical memory directly accessible by the
kernel and is related to the kernel/userspace split in the linear
address space marked by PAGE_OFFSET.
Why ZONE_NORMAL is directly mapped into upper region of the linear address space? I think here PAGE_OFFSET (3GB) indicates the upper region of the linear
address space ?
ZONE_HIGHMEM is the remaining available memory in the system and is not directly mapped by the kernel.
Generally,
ZONE_DMA First 16MiB of memory
ZONE_NORMAL 16MiB � 896MiB
ZONE_HIGHMEM 896 MiB � End
Now, the previous para says ZONE_NORMAL is at PAGE_OFFSET (3GB) but, this table indicates it at 16 MB ?
Because the address space usable by the kernel (ZONE_NORMAL) is limited in size, the kernel has support for the concept of high memory. Two thresholds of high memory exist on 32-bit x86 systems, one at 4GiB and a second at 64GiB. The 4GiB limit is related to the amount of memory that may be addressed by a 32-bit physical address. To access memory between the range of 1GiB and 4GiB, the kernel temporarily maps pages from high memory into ZONE_NORMAL with kmap().
What is the size of the ZONE_NORMAL? I think it is 1GB - 128 bytes.
This is what I have concluded
1. ZONE_NORMAL is from 16MB - 896MB. ==> address space usable by the kernel
2. High memory is from 1GB-4GB ==> to access this part of memory kernel has to temporarily map pages from high memory into ZONE_NORMAL. So, ZONE_HIGHMEM must be from 1GB-4GB and not from 896 MiB � End
3. I am not getting at all how kernel/userspace split is related to ZONE_NORMAL and ZONE_HIGHMEM?
I think I have put so many questions, please educate me. Thanks in advance.
Thanks and Regards,
Prasad.