title: zone_NORMAL and ZONE_HIGHMEM on 32 and 64 bit kernels
body: <p>I trying to to make the linux memory management a little bit more clear for tuning and performances purposes.</p>
  
  <p>By reading this very interesting redbook "Linux Performance and Tuning Guidelines" found on the <a href="http://www.redbooks.ibm.com/abstracts/redp4285.html" rel="nofollow">IBM website</a> I came across something I don't fully understand.</p>
  
  <blockquote>
    <p>On 32-bit architectures such as the IA-32, the Linux kernel can directly address only the first gigabyte of physical memory (896 MB when considering the reserved range). Memory above the so-called <code>ZONE_NORMAL</code> must be mapped into the lower 1 GB. This mapping is completely transparent to applications, but allocating a memory page in <code>ZONE_HIGHMEM</code> causes a small performance degradation.</p>
  </blockquote>
  
  <ol>
  <li>why the memory above 896 MB has to be mapped into the lower 1GB ?</li>
  <li>Why there is an impact on performances by allocating a memory page in <code>ZONE_HIGHMEM</code> ? </li>
  <li>what is the <code>ZONE_HIGHMEM</code> used for then ?</li>
  <li>why a kernel that is able to recognize up to 4gb ( <code>CONFIG_HIGHMEM=y</code> ) can just use the first gigabyte ?</li>
  </ol>
  
  <p>Thanks in advance</p>