I think this is useful:<div><br></div><div><a href="http://stackoverflow.com/questions/9355097/looking-for-system-calls-implementation-on-linux-kernel">http://stackoverflow.com/questions/9355097/looking-for-system-calls-implementation-on-linux-kernel</a><br>
<br><div class="gmail_quote">On Sun, Jul 15, 2012 at 11:24 PM, Peter Teoh <span dir="ltr">&lt;<a href="mailto:htmldeveloper@gmail.com" target="_blank">htmldeveloper@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">
just sharing my analysis, correct me if wrong:<br><br><div class="gmail_quote"><div><div class="h5">On Sun, Jul 15, 2012 at 8:36 PM, ÍõÕÜ <span dir="ltr">&lt;<a href="mailto:wangzhe5004@gmail.com" target="_blank">wangzhe5004@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"><br><br><div class="gmail_quote"><div><div>2012/7/15 Peter Teoh <span dir="ltr">&lt;<a href="mailto:htmldeveloper@gmail.com" target="_blank">htmldeveloper@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Mulyadi and WangZhe,<div><br></div><div>Nice to write to you again....:-).<br><br><div class="gmail_quote"><div>On Sun, Jul 15, 2012 at 1:49 PM, Mulyadi Santosa <span dir="ltr">&lt;<a href="mailto:mulyadi.santosa@gmail.com" target="_blank">mulyadi.santosa@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">Hi...<br>
<div><br>
On Sun, Jul 15, 2012 at 9:28 AM, ÍõÕÜ &lt;<a href="mailto:wangzhe5004@gmail.com" target="_blank">wangzhe5004@gmail.com</a>&gt; wrote:<br>
&gt; and the second program:<br>
&gt;<br>
&gt; #include &lt;stdio.h&gt;<br>
&gt; #include &lt;unistd.h&gt;<br>
&gt;<br>
&gt; int main(void)<br>
&gt; {<br>
&gt; &nbsp; &nbsp; unsigned long value = 0;<br>
&gt; &nbsp; &nbsp; value = getpid();<br>
&gt; &nbsp; &nbsp; return 0;<br>
&gt; }<br>
&gt;<br>
&gt; and disassembling it:( objdump -d a.out)<br>
&gt; ...<br>
&gt; 08048300 &lt;getpid@plt&gt;:<br>
&gt; &nbsp;8048300: &nbsp; &nbsp;ff 25 00 a0 04 08 &nbsp; &nbsp; &nbsp; &nbsp;jmp &nbsp; &nbsp;*0x804a000<br>
&gt; &nbsp;8048306: &nbsp; &nbsp;68 00 00 00 00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; push &nbsp; $0x0<br>
&gt; &nbsp;804830b: &nbsp; &nbsp;e9 e0 ff ff ff &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jmp &nbsp; &nbsp;80482f0 &lt;_init+0x3c&gt;<br>
<br>
</div>Looks like jumping into vsyscall page to me...<br>
<span><font color="#888888"><br></font></span></blockquote><div><br></div></div><div>after I start the process, and doing a gdb -p &lt;pid&gt;:</div><div><br></div><div><div>(gdb) disassemble main&nbsp;</div><div>Dump of assembler code for function main:</div>





<div>&nbsp; &nbsp;0x0000000000400564 &lt;+0&gt;:<span style="white-space:pre-wrap">        </span>push &nbsp; %rbp</div><div>&nbsp; &nbsp;0x0000000000400565 &lt;+1&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%rsp,%rbp</div>
<div>&nbsp; &nbsp;0x0000000000400568 &lt;+4&gt;:<span style="white-space:pre-wrap">        </span>sub &nbsp; &nbsp;$0x10,%rsp</div><div>&nbsp; &nbsp;0x000000000040056c &lt;+8&gt;:<span style="white-space:pre-wrap">        </span>movq &nbsp; $0x0,-0x8(%rbp)</div>
<div>&nbsp; &nbsp;0x0000000000400574 &lt;+16&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;$0x0,%eax</div><div>&nbsp; &nbsp;0x0000000000400579 &lt;+21&gt;:<span style="white-space:pre-wrap">        </span>callq &nbsp;0x400460 &lt;getpid@plt&gt;</div>





<div>&nbsp; &nbsp;0x000000000040057e &lt;+26&gt;:<span style="white-space:pre-wrap">        </span>cltq &nbsp;&nbsp;</div><div>&nbsp; &nbsp;0x0000000000400580 &lt;+28&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%rax,-0x8(%rbp)</div>
<div>&nbsp; &nbsp;0x0000000000400584 &lt;+32&gt;:<span style="white-space:pre-wrap">        </span>movabs $0x9184e72a000,%rdi</div><div>&nbsp; &nbsp;0x000000000040058e &lt;+42&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;$0x0,%eax</div>
<div>&nbsp; &nbsp;0x0000000000400593 &lt;+47&gt;:<span style="white-space:pre-wrap">        </span>callq &nbsp;0x400470 &lt;sleep@plt&gt;</div><div>&nbsp; &nbsp;0x0000000000400598 &lt;+52&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;$0x0,%eax</div>





<div>&nbsp; &nbsp;0x000000000040059d &lt;+57&gt;:<span style="white-space:pre-wrap">        </span>leaveq&nbsp;</div><div>&nbsp; &nbsp;0x000000000040059e &lt;+58&gt;:<span style="white-space:pre-wrap">        </span>retq &nbsp;&nbsp;</div>
<div>End of assembler dump.</div><div>(gdb) disassemble getpid</div><div>Dump of assembler code for function getpid:</div><div>&nbsp; &nbsp;0x00007f19ae558530 &lt;+0&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%fs:0x2d4,%edx</div>





<div>&nbsp; &nbsp;0x00007f19ae558538 &lt;+8&gt;:<span style="white-space:pre-wrap">        </span>cmp &nbsp; &nbsp;$0x0,%edx</div><div>&nbsp; &nbsp;0x00007f19ae55853b &lt;+11&gt;:<span style="white-space:pre-wrap">        </span>jle &nbsp; &nbsp;0x7f19ae558540 &lt;getpid+16&gt;</div>





<div>&nbsp; &nbsp;0x00007f19ae55853d &lt;+13&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%edx,%eax</div><div>&nbsp; &nbsp;0x00007f19ae55853f &lt;+15&gt;:<span style="white-space:pre-wrap">        </span>retq &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp;0x00007f19ae558540 &lt;+16&gt;:<span style="white-space:pre-wrap">        </span>jne &nbsp; &nbsp;0x7f19ae558554 &lt;getpid+36&gt;</div><div>&nbsp; &nbsp;0x00007f19ae558542 &lt;+18&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%fs:0x2d0,%eax</div>





<div>&nbsp; &nbsp;0x00007f19ae55854a &lt;+26&gt;:<span style="white-space:pre-wrap">        </span>test &nbsp; %eax,%eax</div><div>&nbsp; &nbsp;0x00007f19ae55854c &lt;+28&gt;:<span style="white-space:pre-wrap">        </span>nopl &nbsp; 0x0(%rax)</div>
<div>&nbsp; &nbsp;0x00007f19ae558550 &lt;+32&gt;:<span style="white-space:pre-wrap">        </span>je &nbsp; &nbsp; 0x7f19ae558554 &lt;getpid+36&gt;</div><div>&nbsp; &nbsp;0x00007f19ae558552 &lt;+34&gt;:<span style="white-space:pre-wrap">        </span>repz retq&nbsp;</div>





<div>&nbsp; &nbsp;0x00007f19ae558554 &lt;+36&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;$0x27,%eax</div><div>&nbsp; &nbsp;0x00007f19ae558559 &lt;+41&gt;:<span style="white-space:pre-wrap">        </span>syscall&nbsp;</div>
<div>&nbsp; &nbsp;0x00007f19ae55855b &lt;+43&gt;:<span style="white-space:pre-wrap">        </span>test &nbsp; %edx,%edx</div></div><div><div>&nbsp; &nbsp;0x7f19ae55855d &lt;getpid+45&gt;:<span style="white-space:pre-wrap">        </span>jne &nbsp; &nbsp;0x7f19ae558552 &lt;getpid+34&gt;</div>





<div>&nbsp; &nbsp;0x7f19ae55855f &lt;getpid+47&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;%eax,%fs:0x2d0</div><div>&nbsp; &nbsp;0x7f19ae558567 &lt;getpid+55&gt;:<span style="white-space:pre-wrap">        </span>retq &nbsp;&nbsp;</div>
<div><br></div></div></div></div></blockquote></div></div><div><br>&nbsp;&nbsp; Hi peter:<br>&nbsp; &nbsp; &nbsp;&nbsp; question1: why your system is &quot;0x00007f19ae558554 &lt;+36&gt;:<span style="white-space:pre-wrap">        </span>mov &nbsp; &nbsp;$0x27,%eax&quot;,<br>

getpid syscall&nbsp; number is 0x14<br>
<br></div></div></blockquote></div></div><div>yes u are right - for 32-bit kernel:</div><div><br></div><div>In arch/x86/kernel&gt;</div><div>grep getpid *.S</div><div>syscall_table_32.S:<span style="white-space:pre-wrap">        </span>.long sys_getpid<span style="white-space:pre-wrap">        </span>/* 20 */</div>

<div><br></div><div>but my linux kernel is 64-bit.&nbsp;</div><div class="im"><div><br></div><div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote">
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; question2: i use gdb disassemble getpid just like you and the result:<div>
<br><br>&nbsp;&nbsp;&nbsp; (gdb) disassemble getpid<br>&nbsp;Dump of assembler code for function getpid:<br></div>&nbsp;&nbsp; 0xb7771a40 &lt;+0&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %gs:0x6c,%edx<br>
&nbsp;&nbsp; 0xb7771a47 &lt;+7&gt;:&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; $0x0,%edx<br>&nbsp;&nbsp; 0xb7771a4a &lt;+10&gt;:&nbsp;&nbsp;&nbsp; jle&nbsp;&nbsp;&nbsp; 0xb7771a50 &lt;getpid+16&gt;<br>&nbsp;&nbsp; 0xb7771a4c &lt;+12&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %edx,%eax<br>&nbsp;&nbsp; 0xb7771a4e &lt;+14&gt;:&nbsp;&nbsp;&nbsp; repz ret <br>&nbsp;&nbsp; 0xb7771a50 &lt;+16&gt;:&nbsp;&nbsp;&nbsp; jne&nbsp;&nbsp;&nbsp; 0xb7771a62 &lt;getpid+34&gt;<br>


&nbsp;&nbsp; 0xb7771a52 &lt;+18&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; %gs:0x68,%eax<br>&nbsp;&nbsp; 0xb7771a58 &lt;+24&gt;:&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; %eax,%eax<br>&nbsp;&nbsp; 0xb7771a5a &lt;+26&gt;:&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; 0x0(%esi),%esi<br>&nbsp;&nbsp; 0xb7771a60 &lt;+32&gt;:&nbsp;&nbsp;&nbsp; jne&nbsp;&nbsp;&nbsp; 0xb7771a4e &lt;getpid+14&gt;<br>


&nbsp;&nbsp; 0xb7771a62 &lt;+34&gt;:&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; $0x14,%eax<br>&nbsp;&nbsp; 0xb7771a67 &lt;+39&gt;:&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; *%gs:0x10<br><br></div></div></blockquote><div><br></div><div><br></div></div><div>See the comment for gs in entry_32.S:</div><div><br>
</div>
<div>/*</div><div>&nbsp;* User gs save/restore</div><div>&nbsp;*</div><div>&nbsp;* %gs is used for userland TLS and kernel only uses it for stack</div><div>&nbsp;* canary which is required to be at %gs:20 by gcc. &nbsp;Read the comment</div><div>

&nbsp;* at the top of stackprotector.h for more info.</div><div>&nbsp;*</div><div>&nbsp;* Local labels 98 and 99 are used.</div><div>&nbsp;*/</div><div>#ifdef CONFIG_X86_32_LAZY_GS</div><div>&nbsp;</div><div>And inside stackprotector.h, content of which is still beyond my completely understanding at the moment, I copied it here:</div>

<div><br></div><div><div>/*</div><div>&nbsp;* GCC stack protector support.</div><div>&nbsp;*</div><div>&nbsp;* Stack protector works by putting predefined pattern at the start of</div><div>&nbsp;* the stack frame and verifying that it hasn&#39;t been overwritten when</div>

<div>&nbsp;* returning from the function. &nbsp;The pattern is called stack canary</div><div>&nbsp;* and unfortunately gcc requires it to be at a fixed offset from %gs.</div><div>&nbsp;* On x86_64, the offset is 40 bytes and on x86_32 20 bytes. &nbsp;x86_64</div>

<div>&nbsp;* and x86_32 use segment registers differently and thus handles this</div><div>&nbsp;* requirement differently.</div><div>&nbsp;*</div><div>&nbsp;* On x86_64, %gs is shared by percpu area and stack canary. &nbsp;All</div><div>&nbsp;* percpu symbols are zero based and %gs points to the base of percpu</div>

<div>&nbsp;* area. &nbsp;The first occupant of the percpu area is always</div><div>&nbsp;* irq_stack_union which contains stack_canary at offset 40. &nbsp;Userland</div><div>&nbsp;* %gs is always saved and restored on kernel entry and exit using</div>

<div>&nbsp;* swapgs, so stack protector doesn&#39;t add any complexity there.</div><div>&nbsp;*</div><div>&nbsp;* On x86_32, it&#39;s slightly more complicated. &nbsp;As in x86_64, %gs is</div><div>&nbsp;* used for userland TLS. &nbsp;Unfortunately, some processors are much</div>

<div>&nbsp;* slower at loading segment registers with different value when</div><div>&nbsp;* entering and leaving the kernel, so the kernel uses %fs for percpu</div><div>&nbsp;* area and manages %gs lazily so that %gs is switched only when</div>

<div>&nbsp;* necessary, usually during task switch.</div><div>&nbsp;*</div><div>&nbsp;* As gcc requires the stack canary at %gs:20, %gs can&#39;t be managed</div><div>&nbsp;* lazily if stack protector is enabled, so the kernel saves and</div>

<div>&nbsp;* restores userland %gs on kernel entry and exit. &nbsp;This behavior is</div><div><div>* controlled by CONFIG_X86_32_LAZY_GS and accessors are defined in</div><div>&nbsp;* system.h to hide the details.</div><div>&nbsp;*/</div></div>

</div><div><br></div><div><div>Yes, gs register is valid for userspace TLS and thus is per-process, and for more info:</div></div><div><br></div><div><a href="http://www.akkadia.org/drepper/tls.pdf" target="_blank">http://www.akkadia.org/drepper/tls.pdf</a></div>

<div><br></div><div><a href="http://www.ibm.com/developerworks/linux/library/l-user-space-apps/index.html" target="_blank">http://www.ibm.com/developerworks/linux/library/l-user-space-apps/index.html</a></div><div><br></div>
<div><a href="http://stackoverflow.com/questions/6021273/how-to-allocate-thread-local-storage" target="_blank">http://stackoverflow.com/questions/6021273/how-to-allocate-thread-local-storage</a></div>
<div><br></div><div>(and lots of relevant links besides it).</div><div><div class="h5"><div><br></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_quote">
<div>&nbsp; can you explain the meaning of &quot;call&nbsp;&nbsp; *%gs:0x10&quot;?<br>&nbsp; <br>&nbsp; Thanks! <br><br><br>&nbsp;<br></div><div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div><div class="gmail_quote"><div><div></div></div><div>And to check the address space:</div><div><br></div><div><div>(gdb) info sharedlibrary&nbsp;</div><div>From &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;To &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Syms Read &nbsp; Shared Object Library</div>


<div>0x00007f19ae4cb8c0 &nbsp;0x00007f19ae5dec60 &nbsp;Yes (*) &nbsp; &nbsp; /lib/libc.so.6</div>


<div>0x00007f19ae830af0 &nbsp;0x00007f19ae849704 &nbsp;Yes (*) &nbsp; &nbsp; /lib64/ld-linux-x86-64.so.2</div><div>(*): Shared library is missing debugging information.</div></div><div><br></div><div><br></div><div>and if u want:</div><div>




<br>
</div><div><div>cat /proc/2282/maps&nbsp;</div><div><br></div><div>7f19ae82a000-7f19ae82b000 rw-p 0017d000 08:05 9922 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /lib/<a href="http://libc-2.11.1.so" target="_blank">libc-2.11.1.so</a></div><div>7f19ae830000-7f19ae850000 r-xp 00000000 08:05 8824 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /lib/<a href="http://ld-2.11.1.so" target="_blank">ld-2.11.1.so</a></div>





<div>7ffff2031000-7ffff2052000 rw-p 00000000 00:00 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[stack]</div>
<div>7ffff21af000-7ffff21b0000 r-xp 00000000 00:00 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[vdso]</div><div>ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[vsyscall]</div></div><div><br></div><div>noticed also that static analysis tools like &quot;objdump -d&quot; is generally avoided, if u want to understand dynamic addresses. &nbsp; From above, we can conclude that the &quot;sysenter&quot; (this is intel syntax, or &quot;syscall&quot;, in AMD syntax as used by gdb disassembly above) is used for the transition to the kernel - as embedded inside the libc.so.6.</div>



<div>
&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><span><font color="#888888">
--<br>
regards,<br>
<br>
Mulyadi Santosa<br>
Freelance Linux trainer and consultant<br>
<br>
blog: <a href="http://the-hydra.blogspot.com" target="_blank">the-hydra.blogspot.com</a><br>
training: <a href="http://mulyaditraining.blogspot.com" target="_blank">mulyaditraining.blogspot.com</a><br>
</font></span></div><div><div><br><div>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org" target="_blank">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</div></div></div></blockquote></div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>
</font></span></div>
</blockquote></div></div></div><br>
</blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Regards,<br>Peter Teoh<br>
</div>