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