﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-</title><link>http://www.blogjava.net/fjzag/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 06:14:54 GMT</lastBuildDate><pubDate>Mon, 20 Apr 2026 06:14:54 GMT</pubDate><ttl>60</ttl><item><title>如何自己写一个GDB远程调试的服务端</title><link>http://www.blogjava.net/fjzag/articles/419464.html</link><dc:creator>csgeek?</dc:creator><author>csgeek?</author><pubDate>Tue, 04 Nov 2014 00:21:00 GMT</pubDate><guid>http://www.blogjava.net/fjzag/articles/419464.html</guid><wfw:comment>http://www.blogjava.net/fjzag/comments/419464.html</wfw:comment><comments>http://www.blogjava.net/fjzag/articles/419464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjzag/comments/commentRss/419464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjzag/services/trackbacks/419464.html</trackback:ping><description><![CDATA[<div>&nbsp;再分享一篇自己写的有关GDB远程调试底层机制的文章。文中描述了如何自己动手写一个GDB远程调试的服务端。原文链接在这：<br /><a href="http://people.cs.pitt.edu/~anz28/papers/2013_kitten_gdb_tr.pdf">http://people.cs.pitt.edu/~anz28/papers/2013_kitten_gdb_tr.pdf</a></div><img src ="http://www.blogjava.net/fjzag/aggbug/419464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjzag/" target="_blank">csgeek?</a> 2014-11-04 08:21 <a href="http://www.blogjava.net/fjzag/articles/419464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚拟机中的Hyercall</title><link>http://www.blogjava.net/fjzag/articles/419463.html</link><dc:creator>csgeek?</dc:creator><author>csgeek?</author><pubDate>Mon, 03 Nov 2014 23:59:00 GMT</pubDate><guid>http://www.blogjava.net/fjzag/articles/419463.html</guid><wfw:comment>http://www.blogjava.net/fjzag/comments/419463.html</wfw:comment><comments>http://www.blogjava.net/fjzag/articles/419463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjzag/comments/commentRss/419463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjzag/services/trackbacks/419463.html</trackback:ping><description><![CDATA[<div> 				<p><strong style="font-size: 18pt;">What is a Hypercall?</strong></p> <p><span style="font-family: Arial; font-size: 12pt;">Hypercall is an explicit call from Virtual Machine (VM) into the  underlying VM Moniter (VMM). That is, a hypercall issued from the guest  will cause a VM exit from the guest into the VMM. In this sense, it is  kinda like syscall, which will result in a trap from userspace into&nbsp;  kernel space.&nbsp; Thus, hypercall can serve as a communication approach  between the guest and the underlying VMM. The guest can issue hypercalls  via VMMCALL instruction on AMD SVM machine or VMCALL on Intel VMX  machine.</span></p><p><span style="font-family: Arial;"><br /></span></p> <p><strong style="font-size: 18pt;">Adding a Hypercall in Palacios</strong></p> <p><a href="http://www.v3vee.org/palacios/" target="_blank"><span style="font-family: Arial; font-size: 12pt;">Palacios</span></a><span style="font-family: Arial; font-size: 12pt;">  maintains a global hypercall map, which maintains the mapping between  the unique hypercall number and the hypercall handler. (Each hypercall  is associated with a unique hypercall number.). Therefore, to add a  hypercal in Palacios, you need to:</span></p> <ul><li><span style="font-family: Arial; font-size: 12pt;">Implement a handler for the hypercall.</span></li></ul><ul><li><span style="font-family: Arial; font-size: 12pt;">Assign a unique hypercall number for the hypercall.</span></li></ul><ul><li><span style="font-family: Arial; font-size: 12pt;">Register the hypercall handler and the hypercall number with Palacios.</span></li></ul><p><span style="font-family: Arial; font-size: 12pt;">Sample Example:</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;handle_hcall(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;guest_info&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;info,&nbsp;uint_t&nbsp;hcall_id,&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;priv_data){<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vm_regs.rbx;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vm_regs.rcx;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vm_regs.rdx;<br />&nbsp;&nbsp;&nbsp;&nbsp;V3_Print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">param1=%lu&nbsp;param2=%lu&nbsp;param3=%lu\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;param1,&nbsp;parma2,&nbsp;param3);<br />&nbsp;&nbsp;&nbsp;&nbsp;info</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">vm_regs.rax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">return&nbsp;value&nbsp;of&nbsp;the&nbsp;hypercall</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}<br /><br />v3_register_hypercall(vm,&nbsp;HCALL_EXAMPLE_ID,&nbsp;handle_hcall,&nbsp;NULL);</span></div><p>Note: The hypercall management APIs in Palacios are contained in  palacios/include/palacios/vmm_hypercall.h and  palacios/src/palacios/vmm_hypercall.c.</p><p><br /></p> <p><strong style="font-size: 18pt;">Issuing Hypercalls from Palacios Guest</strong><strong><br /> </strong></p> <p><span style="font-size: 12pt; font-family: Arial;">&#8220;Up to four arguments may be passed in rbx, rcx, rdx, and rsi  respectively. The hypercall number should be placed in rax and the  return value will be placed in rax.&nbsp; No other registers will be  clobbered unless explicitly stated by the particular hypercall.&#8221; (quoted  from [1])</span></p> <p><span style="font-size: 12pt; font-family: Arial;">For exmaple, on a AMD SVM machine, a hypercall with 3 parameters can be issued via the following code:</span></p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;VMMCALL&nbsp;".byte&nbsp;0x0F,0x01,0xD9\r\n"&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">VMMCALL&nbsp;instruction&nbsp;binary&nbsp;code</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;hcall3(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;hcall_id,&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param1,&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param2,&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;param3){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;</span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; ">(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VMMCALL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&#8220;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">a&#8221;(ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&#8220;a&#8221;(hcall_id),&nbsp;&#8220;b&#8221;(param1),&nbsp;&#8220;c&#8221;(param2),&nbsp;&#8220;d&#8221;(param3)<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ret;<br />}</span></div><p><code></code></p><p><strong style="font-size: 18pt;"><br /></strong></p><p><strong style="font-size: 18pt;">References:</strong></p> <p>[1] <a title="Linux KVM Hypercall" href="https://www.kernel.org/doc/Documentation/virtual/kvm/hypercalls.txthttp://" target="_blank">Linux KVM Hypercall </a></p> 							</div><img src ="http://www.blogjava.net/fjzag/aggbug/419463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjzag/" target="_blank">csgeek?</a> 2014-11-04 07:59 <a href="http://www.blogjava.net/fjzag/articles/419463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux kernel profiling with hardware performance counters</title><link>http://www.blogjava.net/fjzag/articles/411356.html</link><dc:creator>csgeek?</dc:creator><author>csgeek?</author><pubDate>Sat, 22 Mar 2014 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/fjzag/articles/411356.html</guid><wfw:comment>http://www.blogjava.net/fjzag/comments/411356.html</wfw:comment><comments>http://www.blogjava.net/fjzag/articles/411356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjzag/comments/commentRss/411356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjzag/services/trackbacks/411356.html</trackback:ping><description><![CDATA[<div>几篇关于通过hard performance counter来监控程序（ipc, page faults, cache misses)：<br />perf:&nbsp;<a href="https://perf.wiki.kernel.org/index.php/Tutoria">https://perf.wiki.kernel.org/index.php/Tutoria</a>l<br />perf: linux内核abi:&nbsp;<a href="http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html">http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html<br /></a>perf: perf stat的一个新曾参数支持周期性的打印出counter内容:&nbsp;<a href="https://patchwork.kernel.org/patch/2004891/">https://patchwork.kernel.org/patch/2004891/</a><br />有关performance hardware counter的虚拟化:<a href="http://web.eece.maine.edu/~vweaver/projects/perf_events/virtualization.html"> http://web.eece.maine.edu/~vweaver/projects/perf_events/virtualization.html</a><br />另一个有关performance profiling的常用工具 PAPI: <a href="http://icl.cs.utk.edu/projects/papi/wiki/Main_Page">http://icl.cs.utk.edu/projects/papi/wiki/Main_Page</a></div><img src ="http://www.blogjava.net/fjzag/aggbug/411356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjzag/" target="_blank">csgeek?</a> 2014-03-22 09:06 <a href="http://www.blogjava.net/fjzag/articles/411356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux中通过/proc/stat等文件计算Cpu使用率</title><link>http://www.blogjava.net/fjzag/articles/317773.html</link><dc:creator>csgeek?</dc:creator><author>csgeek?</author><pubDate>Thu, 08 Apr 2010 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/fjzag/articles/317773.html</guid><wfw:comment>http://www.blogjava.net/fjzag/comments/317773.html</wfw:comment><comments>http://www.blogjava.net/fjzag/articles/317773.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/fjzag/comments/commentRss/317773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjzag/services/trackbacks/317773.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE...&nbsp;&nbsp;<a href='http://www.blogjava.net/fjzag/articles/317773.html'>阅读全文</a><img src ="http://www.blogjava.net/fjzag/aggbug/317773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjzag/" target="_blank">csgeek?</a> 2010-04-08 22:57 <a href="http://www.blogjava.net/fjzag/articles/317773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关Windows平台下CPU使用率的计算</title><link>http://www.blogjava.net/fjzag/articles/317774.html</link><dc:creator>csgeek?</dc:creator><author>csgeek?</author><pubDate>Thu, 08 Apr 2010 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/fjzag/articles/317774.html</guid><wfw:comment>http://www.blogjava.net/fjzag/comments/317774.html</wfw:comment><comments>http://www.blogjava.net/fjzag/articles/317774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fjzag/comments/commentRss/317774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fjzag/services/trackbacks/317774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE...&nbsp;&nbsp;<a href='http://www.blogjava.net/fjzag/articles/317774.html'>阅读全文</a><img src ="http://www.blogjava.net/fjzag/aggbug/317774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fjzag/" target="_blank">csgeek?</a> 2010-04-08 22:57 <a href="http://www.blogjava.net/fjzag/articles/317774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>