<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><br>Great ! Thanks Prabhunath. <span class="comment"><font color="#000000"><br><br>Let me make sure I understand you correctly:<br><br>Substracting&nbsp; </font></span><span class="comment"><font color="#000000">ELF_PAGEOFFSET(eppnt-&gt;p_vaddr) from variable off</font></span> makes vma map the page-aligned file contents, right ?&nbsp; <br><br>ÔÚ 2013-03-29 16:56:29£¬"Prabhu&nbsp;nath"&nbsp;&lt;gprabhunath@gmail.com&gt; Ð´µÀ£º<br> <blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><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">&nbsp;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>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; unsigned long off = eppnt-&gt;p_offset - ELF_PAGEOFFSET(eppnt-&gt;p_vaddr);<br>&nbsp;&nbsp;&nbsp; ...<br>}<br></div></blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp; &nbsp; &nbsp; 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>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>
</blockquote></div><br><br><span title="neteasefooter"><span id="netease_mail_footer"></span></span>