<div dir="ltr">Hi Arun,<div><br></div><div>Thanks for that excellent explanation. It&#39;s more or less clear to me now.</div><div><br></div><div>However, quoting what you said:</div><div><br></div><div><span style="font-size:11.1999998092651px">Because we have plenty of kernel virtual</span><br style="font-size:11.1999998092651px"><span style="font-size:11.1999998092651px">address(3GB) and can easily map 2GB of RAM in to it.</span><br></div><div><br></div><div>Why should we have to map the whole RAM into the KVA? Shouldn&#39;t it be only LOW_MEM?</div><div><br></div><div>I also read on a stack overflow thread that LOW_MEM is memory that is permanently mapped into KVA, while HIGH_MEM is mapped as required. Is this true?</div><div><br></div><div>Thanks,</div><div>Sunny</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 15, 2015 at 1:17 PM, Arun KS <span dir="ltr">&lt;<a href="mailto:getarunks@gmail.com" target="_blank">getarunks@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Sunny,<br>
<span class=""><br>
On Sat, Mar 14, 2015 at 8:25 PM, Sunny Shah &lt;<a href="mailto:shahsunny715@gmail.com">shahsunny715@gmail.com</a>&gt; wrote:<br>
&gt; Thank you guys!<br>
&gt;<br>
&gt; I have two more questions from your replies:<br>
&gt;<br>
&gt; I thought I had understood HIGH_MEM and LOW_MEM, but it appears I was wrong.<br>
&gt; Does the concept of high memory/low memory correspond to physical address<br>
&gt; space or virtual address space? Also, does LOW_MEM always have to be 1 GiB<br>
&gt; maximum?<br>
<br>
</span>Physical memory is divided into HIGH_MEM and LOW_MEM.<br>
Why do we need two memory?  To understand this, we need to know who<br>
all are consumers of kernel virtual address(KVA) which is limited to<br>
1GB(in case of 3:1 split).<br>
1. low mem( physical ram which has linear mapping to KVA).<br>
2. IO memory address(for eg a DMA controller registers, Memory<br>
controller register, etc). When MMU is enabled all the address<br>
generated by the cpu are virtual address. Hence io memory should have<br>
a valid virtual to physical memory mapping.<br>
3. Vmalloc address space. A dynamic kernel memory allocation<br>
mechanism, which only guarantees continuity in virtual address space.<br>
4. Persistent kernel map. (if kernel want to use HIGH memory, it maps<br>
high memory to this portion of virtual address).<br>
5. vector table.<br>
<br>
Let me give a rough calculation for a better understanding. Lets say a<br>
system with configuration as follows,<br>
2GB of physical RAM, 40 MB of physical io address space, 240 MB of<br>
vmalloc address space, 32 MB for persistent kernel map<br>
The maximum RAM which can be mapped as low mem = 1GB - (40 MB + 240 MB<br>
+ 32MB) = 712MB.<br>
<br>
Rest of RAM 1336MB( 1GB - 712MB) will fall as HIGH_MEM.<br>
<br>
Now how system uses HIGH memory. Major user of HIGH mem is user space<br>
code. Kernel directly maps high mem to user space virtual address.<br>
Hight mem is also used by kernel though PK mappings. Even vmalloc<br>
allocation can also fall from HIGH mem region.<br>
<br>
Now if we decides to use 1:3 user space to kernel space split, high<br>
memory is not required. Because we have plenty of kernel virtual<br>
address(3GB) and can easily map 2GB of RAM in to it.<br>
<br>
HTH.<br>
<br>
Thanks,<br>
Arun<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; For a RAM of  896 MiB - 4096 MiB, the book says:<br>
&gt; &quot;In this case, the RAM cannot be mapped entirely into the kernel linear<br>
&gt; address space. The best Linux can do during the initialization phase is to<br>
&gt; map a RAM window of size 896 MB into the kernel linear address space.&quot;<br>
&gt;<br>
&gt; Why is there a need to map the whole RAM into the kernel space (the usage of<br>
&gt; the word &quot;entirely&quot;) ? Shouldn&#39;t it be only LOW_MEM ? Or am I confusing the<br>
&gt; two things here ?<br>
&gt;<br>
&gt;<br>
&gt; I believe all doubts are pointing to the concepts of LOW_MEM and HIGH_MEM,<br>
&gt; but I&#39;m still not being able to wrap my head around them.<br>
&gt;<br>
&gt; Thanks,<br>
&gt; Sunny<br>
&gt;<br>
&gt; On Thu, Mar 12, 2015 at 11:49 PM, Jeff Haran &lt;<a href="mailto:Jeff.Haran@citrix.com">Jeff.Haran@citrix.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; -----Original Message-----<br>
&gt;&gt; From: <a href="mailto:kernelnewbies-bounces@kernelnewbies.org">kernelnewbies-bounces@kernelnewbies.org</a><br>
&gt;&gt; [mailto:<a href="mailto:kernelnewbies-bounces@kernelnewbies.org">kernelnewbies-bounces@kernelnewbies.org</a>] On Behalf Of Arun KS<br>
&gt;&gt; Sent: Thursday, March 12, 2015 11:03 AM<br>
&gt;&gt; To: Sunny Shah<br>
&gt;&gt; Cc: kernelnewbies<br>
&gt;&gt; Subject: Re: Understanding the mapping of physical memory to kernel<br>
&gt;&gt; address space<br>
&gt;&gt;<br>
&gt;&gt; Hello Sunny,<br>
&gt;&gt;<br>
&gt;&gt; On Thu, Mar 12, 2015 at 10:32 PM, Sunny Shah &lt;<a href="mailto:shahsunny715@gmail.com">shahsunny715@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; Hello,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; This is my first mail on this list, so please let me know if I&#39;m erring.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;m reading Bovet and Cesati&#39;s &quot;Understanding the Linux Kernel&quot;,<br>
&gt;&gt; &gt; specifically the chapter &quot;Memory Addressing&quot;, sub-section &quot;Kernel Page<br>
&gt;&gt; &gt; Tables&quot;. Here they describe how Linux initializes its page tables for<br>
&gt;&gt; &gt; various RAM sizes and how much of the physical address space is mapped<br>
&gt;&gt; &gt; onto the kernel virtual address space.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I have several questions from my reading:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; My understanding is that the 32 bit virtual address space of a process<br>
&gt;&gt; &gt; is split into 2 parts - the first 3 GiB for the user space and the<br>
&gt;&gt; &gt; remaining 1GiB for the kernel (with the same kernel mapping being used<br>
&gt;&gt; &gt; for all processes. However, although the kernel is mapped into the<br>
&gt;&gt; &gt; higher portion of the address space, it resides in the lower 1 GiB of<br>
&gt;&gt; &gt; RAM. Is this correct?<br>
&gt;&gt; Yes. Incase of 3:1 mapping, kernel virtual address starts at 0xc0000000.<br>
&gt;&gt; You can also have 2:2 mappings aswell. It is a configurable option<br>
&gt;&gt;<br>
&gt;&gt; Just an FYI, I&#39;ve seen 1:3 mapping too. We had to do that with the kernels<br>
&gt;&gt; we built<br>
&gt;&gt; when I was at one company because we needed 3GB of virtual address space<br>
&gt;&gt; to map all<br>
&gt;&gt; of the memory mapped registers on their ASICs.<br>
&gt;&gt;<br>
&gt;&gt; There&#39;s lots of options here.<br>
&gt;&gt;<br>
&gt;&gt; Jeff Haran<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
</div></div></blockquote></div><br></div></div>