<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.5" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Zhaoke Blog</title>
	<link>http://zhaoke.com/blog</link>
	<description>focus on Second Life, Virtual Worlds and Mobile Internet.</description>
	<pubDate>Wed, 21 Sep 2011 13:11:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.5</generator>
	<language>en</language>
			<item>
		<title>Fedora Kernel邮件列表</title>
		<link>http://zhaoke.com/blog/96.html</link>
		<comments>http://zhaoke.com/blog/96.html#comments</comments>
		<pubDate>Wed, 21 Mar 2007 15:03:50 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>fedora</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/96.html</guid>
		<description><![CDATA[
订阅网址: https://www.redhat.com/mailman/listinfo/fedora-kernel-list
刚开通不久(由Dave Jones建立), 欢迎感兴趣的朋友订阅! 

Dave Jones: Fedora Kernel List
   Now that the Fedora kernel team is more than one person, it&#8217;s taken a while to train people to add Chuck to the Cc: of fedora kernel related mails. To not have to go through this again, today I set up Fedora-kernel-list. Hopefully it&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0321/fedora.gif" alt="" /></p>
<p>订阅网址: <a href="https://www.redhat.com/mailman/listinfo/fedora-kernel-list" target="_blank">https://www.redhat.com/mailman/listinfo/fedora-kernel-list</a></p>
<p>刚开通不久(由Dave Jones建立), 欢迎感兴趣的朋友订阅! </p>
<p><a id="more-96"></a></p>
<blockquote><p><a href="http://kernelslacker.livejournal.com/74850.html" target="_blank">Dave Jones: Fedora Kernel List</a></p>
<p>   Now that the Fedora kernel team is more than one person, it&#8217;s taken a while to train people to add Chuck to the Cc: of fedora kernel related mails. To not have to go through this again, today I set up <a href="https://www.redhat.com/mailman/listinfo/fedora-kernel-list" target="_blank">Fedora-kernel-list</a>. Hopefully it&#8217;ll be useful for other purposes too, and maybe even attract some new lurk^Wcontributors.</p></blockquote>
<p><img src="http://blog.zhaoke.com/data/2007/0321/fedora_kernel_ml_sm.gif" alt="" /></p>
<p><img src="http://blog.zhaoke.com/images/zoomin.gif"> <a href="http://blog.zhaoke.com/data/2007/0321/fedora_kernel_ml_lg.gif" target="_blank">查看更大的图片</a>
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/fedora" rel="tag">fedora</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a><a href="http://zhaoke.com/blog/tag/fedora" rel="tag">fedora</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/96.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux内核: 修改TCP/IP调优参数</title>
		<link>http://zhaoke.com/blog/71.html</link>
		<comments>http://zhaoke.com/blog/71.html#comments</comments>
		<pubDate>Sat, 27 Jan 2007 15:56:05 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject><dc:subject>tcpip</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/71.html</guid>
		<description><![CDATA[
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数, 后面是它们的含义:

1. /proc/sys/net/core/rmem_max &#8212; 最大的TCP数据接收缓冲
2. /proc/sys/net/core/wmem_max &#8212; 最大的TCP数据发送缓冲
3. /proc/sys/net/ipv4/tcp_timestamps &#8212; 时间戳在(请参考RFC 1323)TCP的包头增加12个字节
4. /proc/sys/net/ipv4/tcp_sack &#8212; 有选择的应答
5. /proc/sys/net/ipv4/tcp_window_scaling &#8212; 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1
6. rmem_default &#8212; 默认的接收窗口大小
7. rmem_max &#8212; 接收窗口的最大大小
8. wmem_default &#8212; 默认的发送窗口大小
9. wmem_max &#8212; 发送窗口的最大大小
/proc目录下的所有内容都是临时性的, 所以重启动系统后任何修改都会丢失.
建议在系统启动时自动修改TCP/IP参数:
把下面代码增加到/etc/rc.local文件, 然后保存文件, 系统重新引导的时候会自动修改下面的TCP/IP参数:
echo 256960 > /proc/sys/net/core/rmem_default
echo 256960 > /proc/sys/net/core/rmem_max
echo 256960 > /proc/sys/net/core/wmem_default
echo 256960 > /proc/sys/net/core/wmem_max
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0127/tcpip.gif" alt="" /></p>
<p>所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数, 后面是它们的含义:</p>
<p><a id="more-71"></a></p>
<p>1. /proc/sys/net/core/rmem_max &#8212; 最大的TCP数据接收缓冲<br />
2. /proc/sys/net/core/wmem_max &#8212; 最大的TCP数据发送缓冲<br />
3. /proc/sys/net/ipv4/tcp_timestamps &#8212; 时间戳在(请参考RFC 1323)TCP的包头增加12个字节<br />
4. /proc/sys/net/ipv4/tcp_sack &#8212; 有选择的应答<br />
5. /proc/sys/net/ipv4/tcp_window_scaling &#8212; 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1<br />
6. rmem_default &#8212; 默认的接收窗口大小<br />
7. rmem_max &#8212; 接收窗口的最大大小<br />
8. wmem_default &#8212; 默认的发送窗口大小<br />
9. wmem_max &#8212; 发送窗口的最大大小</p>
<p>/proc目录下的所有内容都是临时性的, 所以重启动系统后任何修改都会丢失.</p>
<p>建议在系统启动时自动修改TCP/IP参数:</p>
<p>把下面代码增加到/etc/rc.local文件, 然后保存文件, 系统重新引导的时候会自动修改下面的TCP/IP参数:</p>
<p>echo 256960 > /proc/sys/net/core/rmem_default<br />
echo 256960 > /proc/sys/net/core/rmem_max<br />
echo 256960 > /proc/sys/net/core/wmem_default<br />
echo 256960 > /proc/sys/net/core/wmem_max</p>
<p>echo 0 > /proc/sys/net/ipv4/tcp_timestamps<br />
echo 1 > /proc/sys/net/ipv4/tcp_sack<br />
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling</p>
<p>TCP/IP参数都是自解释的, TCP窗口大小设置为256960, 禁止TCP的时间戳(取消在每个数据包的头中增加12字节), 支持更大的TCP窗口和TCP有选择的应答.</p>
<p>上面数值的设定是根据互连网连接和最大带宽/延迟率来决定.</p>
<p>注: 上面实例中的数值可以实际应用, 但它只包含了一部分参数.</p>
<p>另外一个方法: 使用 /etc/sysctl.conf 在系统启动时将参数配置成您所设置的值:</p>
<p>net.core.rmem_default = 256960<br />
net.core.rmem_max = 256960<br />
net.core.wmem_default = 256960<br />
net.core.wmem_max = 256960</p>
<p>net.ipv4.tcp_timestamps = 0<br />
net.ipv4.tcp_sack =1<br />
net.ipv4.tcp_window_scaling = 1</p>
<p><strong>参考</strong><br />
<a href="http://www.redhatmagazine.com/2007/01/25/how-can-i-change-the-tcpip-tuning-parameters/" target="_blank">How can I change the TCP/IP tuning parameters?</a><br />
<a href="http://www.ibm.com/developerworks/cn/linux/l-hisock.html" target="_blank">提高 Linux 上 socket 性能</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/64.html">开源项目: uIP嵌入式TCP/IP协议栈</a></p>
<p><strong>备注</strong><br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/tcpip" rel="tag">tcpip</a><a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/tcpip" rel="tag">tcpip</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/71.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux页替换的设计</title>
		<link>http://zhaoke.com/blog/70.html</link>
		<comments>http://zhaoke.com/blog/70.html#comments</comments>
		<pubDate>Fri, 26 Jan 2007 13:26:28 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject><dc:subject>lru</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/70.html</guid>
		<description><![CDATA[
图: Andrea Arcangeli
Andrea Arcangeli[专访]设计的虚拟内存子系统已经合并到2.4.10内核. 一位主修操作系统课程的学生在邮件列表上问道为什么Linux内核中的LRU(最近最少使用)页替换算法使用两个串联链表? Andrea回答: 当时之所以设计成两个链表, 因为这样可以把活动和非活动缓存分开, 从而在交换出工作集(进程当前正使用的页的集合)之前能够检测出缓存的污染状况. 他继续说, 我们可以更快地收集非活动列表中的页(比活动列表中的页). 然后虚拟内存通过释放缓存来保持两个列表的大小平衡, 显然某些时候活动列表也需要被释放.

关于LRU算法: Linux使用LRU算法从系统中公平地交换出页面.

图: Rik van Riel
Rik van Riel[专访], 反向映射[相关]虚拟内存(已经合并到2.5内核[文章])的作者. 他说, 过去十年内存大小的增长速度远远超过了磁盘的增长速度(接下来10年可能也一样), 因此页替换算法的质量可能会变得越来越重要. 关于建议LRU分成两部分, 一部分为页缓存, 另一部分用于映射页缓存, Nick Piggin[专访]的回应是: 实际上我有一个可以&#8221;分开活动列表&#8217;大补丁. 它可以在回收时根据页面是否被映射来移动页面. 这个办法没有现在的好. Rik提供了一些改进想法. 对于每一个列表, 我们跟踪: 1) 列表的大小 2)我们扫描列表的频率 3)页(非新)片断的引用数. 这种方式我们能够确定哪一个列表有最大的空闲页片断, 因此该列表将会进行强制的扫描.
关于反向映射: 反向映射提供了一个发现哪些进程正在使用给定的内存物理页的机制.
相关图片

这里是邮件列表上的讨论信息.
参考
Linux: Page Replacement Design
内核比较: 2.6 内核中改进了内存管理
相关文章
Linux: 自动内核调整程序
IBM Linux技术中心: Linux内核相关的出版物
进程实际内存占用: 私有驻留内存数(Private RSS)介绍
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

Keyword: kernel, linux, lrukernel, linux, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0126/andrea_arcangeli.gif" alt="" /><br />
<strong>图: Andrea Arcangeli</strong></p>
<p>Andrea Arcangeli[<a href="http://kerneltrap.org/node/view/3148" target="_blank">专访</a>]设计的虚拟内存子系统已经合并到2.4.10内核. 一位主修操作系统课程的学生在邮件列表上问道为什么Linux内核中的LRU(最近最少使用)页替换算法使用两个串联链表? Andrea回答: 当时之所以设计成两个链表, 因为这样可以把活动和非活动缓存分开, 从而在交换出工作集(进程当前正使用的页的集合)之前能够检测出缓存的污染状况. 他继续说, 我们可以更快地收集非活动列表中的页(比活动列表中的页). 然后虚拟内存通过释放缓存来保持两个列表的大小平衡, 显然某些时候活动列表也需要被释放.</p>
<p><a id="more-70"></a></p>
<p>关于LRU算法: Linux使用LRU算法从系统中公平地交换出页面.</p>
<p><img src="http://blog.zhaoke.com/data/2007/0126/rik.gif" alt="" /><br />
<strong>图: Rik van Riel</strong></p>
<p><a href="http://www.surriel.com/" target="_blank">Rik van Riel</a>[<a href="http://kerneltrap.org/node/view/46" target="_blank">专访</a>], 反向映射[<a href="http://www.ibm.com/developerworks/cn/linux/l-mem26/index.html#IDAXB2VG" target="_blank">相关</a>]虚拟内存(已经合并到2.5内核[<a href="http://kerneltrap.org/node/273" target="_blank">文章</a>])的作者. 他说, 过去十年内存大小的增长速度远远超过了磁盘的增长速度(接下来10年可能也一样), 因此页替换算法的质量可能会变得越来越重要. 关于建议LRU分成两部分, 一部分为页缓存, 另一部分用于映射页缓存, Nick Piggin[<a href="http://kerneltrap.org/node/view/657" target="_blank">专访</a>]的回应是: 实际上我有一个可以&#8221;分开活动列表&#8217;大补丁. 它可以在回收时根据页面是否被映射来移动页面. 这个办法没有现在的好. Rik提供了一些改进想法. 对于每一个列表, 我们跟踪: 1) 列表的大小 2)我们扫描列表的频率 3)页(非新)片断的引用数. 这种方式我们能够确定哪一个列表有最大的空闲页片断, 因此该列表将会进行强制的扫描.</p>
<p>关于反向映射: 反向映射提供了一个发现哪些进程正在使用给定的内存物理页的机制.</p>
<p><strong>相关图片</strong></p>
<p><img src="http://blog.zhaoke.com/data/2007/0126/lru.gif" alt="" /></p>
<p><a href="http://blog.zhaoke.com/data/2007/0126/page_replacement.txt" target="_blank">这里</a>是邮件列表上的讨论信息.</p>
<p><strong>参考</strong><br />
<a href="http://kerneltrap.org/node/7608" target="_blank">Linux: Page Replacement Design</a><br />
<a href="http://www.ibm.com/developerworks/cn/linux/l-mem26/" target="_blank">内核比较: 2.6 内核中改进了内存管理</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/60.html">Linux: 自动内核调整程序</a><br />
<a href="http://blog.zhaoke.com/36.html">IBM Linux技术中心: Linux内核相关的出版物</a><br />
<a href="http://blog.zhaoke.com/31.html">进程实际内存占用: 私有驻留内存数(Private RSS)介绍</a></p>
<p><strong>备注</strong><br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/lru" rel="tag">lru</a><a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/lru" rel="tag">lru</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/70.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>2007年Linux内核峰会的计划</title>
		<link>http://zhaoke.com/blog/66.html</link>
		<comments>http://zhaoke.com/blog/66.html#comments</comments>
		<pubDate>Tue, 23 Jan 2007 08:42:55 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject><dc:subject>summit</dc:subject><dc:subject>内核</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/66.html</guid>
		<description><![CDATA[
Theodore Ts&#8217;o宣布2007年Linux内核峰会将在英国剑桥举办, 改变了以往都在加拿大渥太华举办的惯例. Ted解释到: 这是一次实验性的尝试, 我们将在未来重新评估是否在其它地方举办内核峰会. Ted还说: 我明白如果只考虑自己的开发人员, 我们可以在檀香山举办, 或者澳大利亚, 或者在新西兰. 可是还有其它的开发人员和赞助者. 对于今年的峰会, Ted解释到:

今年的Linux内核峰会将在英国剑桥Devere大学的Arms酒店举办, 时间在9月5号到6号(4号是接待日). 我们是在收到去年峰会很多参会者的建议(建议在渥太华外的地方举办)后决定在英国举办这一届峰会. 因为有大概3分之1的参会者来自于英国或欧洲. 因此我们计划2008年7月租用渥太华会议中心的一个会议室(需在2007年中旬决定), 讨论2007年9月剑桥峰会举办的情况(尚未决定), 然后再决定2008年以后在其它地方举行内核峰会的频率. 
这里是邮件列表上的讨论信息.
参考
Linux: Planning the 2007 Linux Kernel Summit
相关文章
Jonathan Corbet谈近来Linux内核的改进
Linux内核开发人员网站列表
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

Keyword: linux, summit, 内核linux, summit, 内核]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0123/kernel_summit2007.gif" alt="" /></p>
<p><a href="http://web.mit.edu/tytso/www/home.html" target="_blank">Theodore Ts&#8217;o</a>宣布2007年<a href="http://en.wikipedia.org/wiki/Kernel_Summit" target="_blank">Linux内核峰会</a>将在英国剑桥举办, 改变了以往都在加拿大渥太华举办的惯例. Ted解释到: 这是一次实验性的尝试, 我们将在未来重新评估是否在其它地方举办内核峰会. Ted还说: 我明白如果只考虑自己的开发人员, 我们可以在檀香山举办, 或者澳大利亚, 或者在新西兰. 可是还有其它的开发人员和赞助者. 对于今年的峰会, Ted解释到:</p>
<p><a id="more-66"></a></p>
<p>今年的Linux内核峰会将在英国剑桥<a href="http://www.devere.co.uk/Hotels/University/" target="_blank">Devere大学的Arms酒店</a>举办, 时间在9月5号到6号(4号是接待日). 我们是在收到去年峰会很多参会者的建议(建议在渥太华外的地方举办)后决定在英国举办这一届峰会. 因为有大概3分之1的参会者来自于英国或欧洲. 因此我们计划2008年7月租用渥太华会议中心的一个会议室(需在2007年中旬决定), 讨论2007年9月剑桥峰会举办的情况(尚未决定), 然后再决定2008年以后在其它地方举行内核峰会的频率. </p>
<p><a href="http://blog.zhaoke.com/data/2007/0123/kernel_summit2007.txt" target="_blank">这里</a>是邮件列表上的讨论信息.</p>
<p><strong>参考</strong><br />
<a href="http://kerneltrap.org/node/7599" target="_blank">Linux: Planning the 2007 Linux Kernel Summit</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/63.html">Jonathan Corbet谈近来Linux内核的改进</a><br />
<a href="http://blog.zhaoke.com/35.html">Linux内核开发人员网站列表</a></p>
<p>备注<br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/summit" rel="tag">summit</a>, <a href="http://zhaoke.com/blog/tag/%E5%86%85%E6%A0%B8" rel="tag">内核</a><a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>, <a href="http://zhaoke.com/blog/tag/summit" rel="tag">summit</a>, <a href="http://zhaoke.com/blog/tag/%E5%86%85%E6%A0%B8" rel="tag">内核</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/66.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>开源项目: uIP嵌入式TCP/IP协议栈</title>
		<link>http://zhaoke.com/blog/64.html</link>
		<comments>http://zhaoke.com/blog/64.html#comments</comments>
		<pubDate>Fri, 19 Jan 2007 17:01:25 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>kernel</dc:subject><dc:subject>stack</dc:subject><dc:subject>tcpip</dc:subject><dc:subject>uIP</dc:subject><dc:subject>内核</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/64.html</guid>
		<description><![CDATA[
uIP开源项目介绍
uIP是专为8位和16位的嵌入式微控制器设计的微型TCP/IP协议栈, 它采用BSD授权(这里可以获得完整的BSD许可证), 具有良好的互操作性, 并遵循RFC标准.

uIP提供了网络通信所必须的协议, 本身代码和占用的内存数都非常少 - uIP的源代码只有几KB, RAM占用仅几百字节.
uIP是一个完全由C语言编写的开源软件, 它的文档和源代码可用于商业和非商业用途, 它已经移植到了大部分的8位微控制器, 而且已在很多的嵌入式产品和项目中使用. (比如卫星, Cisco路由器. 查阅Links页面的几个例子)
uIP具有如下功能:
.良好的文档和源代码注释 - 几乎每一行代码都有注释.
.代码非常少.
.占用非常少的内存, 在编译时候可以设置.
.支持ARP, SLIP, IP, UDP, ICMP(ping)和TCP协议.
.提供一套实例程序: web服务器, web客户端, 电子邮件发送程序(SMTP客户端), Telnet服务器, DNS主机名解析程序.
.同时活动的TCP链接数没有限制, 在编译时候可以设置.
.可免费用于商业和非商业用途.
.TCP和IP协议遵循RFC标准, 包括流控制, 片断分割和重传超时估算.
uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发.
uIP的代码大小和RAM占用
下面表格显示了uIP的代码大小和RAM占用. 代码使用gcc 3.3在8位的Atmel AVR架构上编译并使用代码大小优化(-Os).
uIP在Atmel AVR平台上的代码大小和RAM占用, 单位字节

总的内存占用将依赖: 分配了多少个TCP链接数, 分配了多少个ARP表项, 分配了多大的包缓冲. 这些在编译时候可以设置. 每一个正在监听的TCP端口增加额外的2个字节内存. 下面是uIP的一个配置实例: 一个正在监听的TCP端口, 10个TCP连接数, 10个ARP表项, 一个400字节大小的包缓冲和一个简单的HTTP服务器.
配置实例

对上图做一点补充, 注意uIP的设计使用了非常少的堆栈内存. uIP的调用视图非常窄, main函数和应用函数之间只有单个函数调用. 大多应用程序使用uIP函数作为C Macro, 因此不需要使用调用栈.
uIP文档
uIP文档1.0提供两种格式下载: HTML和PDF(uip-1.0-refman.pdf, 1.4MB, 261页)
发表论文:
1. Adam [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0120/uip_tcpip.gif" alt="" /></p>
<p><strong>uIP开源项目介绍</strong></p>
<p><a href="http://www.sics.se/~adam/uip/" target="_blank">uIP</a>是专为8位和16位的嵌入式微控制器设计的微型TCP/IP协议栈, 它采用BSD授权(这里可以获得完整的<a href="http://www.sics.se/~adam/uip/license.html" target="_blank">BSD许可证</a>), 具有良好的互操作性, 并遵循RFC标准.</p>
<p><a id="more-64"></a></p>
<p>uIP提供了网络通信所必须的协议, 本身代码和占用的内存数都非常少 - uIP的源代码只有几KB, RAM占用仅几百字节.</p>
<p>uIP是一个完全由C语言编写的开源软件, 它的文档和源代码可用于商业和非商业用途, 它已经移植到了大部分的8位微控制器, 而且已在很多的嵌入式产品和项目中使用. (比如卫星, Cisco路由器. 查阅<a href="http://blog.zhaoke.com/data/2007/0120/link.html" target="_blank">Links</a>页面的几个例子)</p>
<p>uIP具有如下功能:<br />
.良好的文档和源代码注释 - 几乎每一行代码都有注释.<br />
.代码非常少.<br />
.占用非常少的内存, 在编译时候可以设置.<br />
.支持ARP, SLIP, IP, UDP, ICMP(ping)和TCP协议.<br />
.提供一套实例程序: web服务器, web客户端, 电子邮件发送程序(SMTP客户端), Telnet服务器, DNS主机名解析程序.<br />
.同时活动的TCP链接数没有限制, 在编译时候可以设置.<br />
.可免费用于商业和非商业用途.<br />
.TCP和IP协议遵循RFC标准, 包括流控制, 片断分割和重传超时估算.</p>
<p>uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发.</p>
<p><strong>uIP的代码大小和RAM占用</strong></p>
<p>下面表格显示了uIP的代码大小和RAM占用. 代码使用gcc 3.3在8位的Atmel AVR架构上编译并使用代码大小优化(-Os).</p>
<p>uIP在Atmel AVR平台上的代码大小和RAM占用, 单位字节<br />
<img src="http://blog.zhaoke.com/data/2007/0120/uip01.gif" alt="" /></p>
<p>总的内存占用将依赖: 分配了多少个TCP链接数, 分配了多少个ARP表项, 分配了多大的包缓冲. 这些在编译时候可以设置. 每一个正在监听的TCP端口增加额外的2个字节内存. 下面是uIP的一个配置实例: 一个正在监听的TCP端口, 10个TCP连接数, 10个ARP表项, 一个400字节大小的包缓冲和一个简单的HTTP服务器.</p>
<p>配置实例<br />
<img src="http://blog.zhaoke.com/data/2007/0120/uip02.gif" alt="" /></p>
<p>对上图做一点补充, 注意uIP的设计使用了非常少的堆栈内存. uIP的调用视图非常窄, main函数和应用函数之间只有单个函数调用. 大多应用程序使用uIP函数作为C Macro, 因此不需要使用调用栈.</p>
<p><strong>uIP文档</strong></p>
<p>uIP文档1.0提供两种格式下载: <a href="http://www.sics.se/~adam/uip/uip-1.0-refman/" target="_blank">HTML</a>和PDF(<a href="http://blog.zhaoke.com/data/2007/0120/uip-1.0-refman.pdf" target="_blank">uip-1.0-refman.pdf</a>, 1.4MB, 261页)</p>
<p>发表论文:</p>
<p>1. Adam Dunkels, &#8220;<a href="http://blog.zhaoke.com/data/2007/0120/mobisys2003.pdf" target="_blank">Full TCP/IP for 8-Bit Architectures</a>&#8220;. In Proceedings of the first international conference on mobile applications, systems and services (MOBISYS 2003), San Francisco, May 2003.<br />
描述了uIP和IwIP相关的TCP/IP标准和其它TCP/IP实现.</p>
<p>2. Adam Dunkels, Oliver Schmidt, Thiemo Voigt, and Muneeb Ali. <a href="http://blog.zhaoke.com/data/2007/0120/dunkels06protothreads.pdf" target="_blank">Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems.</a> In Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems (SenSys 2006), Boulder, Colorado, USA, November 2006.<br />
描述和评测了支持uIP protosocket库的超轻量级protothreads.</p>
<p>3. Adam Dunkels, Juan Alonso, and Thiemo Voigt, &#8220;<a href="http://blog.zhaoke.com/data/2007/0120/ewsn2004.pdf" target="_blank">Making TCP/IP Viable for Wireless Sensor Networks</a>&#8220;, the First European Workshop on Wireless Sensor Networks (EWSN 2004), work-in-progress session.<br />
正在撰写的论文: 讨论在无线传感器网络中使用TCP/IP和uIP.</p>
<p>平台移植:</p>
<p>快速向导: 移植uIP到其它的平台</p>
<p>实际的TCP/IP代码无需任何修改, 但是目标网络设备的驱动程序(以太网控制器/串口/其它)和实际的系统集成部分(比如, 主控制循环, 当数据到达或定期时钟超时需调用uIP函数)需要重写.</p>
<p>移植步骤:</p>
<p>1. 阅读上面提供的文档.<br />
2. 在uip-1.0/目录下为你的端口创建新的目录(选择一个简短的CPU架构名称, 比如i386, 用于C编译器).<br />
3. 从unix/子目录拷贝uip_arch.c文件到新创建的目录. ls包含了一个普通的C校验算法实现, 是一个32位的函数).<br />
4. 从unix/子目录拷贝uipopt.h文件.<br />
5. 根据你的项目编辑uipopt.h文件(文件是自描述型的).<br />
6. 为你的硬件写设备驱动.(这大概是最难的部分.) 查阅unix/tapdev.c和uip/slipdev.c实例了解设备驱动如何实现.<br />
7. 写好主控制循环, 然后调用uIP函数. 查阅unix/main.c实例了解主控制循环如何实现. 通过unix/main.c主循环实例了解如何使用ARP协议.<br />
8. 写makefile文件, 然后编译代码. 确认你的项目(在你子目录中的.c文件)包含了../uip/uip.c文件. 如果你正使用web服务器程序, 请记住包含文件../apps/httpd/httpd.c ../apps/httpd/cgi.c ../apps/httpd/fs.c. 如果需支持ARP, 请包含文件 ../uip/uip_arp.c.<br />
9. 发现和纠正所有的程序错误. (这是平台移植中最需技巧的部分:)</p>
<p><strong>uIP程序下载</strong><br />
<img src="http://blog.zhaoke.com/images/dl.gif" alt="" /> <a href="http://blog.zhaoke.com/data/2007/0120/uip-1.0.tar.gz" target="_blank">uip 1.0</a></p>
<p><strong>相关网站</strong><br />
<a href="http://www.sics.se/~adam/lwip/" target="_blank">IwIP: 更强大的嵌入式TCP/IP协议栈</a>.<br />
<a href="http://www.sics.se/contiki/" target="_blank">Contiki: 使用uIP的嵌入式操作系统</a>.<br />
<a href="http://www.sics.se/~adam/pt/" target="_blank">Protothreads: 超轻量级的无堆栈线程</a>.<br />
<a href="http://www.sics.se/~adam/miniweb/" target="_blank">Miniweb: 30字节大小的TCP/IP协议栈和Web服务器原型</a>.</p>
<p><strong>参考</strong><br />
<a href="http://www.sics.se/~adam/uip/" target="_blank">The uIP TCP-IP Stack for Embedded Microcontrollers</a></p>
<p><strong>备注</strong><br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/stack" rel="tag">stack</a>, <a href="http://zhaoke.com/blog/tag/tcpip" rel="tag">tcpip</a>, <a href="http://zhaoke.com/blog/tag/uip" rel="tag">uIP</a>, <a href="http://zhaoke.com/blog/tag/%E5%86%85%E6%A0%B8" rel="tag">内核</a><a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/stack" rel="tag">stack</a>, <a href="http://zhaoke.com/blog/tag/tcpip" rel="tag">tcpip</a>, <a href="http://zhaoke.com/blog/tag/uip" rel="tag">uIP</a>, <a href="http://zhaoke.com/blog/tag/%E5%86%85%E6%A0%B8" rel="tag">内核</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/64.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Jonathan Corbet谈近来Linux内核的改进</title>
		<link>http://zhaoke.com/blog/63.html</link>
		<comments>http://zhaoke.com/blog/63.html#comments</comments>
		<pubDate>Fri, 19 Jan 2007 10:12:35 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>enhancements</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/63.html</guid>
		<description><![CDATA[
Jonathan Corbet: 目前居住在美国科罗拉多州的玻尔得市. 的第一作者, LWN网络杂志创始人兼主编.

Corbert在今年linux.conf.au 2007悉尼会议上介绍了近来Linux内核的改进:
下一个内核发行版2.6.20将增加许多新的驱动, 其中包括USB视频驱动, 用于支持USB Web摄像头.
Linux支持越来越多的硬件, 但是最大的问题是厂商不发布开源驱动程序和硬件规格.
内核现用的wireless代码将逐步被802.11替代. 一些人正在移植BSD Atheros Wi-Fi驱动到Linux上, 估计一年内Linux将支持更多的无线设备.
现在硬盘越来越大, 但存取速度相应增长过慢. Linux需要更高级的文件系统. ext4支持更大的硬盘, 采用48位寻址, 突破了8TB的限制(ext3). Reiser 4文件系统, 虽然有很多有意思的想法, 但是它的支持度仍在下降, 除非有人继续维护它, 否则将逐渐消失.
虚拟化方面, 许多Hypervisor(见相关文章1)都使用paravirt_ops接口来隔离低级操作. 由于使用全虚拟化技术的Xen存在很多争议, Xen加入到官方内核将变的十分缓慢. KVM增加到了即将发布的2.6.20内核, 而且已经能够支持半虚拟化和全虚拟化(见相关文章2), 我们会看到更多KVM新的功能(见相关文章3). 其它使用容器方法的虚拟化技术如Linux-Vserver和OpenVZ, 它们是轻量级的虚拟化解决方案.
开发过程方面, 新功能将比以往更快地加入到内核中(以往是几年, 现在可能是几个月). 一些人说新的开发模型过于注重功能, 我们为声誉降低了内核的质量. 而要证明内核正在变得越稳定或越不稳定是十分困难的.
Corbet最后说到: &#8220;我们没有任何分析人士所说的5年计划.&#8221; 他还说. &#8220;人的想象力是自由的, 我们无法强迫别人做什么.&#8221;
参考
Linux ups Web cams to Wi-Fi
相关文章
Linux上的虚拟化技术
KVM的半虚拟化: KVM-paravirt
KVM半虚拟化: KVM/NET性能的初步评测
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

Keyword: enhancements, kernel, linuxenhancements, kernel, linux]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0119/jonathan_corbet.gif" alt="" /></p>
<p>Jonathan Corbet: 目前居住在美国科罗拉多州的玻尔得市. <<<a href="http://lwn.net/Kernel/LDD3/" target="_blank">Linux设备驱动程序第三版</a>>>的第一作者, <a href="http://lwn.net/" target="_blank">LWN网络杂志</a>创始人兼主编.</p>
<p><a id="more-63"></a></p>
<p>Corbert在今年<a href="http://lca2007.linux.org.au" target="_blank">linux.conf.au 2007</a>悉尼会议上介绍了近来Linux内核的改进:</p>
<p>下一个内核发行版2.6.20将增加许多新的驱动, 其中包括USB视频驱动, 用于支持USB Web摄像头.</p>
<p>Linux支持越来越多的硬件, 但是最大的问题是厂商不发布开源驱动程序和硬件规格.</p>
<p>内核现用的wireless代码将逐步被802.11替代. 一些人正在移植BSD Atheros Wi-Fi驱动到Linux上, 估计一年内Linux将支持更多的无线设备.</p>
<p>现在硬盘越来越大, 但存取速度相应增长过慢. Linux需要更高级的文件系统. ext4支持更大的硬盘, 采用48位寻址, 突破了8TB的限制(ext3). Reiser 4文件系统, 虽然有很多有意思的想法, 但是它的支持度仍在下降, 除非有人继续维护它, 否则将逐渐消失.</p>
<p>虚拟化方面, 许多Hypervisor(见相关文章1)都使用paravirt_ops接口来隔离低级操作. 由于使用全虚拟化技术的Xen存在很多争议, Xen加入到官方内核将变的十分缓慢. KVM增加到了即将发布的2.6.20内核, 而且已经能够支持半虚拟化和全虚拟化(见相关文章2), 我们会看到更多KVM新的功能(见相关文章3). 其它使用容器方法的虚拟化技术如Linux-Vserver和OpenVZ, 它们是轻量级的虚拟化解决方案.</p>
<p>开发过程方面, 新功能将比以往更快地加入到内核中(以往是几年, 现在可能是几个月). 一些人说新的开发模型过于注重功能, 我们为声誉降低了内核的质量. 而要证明内核正在变得越稳定或越不稳定是十分困难的.</p>
<p>Corbet最后说到: &#8220;我们没有任何分析人士所说的5年计划.&#8221; 他还说. &#8220;人的想象力是自由的, 我们无法强迫别人做什么.&#8221;</p>
<p><strong>参考</strong><br />
<a href="http://www.computerpartner.nl/article.php?news=int&#038;id=4630" target="_blank">Linux ups Web cams to Wi-Fi</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/45.html">Linux上的虚拟化技术</a><br />
<a href="http://blog.zhaoke.com/48.html">KVM的半虚拟化: KVM-paravirt</a><br />
<a href="http://blog.zhaoke.com/55.html">KVM半虚拟化: KVM/NET性能的初步评测</a></p>
<p><strong>备注</strong><br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/enhancements" rel="tag">enhancements</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a><a href="http://zhaoke.com/blog/tag/enhancements" rel="tag">enhancements</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/63.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux: 自动内核调整程序</title>
		<link>http://zhaoke.com/blog/60.html</link>
		<comments>http://zhaoke.com/blog/60.html#comments</comments>
		<pubDate>Wed, 17 Jan 2007 08:21:42 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>akt</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/60.html</guid>
		<description><![CDATA[
Nadia Derbey在Linux内核邮件列表上发布了一套叫做&#8221;自动内核调整程序&#8221;的补丁, 或简称为AKT, 他解释为:&#8221;AKT是一套内核补丁, 内核将能根据资源状况自动修改可调值.&#8221; AKT框架的内核部分提供了sysfs接口, 用于可调值的注册和激活已注册可调值的自动调整功能. Nadia解释了它的第二个功能. &#8220;可在资源分配的时候调高可调值和在资源施放的时候调低可调值.&#8221; AKT框架的用户空间部分提供了一个用户接口: 设置可调值的属性: 可调或不可调, 自动或非自动.

AKT补丁的自动调节程序只允许设置可调值的最小和最大值. 如果被监视的数值超过了预定义的最大值, 可调值增加. 如果被监视的数值低于预定义的最小值, 可调值减小. AKT还可以提供更多复杂的调节功能. 现在AKT是libtune项目的一部分, 目标是&#8221;提供一个统一的标准API: 便于Linux程序员访问内核可调值, 系统信息, 资源消耗状况等.
这里是邮件列表上的讨论信息.
参考
Linux: Automatic Kernel Tunables
相关文章
IBM Linux技术中心: Linux内核相关的出版物
开源项目: 性能分析工具perfmon2
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

Keyword: akt, kernel, linuxakt, kernel, linux]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2007/0117/akt.gif" alt="" /></p>
<p>Nadia Derbey在Linux内核邮件列表上发布了一套叫做&#8221;自动内核调整程序&#8221;的补丁, 或简称为<a href="http://akt.sourceforge.net/" target="_blank">AKT</a>, 他解释为:&#8221;AKT是一套内核补丁, 内核将能根据资源状况自动修改可调值.&#8221; AKT框架的内核部分提供了sysfs接口, 用于可调值的注册和激活已注册可调值的自动调整功能. Nadia解释了它的第二个功能. &#8220;可在资源分配的时候调高可调值和在资源施放的时候调低可调值.&#8221; AKT框架的用户空间部分提供了一个用户接口: 设置可调值的属性: 可调或不可调, 自动或非自动.</p>
<p><a id="more-60"></a></p>
<p>AKT补丁的自动调节程序只允许设置可调值的最小和最大值. 如果被监视的数值超过了预定义的最大值, 可调值增加. 如果被监视的数值低于预定义的最小值, 可调值减小. AKT还可以提供更多复杂的调节功能. 现在AKT是<a href="http://libtune.sourceforge.net/" target="_blank">libtune</a>项目的一部分, 目标是&#8221;提供一个统一的标准API: 便于Linux程序员访问内核可调值, 系统信息, 资源消耗状况等.</p>
<p><a href="http://blog.zhaoke.com/data/2007/0117/akt.txt" target="_blank">这里</a>是邮件列表上的讨论信息.</p>
<p><strong>参考</strong><br />
<a href="http://kerneltrap.org/node/7578" target="_blank">Linux: Automatic Kernel Tunables</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/36.html">IBM Linux技术中心: Linux内核相关的出版物</a><br />
<a href="http://blog.zhaoke.com/28.html">开源项目: 性能分析工具perfmon2</a></p>
<p><strong>备注</strong><br />
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/akt" rel="tag">akt</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a><a href="http://zhaoke.com/blog/tag/akt" rel="tag">akt</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/linux" rel="tag">linux</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/60.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>用户友好的Linux虚拟技术: KVM</title>
		<link>http://zhaoke.com/blog/43.html</link>
		<comments>http://zhaoke.com/blog/43.html#comments</comments>
		<pubDate>Fri, 29 Dec 2006 09:06:59 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>benchmarks</dc:subject><dc:subject>kernel</dc:subject><dc:subject>kvm</dc:subject><dc:subject>system</dc:subject><dc:subject>virtualization</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/43.html</guid>
		<description><![CDATA[
即将推出的linux 2.6.20内核包含一个全新的虚拟技术: KVM, 全称为基于内核的虚拟机. 它很友好, 稳定和高性能, 虽然还没有正式发布. 本文从理论和实践介绍KVM的原理, 并给出一些简单的评测报告.

原理简介
当前存在几种不同的虚拟技术. 一种是半虚拟化技术(Paravirtualization), 客户操作系统需做一些修改. 另一种是全虚拟化技术(Full Virtualization), 客户操作系统无需任何修改. 我们知道全虚拟化技术是以降低性能来提高兼容性, 因为在虚拟化环境中如果没有客户操作系统的协助, 系统将很难达到较好的性能. 另一方面, 近来新处理器的开发缩短了这方面的差距. 最新的Intel VT(虚拟技术, Virtualization Technology)和AMD SVM(安全虚拟机, Secure Virtual Machine)从硬件上支持了虚拟技术, 试图取代半虚拟化技术. KVM在标准的Linux内核中增加了虚拟技术, 从而我们可以通过(或将)优化的内核来使用虚拟技术.
在KVM模型中, 每一个虚拟机都是一个由Linux调度程序管理的标准进程. 一个普通的Linux进程有两种运行模式: 内核和用户. KVM增加了第三种模式: 客户模式(有自己的内核和用户模式.)

KVM由两个部分组成:
. 一个是管理虚拟硬件的设备驱动, 该驱动使用字符串设备/dev/kvm做为管理接口.
. 另一个是模拟PC硬件的用户空间组件, 这是一个稍做修改的qemu进程.
QEMU是一个著名的处理器模拟程序, 由法国人Fabrice Bellard开发.
KVM实践: 使用Windows XP做为客户机
KVM仍在开发当中, 我决定来做一些实验. 我使用了2.6.20-rc2内核和现成的Debian软件包: kvm和qemu. 重新编译内核和安装软件包后, 一切准备就绪.
安装客户机的操作系统非常简单:
qemu-img create hda.img -f qcow 6G
kvm -no-acpi -m [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2006/1229/linuxkernel.gif" alt="" /></p>
<p>即将推出的linux 2.6.20内核包含一个全新的虚拟技术: KVM, 全称为基于内核的虚拟机. 它很友好, 稳定和高性能, 虽然还没有正式发布. 本文从理论和实践介绍KVM的原理, 并给出一些简单的评测报告.</p>
<p><a id="more-43"></a></p>
<p><strong>原理简介</strong></p>
<p>当前存在几种不同的虚拟技术. 一种是半虚拟化技术(Paravirtualization), 客户操作系统需做一些修改. 另一种是全虚拟化技术(Full Virtualization), 客户操作系统无需任何修改. 我们知道全虚拟化技术是以降低性能来提高兼容性, 因为在虚拟化环境中如果没有客户操作系统的协助, 系统将很难达到较好的性能. 另一方面, 近来新处理器的开发缩短了这方面的差距. 最新的<a href="http://www.intel.com/technology/virtualization/" target="_blank">Intel VT</a>(虚拟技术, Virtualization Technology)和<a href="http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_8796_14287,00.html" target="_blank">AMD SVM</a>(安全虚拟机, Secure Virtual Machine)从硬件上支持了虚拟技术, 试图取代半虚拟化技术. KVM在标准的Linux内核中增加了虚拟技术, 从而我们可以通过(或将)优化的内核来使用虚拟技术.</p>
<p>在KVM模型中, 每一个虚拟机都是一个由Linux调度程序管理的标准进程. 一个普通的Linux进程有两种运行模式: 内核和用户. KVM增加了第三种模式: 客户模式(有自己的内核和用户模式.)</p>
<p><img src="http://blog.zhaoke.com/data/2006/1229/kvm_fig2.gif" alt="" /></p>
<p>KVM由两个部分组成:</p>
<p>. 一个是管理虚拟硬件的设备驱动, 该驱动使用字符串设备/dev/kvm做为管理接口.<br />
. 另一个是模拟PC硬件的用户空间组件, 这是一个稍做修改的qemu进程.</p>
<p><a href="http://fabrice.bellard.free.fr/qemu/" target="_blank">QEMU</a>是一个著名的处理器模拟程序, 由法国人<a href="http://fabrice.bellard.free.fr/" target="_blank">Fabrice Bellard</a>开发.</p>
<p><strong>KVM实践: 使用Windows XP做为客户机</strong></p>
<p>KVM仍在开发当中, 我决定来做一些实验. 我使用了2.6.20-rc2内核和现成的Debian软件包: <a href="http://packages.debian.org/unstable/misc/kvm" target="_blank">kvm</a>和<a href="http://packages.debian.org/unstable/misc/qemu" target="_blank">qemu</a>. 重新编译内核和安装软件包后, 一切准备就绪.</p>
<p>安装客户机的操作系统非常简单:</p>
<p>qemu-img create hda.img -f qcow 6G<br />
kvm -no-acpi -m 256 -cdrom winxpsp2.iso -hda hda.img -boot d</p>
<p>第一步是创建一个虚拟盘(主机系统上的一个普通文件). 我选择了QEMU写时拷贝格式, 文件将随着内容的增多而增大, 这样不至于浪费磁盘空间, 虚拟盘最大为6GB. 虚拟盘准备好后, 开始系统安装. 实际上, 我已经预先做了一项工作(非必须的), 从Windows XP系统安装光盘拷贝所有数据到磁盘上, 简单一个命令 cp /dev/cdrom image.iso). 我使用了-no-acpi参数, 因为QEMU只是实验性的支持ACPI, 在Windows XP系统安装过程中Windows Installer(安装程序)会存在一些问题. </p>
<p>我想没有比这还更简单的安装. 很快就完成了windows的安装. 有人也许会问我, 什么选择windows呢? 好的, 现在我没有理由来选择在linux系统上运行linux虚拟机. 而且, 我也很想做一些Windows虚拟机的测试. 现在你不用安装双启动模式了, 你随时都可以简单启动widnows虚拟机. 然后比如在windows虚拟机中打开IE7来查看本文..</p>
<p><strong>一些基准测试</strong></p>
<p>好的, Windows XP的安装速度很快, 接下来我有更多的时间进行一些基准测试. 提示, 测试工作是部分性的, 非标准测试. 目的是从实验来理解KVM的一些特性. 另外我提供了几个有意思的实例, 做起来也很容易. 一旦完成Windows系统的安装, Windows客户机甚至可以在未经修改的QEMU上运行. 而且我重新编译和安装了kqemu, kqemu是一个由qemu原作者开发的QEMU加速模块(QEMU accelerator module), 可惜它是一个闭源软件. 最后, 我选择了两个测试软件: <a href="http://www.futuremark.com/download/pcmark2002/" target="_blank">PCMark2002</a>和<a href="http://en.wikipedia.org/wiki/Super_PI" target="_blank">Super PI</a>(版本 1.1e). 注意测试硬件的处理器是Intel E6600.</p>
<p><img src="http://blog.zhaoke.com/data/2006/1229/pcmark2002_cpu.png" alt="" /></p>
<p><img src="http://blog.zhaoke.com/data/2006/1229/pcmark2002_memory.png" alt="" /></p>
<p>我认为kqemu和KVM比单独的QEMU模拟器的性能要强很多. 而且可以看到kqemu只比kvm好一点点. 但是我想kvm的性能会不断改进的, 毕竟比起其它虚拟技术, kvm还很年轻.</p>
<p><img src="http://blog.zhaoke.com/data/2006/1229/super_pi.png" alt="" /></p>
<p>运行Super PI的结果是: KVM速度最快, 相当于原始(单机运行)速度(在实际硬件上运行, 无任何虚拟机软件)的84%. 而QEMU的速度是最慢的, 上面图表没有显示实际数据, 我把所有的结果列出来(数值越低越快, 每秒处理100万条指令): QEMU: 492.5 sec, kqemu: 28.5 sec, KVM: 25.5 sec, native: 21.5 sec.</p>
<p><strong>结论</strong></p>
<p>KVM仍在开发当中, 它向我们展示了其真实的潜力. 我想接下来我们会看到更多好的有关kvm的新闻. 届时当kvm集成到Linux官方内核当中, 它将变成一个日用品. 而且kvm不仅会应用到数据中心和服务器系统加固上, 而且也会应用到Linux桌面上. 非常感谢QEMU和KVM开发人员所做的工作.</p>
<p><strong>参考:</strong><br />
<a href="http://linux.inet.hr/finally-user-friendly-virtualization-for-linux.html" target="_blank">Finally user-friendly virtualization for Linux</a><br />
<a href="http://kvm.sourceforge.net/" target="_blank">KVM: Kernel-based Virtual Machine for Linux</a><br />
<a href="http://fabrice.bellard.free.fr/qemu/" target="_blank">QEMU: open souce processor emulator</a><br />
<a href="http://fabrice.bellard.free.fr/qemu/qemu-accel.html" target="_blank">QEMU Accelerator Module</a><br />
<a href="http://article.gmane.org/gmane.linux.kernel/458485" target="_blank">KVM: the original announcement on the linux-kernel list</a></p>
<p><strong>相关文章:</strong><br />
<a href="http://blog.zhaoke.com/46.html">KVM虚拟化常见问题</a><br />
<a href="http://blog.zhaoke.com/45.html">Linux上的虚拟化技术</a><br />
<a href="http://blog.zhaoke.com/42.html">KVM: 基于内核的虚拟驱动</a><br />
<a href="http://blog.zhaoke.com/34.html">Linux内核2.6.20增加虚拟化解决方案KVM</a></p>
<p><strong>备注:</strong><br />
转载请保持文章完整性, 欢迎交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/benchmarks" rel="tag">benchmarks</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/kvm" rel="tag">kvm</a>, <a href="http://zhaoke.com/blog/tag/system" rel="tag">system</a>, <a href="http://zhaoke.com/blog/tag/virtualization" rel="tag">virtualization</a><a href="http://zhaoke.com/blog/tag/benchmarks" rel="tag">benchmarks</a>, <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>, <a href="http://zhaoke.com/blog/tag/kvm" rel="tag">kvm</a>, <a href="http://zhaoke.com/blog/tag/system" rel="tag">system</a>, <a href="http://zhaoke.com/blog/tag/virtualization" rel="tag">virtualization</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/43.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>KVM: 基于内核的虚拟驱动</title>
		<link>http://zhaoke.com/blog/42.html</link>
		<comments>http://zhaoke.com/blog/42.html#comments</comments>
		<pubDate>Wed, 27 Dec 2006 16:44:49 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>kernel</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/42.html</guid>
		<description><![CDATA[
概览
当前虚拟技术存在几种不同的虚拟机管理程序(hypervisors). 其中大多是基于硬件的x86虚拟, 它们的软件层比较复杂. 但随着Intel VT(虚拟技术, Virtualization Technology)和AMD SVM(安全虚拟机, Secure Virtual Machine)的出现, 编写一个hypervisor程序将变得更加容易. 现在我们也可以利用当前开源技术来享用虚拟技术所带来的乐趣.

通用的Hypervisor模型
现在通用的Hypervisor模型包含一个可管理多个&#8221;客户&#8221;操作系统共享硬件的软件层. Hypervisor为专门(特权)的客户系统执行基本调度和内存管理, 通常的委托管理和I/O函数.

图1 - 基于Hypervisor的结构
今天的硬件变得越加复杂. 通常系统的&#8221;基本&#8221;调度操作可称做多个硬件线程(基于单核, 多核单个Socket, 多个Socket处理器). 类似, 片上内存(on-chip)控制器要求内存管理能实现系统分布式内存访问(NUMA)的功能.
当我们投入更多精力集成这些功能到hypervisors的时候, 我们已经有一个成熟的调度器和内存管理系统来处理这些问题 - linux内核.
使用linux做为Hypervisor
在标准的linux内核中增加虚拟技术, 我们能够获得一个已经(或将)优化了的内核, 一个改进的虚拟环境. 在这个模型当中, 每一个虚拟机都是一个由Linux调度程序管理的标准进程. 进程占用的内存由linux内存分配程序管理, NUMA集成到了调度程序当中.
一个通常的linux进程有两种运行模式: 内核和用户. KVM增加了第三种模式: 客户模式(guest mode, 有自己的内核和用户模式, 跟hypervisor没有任何关系).

图2 - 基于kvm的结构
各个模式的分工:
客户模式:  执行非I/O客户代码
内核模式: 切换到客户模式, 处理客户模式下因I/O或特殊指令引起的任何退出.
用户模式: 执行客户相关的I/O任务.
通过集成到内核当中, kvm &#8216;hypervisor&#8217;(虚拟机管理程序)无需修改就能自动跟踪最新的硬件和扩展功能.
一个最小化的系统
传统Hypervisor(虚拟机管理程序)模型其中一个优点是系统是最小化的(见上图2), 仅包含几十万行代码. 然而没有考虑到具有特权的客户机. 客户机访问所有的系统内存, 无论是通过hypercalls调用或为DMA硬件编写的程序. 特权客户出现的故障是不可恢复的, 就如同hypervisor发生故障不能自动重启一样.
一个基于kvm的系统的特权范围是真正最小化的: 仅包含主机内核和附加几千行代码的内核模式驱动, 可提供无限制的硬件访问.
kvm组件
我们以结构为例来了解kvm的简易性, kvm包括两个组件:
一个是管理虚拟硬件的设备驱动, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2006/1228/linuxkernel.gif" alt="" /></p>
<p><strong>概览</strong></p>
<p>当前虚拟技术存在几种不同的虚拟机管理程序(hypervisors). 其中大多是基于硬件的x86虚拟, 它们的软件层比较复杂. 但随着Intel VT(虚拟技术, Virtualization Technology)和AMD SVM(安全虚拟机, Secure Virtual Machine)的出现, 编写一个hypervisor程序将变得更加容易. 现在我们也可以利用当前开源技术来享用虚拟技术所带来的乐趣.</p>
<p><a id="more-42"></a></p>
<p><strong>通用的Hypervisor模型</strong></p>
<p>现在通用的Hypervisor模型包含一个可管理多个&#8221;客户&#8221;操作系统共享硬件的软件层. Hypervisor为专门(特权)的客户系统执行基本调度和内存管理, 通常的委托管理和I/O函数.</p>
<p><img src="http://blog.zhaoke.com/data/2006/1228/kvm_fig1.gif" alt="" /><br />
<strong>图1</strong> - 基于Hypervisor的结构</p>
<p>今天的硬件变得越加复杂. 通常系统的&#8221;基本&#8221;调度操作可称做多个硬件线程(基于单核, 多核单个Socket, 多个Socket处理器). 类似, 片上内存(on-chip)控制器要求内存管理能实现系统分布式内存访问(NUMA)的功能.</p>
<p>当我们投入更多精力集成这些功能到hypervisors的时候, 我们已经有一个成熟的调度器和内存管理系统来处理这些问题 - linux内核.</p>
<p><strong>使用linux做为Hypervisor</strong></p>
<p>在标准的linux内核中增加虚拟技术, 我们能够获得一个已经(或将)优化了的内核, 一个改进的虚拟环境. 在这个模型当中, 每一个虚拟机都是一个由Linux调度程序管理的标准进程. 进程占用的内存由linux内存分配程序管理, NUMA集成到了调度程序当中.</p>
<p>一个通常的linux进程有两种运行模式: 内核和用户. KVM增加了第三种模式: 客户模式(guest mode, 有自己的内核和用户模式, 跟hypervisor没有任何关系).</p>
<p><img src="http://blog.zhaoke.com/data/2006/1228/kvm_fig2.gif" alt="" /><br />
<strong>图2</strong> - 基于kvm的结构</p>
<p>各个模式的分工:<br />
客户模式:  执行非I/O客户代码<br />
内核模式: 切换到客户模式, 处理客户模式下因I/O或特殊指令引起的任何退出.<br />
用户模式: 执行客户相关的I/O任务.</p>
<p>通过集成到内核当中, kvm &#8216;hypervisor&#8217;(虚拟机管理程序)无需修改就能自动跟踪最新的硬件和扩展功能.</p>
<p><strong>一个最小化的系统</strong></p>
<p>传统Hypervisor(虚拟机管理程序)模型其中一个优点是系统是最小化的(见上图2), 仅包含几十万行代码. 然而没有考虑到具有特权的客户机. 客户机访问所有的系统内存, 无论是通过hypercalls调用或为DMA硬件编写的程序. 特权客户出现的故障是不可恢复的, 就如同hypervisor发生故障不能自动重启一样.</p>
<p>一个基于kvm的系统的特权范围是真正最小化的: 仅包含主机内核和附加几千行代码的内核模式驱动, 可提供无限制的硬件访问.</p>
<p><strong>kvm组件</strong></p>
<p>我们以结构为例来了解kvm的简易性, kvm包括两个组件:<br />
一个是管理虚拟硬件的设备驱动, 该驱动通过一个字符串设备/dev/kvm来显示其能力.<br />
另一个是用于模拟PC硬件的用户空间组件, 这是一个稍做修改的qemu进程.</p>
<p>修改过的qemu进程使用mmap()管理客户机的物理内存和调用内核模式下的驱动运行于客户模式.</p>
<p>I/O模型直接来自于qemu, 支持可写时拷贝磁盘映像和其它qemu的功能.</p>
<p><strong>I/O性能</strong></p>
<p>当执行客户的I/O任务时, kvm模型具有一些性能上的优点. 考虑特权客户系统的事件顺序:</p>
<p>. 客户发起一个I/O指令.<br />
. Hypervisor通过陷阱捕获I/O指令, 然后转发到特权客户(一些指令可能在内部进行处理)<br />
. Hypervisor调度程序用来调度特权客户<br />
. 普通客户切换到特权客户状态.<br />
. 调用特权客户中断处理程序, 引发I/O进程由特权客户调度程序进行调度<br />
. 执行进程上下文切换.<br />
. 通过I/O进程初始化客户的I/O.<br />
. I/O进程发送信号(通过特权客户内核和hypervisor): I/O的初始化结束.<br />
. Hypervisor切回到最初的客户.<br />
. Hypervisor继续执行客户代码</p>
<p>Kvm主机上同样的执行顺序:</p>
<p>. 客户发起一个I/O指令.<br />
. 主机内核通过陷阱捕获指令和退出到虚拟机用户空间状态(一些指令可能在内核模式进行处理)<br />
. 通过虚拟机用户空间初始化客户I/O.<br />
. 虚拟机用户空间返回到内核状态.<br />
. 内核继续执行客户代码</p>
<p><strong>管理</strong></p>
<p>自从虚拟机只是一个进程, 所有标准linux进程管理工具都是适用的: 你可以使用kill命令终止, 停止和继续虚拟机的运行(或甚至使用Ctrl-C和类似的键盘快捷键)和使用top查看资源使用状况. 通过普通的linux方法来设置权限: 虚拟机属于启动它们的用户(可以不是root, 但必须能访问/dev/kvm), 所有访问都由内核来进行确认.</p>
<p>系统管理员允许使用现有的工具来管理虚拟机, 主机系统允许逐步增加更多的虚拟机.</p>
<p><strong>结论</strong></p>
<p>为了平衡新silicon芯片提供的能力, kvm模型介绍了一种新的虚拟技术, 它能够很好利用linux的结构和最新的功能. 更多的是, 通过可加载模块方式集成hypervisor到主机的linux内核当中能够简化虚拟环境的管理和提高性能, 减小对已有系统的最小影响.</p>
<p><strong>参考</strong>:<br />
<a href="http://www.qumranet.com/wp/kvm_wp.pdf" target="_blank">KVM: Kernel-based Virtualization Driver</a></p>
<p><strong>相关文章</strong><br />
<a href="http://blog.zhaoke.com/46.html">KVM虚拟化常见问题</a><br />
<a href="http://blog.zhaoke.com/45.html">Linux上的虚拟化技术</a><br />
<a href="http://blog.zhaoke.com/43.html">用户友好的Linux虚拟技术: KVM</a><br />
<a href="http://blog.zhaoke.com/34.html">Linux内核2.6.20增加虚拟化解决方案KVM</a></p>
<p><strong>备注</strong>:<br />
转载请保持文章完整性, 欢迎交流.
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a><a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/42.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>LCA 2007 澳大利亚Linux内核(小型)会议</title>
		<link>http://zhaoke.com/blog/40.html</link>
		<comments>http://zhaoke.com/blog/40.html#comments</comments>
		<pubDate>Sun, 24 Dec 2006 09:32:34 +0000</pubDate>
		<dc:creator>zhaoke</dc:creator>
		
	<dc:subject>kernel</dc:subject><dc:subject>kernel</dc:subject>
		<guid isPermaLink="false">http://blog.zhaoke.com/40.html</guid>
		<description><![CDATA[
如果你是一个Linux内核黑客, 也许会对LCA 2007澳大利亚Linux内核会议有所兴趣, 他们的网站是: The Kernel miniconf. 该会议于2007年1月16日在澳大利亚的新南威尔士大学举行.
参考:
LCA 2007 Kernel Miniconf

Keyword: kernelkernel]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zhaoke.com/data/2006/1224/linuxkernel.gif" alt="" /></p>
<p>如果你是一个Linux内核黑客, 也许会对LCA 2007澳大利亚Linux内核会议有所兴趣, 他们的网站是: <a href="http://lca2007.linux.org.au/Miniconfs/Kernel" target="_blank">The Kernel miniconf</a>. 该会议于2007年1月16日在澳大利亚的新南威尔士大学举行.</p>
<p><strong>参考</strong>:<br />
<a href="http://blogs.iventor.org/zhaoke/2006/12/23/lca-2007-kernel-miniconf/" target="_blank">LCA 2007 Kernel Miniconf</a>
</p>
Keyword: <a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a><a href="http://zhaoke.com/blog/tag/kernel" rel="tag">kernel</a>]]></content:encoded>
			<wfw:commentRss>http://zhaoke.com/blog/40.html/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

