<br><br><div class="gmail_quote">On Fri, Mar 29, 2013 at 12:45 PM, Jacky <span dir="ltr">&lt;<a href="mailto:jackyclivia@163.com" target="_blank">jackyclivia@163.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="line-height:1.7;font-size:14px;font-family:arial"> Hi All,<br><br>When mmaping elf image into memory, why offset vma need to subtract eppnt-&gt;p_vaddr as the following code ?<br><br>static unsigned long elf_map()<br>
{<br>    ...<br>    unsigned long off = eppnt-&gt;p_offset - ELF_PAGEOFFSET(eppnt-&gt;p_vaddr);<br>    ...<br>}<br></div></blockquote>      Assume you have logically divided the contents of the ELF file into chunks of PAGE_SIZE 
(Typically 4K on x86). Let us name each chunk as <b><i>file page</i></b>-synonym to <i><b>page frame</b></i> in the physical address space and <i><b>page</b></i> in the virtual address space respectively.<br>Here variable <i>off</i> is the <i>file page</i> base offset - synonym to page base address or page frame base address which are typically multiple of PAGE_SIZE. <br>
<br><div>      off &gt;&gt; PAGE_SHIFT is the value stored in <i>vm_pgoff</i> in struct vm_area_struct<br>In a nutshell vm_pgoff is the page number (<i>file page </i>number) in the ELF file where the corresponding PT_LOAD segment starts. <br>
<br>Suppose if a file offset (eppnt-&gt;p_offset) of a PT_LOAD segment is 9560 (0x2558) bytes into the file and eppnt-&gt;p_vaddr is 0x08048558. Then the file page number base address <i>off</i> is calculated as<br> <br>               off = 0x2558 - 0x558; // ELF_PAGEOFFSET(eppnt-&gt;p_vaddr) will expand to 0x558. <br>
Then off is 0x2000 and vm_pgoff is (off &gt;&gt; PAGE_SHIFT) = 2. This means that the PT_LOAD segment starts at 2nd page or 2nd file page in the ELF file. <br><div></div><br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="line-height:1.7;font-size:14px;font-family:arial">Thanks in advance.<span class="HOEnZb"><font color="#888888"><br><br>Jacky<br></font></span></div></blockquote><br></div>-- <br>Regards,<br>Prabhunath G<br>Linux Trainer<br>
Bangalore<br><br>