<div>On Tue, Apr 17, 2012 at 3:46 AM, Pranay Kumar Srivastava <span dir="ltr">&lt;<a href="mailto:Pranay.Shrivastava@hcl.com">Pranay.Shrivastava@hcl.com</a>&gt;</span> wrote:<br></div><div class="gmail_quote"><blockquote style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid" class="gmail_quote">
<div class="HOEnZb"><div class="h5"><br>
<br>
&gt; -----Original Message-----<br>
&gt; From: Vaibhav Jain [mailto:<a href="mailto:vjoss197@gmail.com">vjoss197@gmail.com</a>]<br>
&gt; Sent: Tuesday, April 17, 2012 4:07 PM<br>
&gt; To: Pranay Kumar Srivastava<br>
&gt; Cc: <a href="mailto:kernelnewbies@kernelnewbies.org">kernelnewbies@kernelnewbies.org</a><br>
&gt; Subject: Re: identity mapped paging (Vaibhav Jain)<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Apr 13, 2012 at 2:15 AM, Vaibhav Jain &lt;<a href="mailto:vjoss197@gmail.com">vjoss197@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; &gt; I am not clear about the use of identity mapped paging while paging<br>
&gt; is<br>
&gt; &gt; being enabled by the operating system. Also I don&#39;t understand at<br>
&gt; what<br>
&gt; &gt; point are the<br>
&gt; &gt; identity mappings no longer useful.According to this article<br>
&gt; &gt; <a href="http://geezer.osdevbrasil.net/osd/mem/index.htm#identity" target="_blank">http://geezer.osdevbrasil.net/osd/mem/index.htm#identity</a> - &quot;The page<br>
&gt; &gt; table<br>
&gt; &gt; entries used to identity-map kernel memory can be deleted once paging<br>
&gt; &gt; and<br>
&gt; &gt; virtual addresses are enabled.&quot; Can somebody please explain?<br>
&gt; &gt;<br>
&gt;<br>
&gt; Identity mapping is when VA(Virt Address)=PA(Physical address).<br>
&gt;<br>
&gt; So basically when you set up your page tables you need to make sure<br>
&gt; they map identically. This is very easily done if you consider each 4KB<br>
&gt; block as a page beginning from location 0 upto whatever you&#39;ve found to<br>
&gt; be the highest memory available either thru BIOS or GRUB.<br>
&gt;<br>
&gt; Remember that while setting up your PTEs and PDE every address is a<br>
&gt; physical one. So if you thought that your kernel would be linked<br>
&gt; initially to a higher VA since you would remap it to a lower memory<br>
&gt; physically then that would be WRONG!. Without PTEs and PDEs installed<br>
&gt; don&#39;t do that!.<br>
&gt;<br>
&gt; Why would you want it? Well for a simple reason, when your kernel<br>
&gt; starts to boot there&#39;s no translator,(No PTEs/PDEs and the Paging<br>
&gt; Enabled bit of processor is also cleared AFAIK just after the BIOS is<br>
&gt; done), yet since you&#39;ve not enabled your processor for that but you&#39;ll<br>
&gt; be doing that in a moment.<br>
&gt;<br>
&gt; So let&#39;s say you made your kernel to be linked to higher VA like 3Gigs.<br>
&gt; Now the addresses would be generated beginning 3Gigs however you still<br>
&gt; don&#39;t have the Page tables installed since your kernel just started. So<br>
&gt; in that case the address is the physical address. And if you&#39;ve not<br>
&gt; loaded your kernel beginning 3Gigs then it would definitely come<br>
&gt; crashing down.<br>
&gt;<br>
&gt; To avoid the crash in case you made your kernel to link to higher half<br>
&gt; of the memory, you can use GDT trick since segmentation is always on<br>
&gt; and you can make the overflow of the address addition to translate to a<br>
&gt; lower physical memory even if paging is not enabled yet. Thus it is<br>
&gt; possible to load the kernel at lower memory addresses while the linkage<br>
&gt; would be for higher VMA. And once your PTEs/PGD are enabled then you<br>
&gt; can use those instead of the GDT trick.<br>
&gt;<br>
&gt; Here&#39;s a link to that <a href="http://wiki.osdev.org/Higher_Half_With_GDT" target="_blank">http://wiki.osdev.org/Higher_Half_With_GDT</a><br>
&gt;<br>
&gt; &gt; Thanks<br>
&gt; &gt; Vaibhav Jain<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; Thanks for replying but I am still confused. I continued reading about<br>
&gt; this thing and what<br>
&gt; I have understood is the following :<br>
&gt; After the kernel executes the instruction to enable paging the<br>
&gt; instruction pointer will contain the<br>
&gt; address of the next instruction which will now be treated as a virtual<br>
&gt; address. So for the next instruction to be executed<br>
&gt; the page table should map this address to itself.<br>
&gt; Please correct me if I am wrong.<br>
&gt; I am confused by the point about linking  the kernel to higher address.<br>
&gt; Could you please put that in a step by step manner<br>
&gt; to make it clear what  happens before paging is enabled and what<br>
&gt; happens after that.<br>
&gt; Also, please explain at what point during the execution of kernel code<br>
&gt; are the identity-mapped addresses no longer useful ?<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Thanks<br>
&gt; Vaibhav<br>
&gt; Hi,<br>
&gt;<br>
&gt; I am somewhat understanding your point. But I have some other queries<br>
&gt; now in my mind.<br>
&gt;<br>
&gt; If the kernel is linked to 3Gigs is there a way other than the GDT<br>
&gt; trick.?<br>
<br>
</div></div>Make your load address = VA when you link so you won&#39;t have to worry about doing the GDT trick.<br>
<div class="im"><br>
&gt;<br>
&gt; In fact I am wondering that if the kernel is linked to 3Gigs and Grub<br>
&gt; loads it at 1MB physical, how will even the first instruction of kernel<br>
&gt; execute ?  I mean if all the address generated by kernel are above 3<br>
&gt; Gigs and paging is not enabled how will it start<br>
&gt; running ?<br>
<br>
</div>That&#39;s what the GDT trick is for. If you read the intel/amd processor manuals the segmentation is always on. So when the address get generated your segment&#39;s base address is still added to the generated address before it is put on wire. You can add a constant offset (in your GDT&#39;s base address part) to the generated address to get the address beginning from the load address of your kernel.<br>

<br>
I would suggest you make the higher half kernel later and try to first create some code that can fragment your available memory into pages and store this information so you&#39;ll know what all pages are there. Next would be to do identity mapping, since your kernel VMA=LMA in your linker script this would be easier to do.<br>

<br>
When you get that paging enabled you can move on to higher half kernel. I would suggest you to work on page replacement algos and virtual memory management code side by side for better integration with paging in later stages.<br>

<br>
Maybe you can post your code if you are allowed to then I can have a look at it.<br>
<br>
&gt;<br>
&gt; Thanks<br>
&gt; Vaibhav Jain<br>
<div class="HOEnZb"><div class="h5"><br>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------</div></div></blockquote></div><div><br> </div><div><div>Thanks for the explanation!!  Please confirm what I have concluded :</div>
<div> </div><div>- If the kernel is linked to the same address it is loaded at , identiy-mapping is required so that all the addresses generated by the kernel map to correct memory.</div><div> </div><div>- If the kernel is NOT loaded at  the same address it is linked to (for e.g. linked to 3 Gigs and loaded at 1MB) identity mapping is not required.</div>
<div> </div><div>- if the kernel is linked AND loaded to 1MB, then to move to higher half kernel two types of page mappings will be required -  </div><div> </div><div>a) identity-mapping of lower addresses</div><div>b) mapping all the virutal addresses above 3Gigs  to lower adresses</div>
<div> </div><div> </div><div> </div><div>Actually I am going through a tutorial to write a kernel. In the tutorial the linker script sets the location counter to 1MB and the code is working fine.</div><div>But I looked at some other tutorials and osdev articles which mention about higher half kernel and linking to 3Gigs and got confused.So I wanted to </div>
<div>be clear about the concepts before I make any changes to the code.</div><div> </div><div> </div><div> Thanks</div><div>Vaibhav Jain</div></div><div> </div><div> </div>