系统概况: host 和 guest 都是用的 Ubuntu Server 16.04系统。 我的 host 机上有三块网卡2块有线网卡(接口 enp1s0 和 enp3s0)和1个无线网卡(接口 wls2s0)。 我的 host 机通过无线网卡连在一个路由器上,并因此能够连接到互联网,所在的网段是192.168.3.0\24,ip 固定为192.168.3.5。 其他两块有线网卡没有连接。 实验0: 效果: guest 与 guest、guest 与 host 之间可以互相 ping 通;guest 不能访问 host 所在路由器网段(192.158.3.0\24)。 方案: 在 host 中搭建了一个虚拟网桥,将 qemu-bridge-helper 工具在启动虚拟机时创建的虚拟网络接口 tap0[1,2…] 与 host 桥接在一起,我手动配置了他们的网段是192.168.4.0\24。 步骤: 1.配置 host 的 /etc/network/interfaces ,在其中加入以下内容,然后通过 /etc/init.d/networking restart 重启服务来创建网桥。 auto br0 iface […]

http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-accordance-with-c-programming-language-standards 在内核中fs/ext3/indoe.c中,一个struct初始化格式个这样的: static const struct address_space_operations ext3_writeback_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_writeback_writepage, .write_begin = ext3_write_begin, .write_end = ext3_writeback_write_end, .bmap = ext3_bmap, .invalidatepage = ext3_invalidatepage, .releasepage = ext3_releasepage, .direct_IO = ext3_direct_IO, .migratepage = buffer_migrate_page, .is_partially_uptodate = block_is_partially_uptodate, .error_remove_page = generic_error_remove_page, }; 我以前没见过这种形式,于是查了一下,原来这是属于C99的“新”特性。 初始化 对于最初(C89)一般形式的struct初始化,需要在大括号中按照成员顺序初始化,和初始化数组很类似;而C99支持乱序初始化,只要给出初始化的变量名,并且在前面加点,后边加等号即可。下面举例和c语言中一般形式的初始化结构体对比:

最近在实验室学习,chrome竟然称为了我使用的主要工具,不论是看博客或是看一些文档、论坛都离不开浏览器。chrome浏览器非常好用,通过登录google账号,可以同步设置、书签甚至插件。这里推荐几个我用的Chrome插件,能提高工作效率,大家根据名字都能搜到。 Octotree 可以在显示github网页左侧显示类似工程目录的侧边栏。 OneTab 可以一键将暂时没看完的标签收集起来,有时间(内存)时可以一键展开重新加载。 Tab Split 可以一键将标签栏的标签分开成两个窗口,防止标签太多开不清标题。 Vimium 可以用类似Vim的快捷键操纵浏览器。可以基本告别鼠标了。。。 # 我的Vimium按键映射配置 map <c-f> scrollFullPageDown map <c-b> scrollFullPageUp map <c-h> goBack map <c-l> goForward map <c-j> scrollLeft map <c-k> scrollRight map h previousTab map l nextTab map o Vomnibar.activateInNewTab map O Vomnibar.activate # 我的Vimium搜索引擎配置 w: http://www.wikipedia.org/w/index.php?title=Special:Search&search=%s Wikipedia b: http://www.baidu.com/s?wd=%s&ie=utf-8 Baidu t: http://s.taobao.com/search?q=%s taobao s: https://scholar.google.com/scholar?hl=zh-CN&q=%s […]

(发布于 April 3, 2013, 意译于12/9/2016) 原文链接 :https://lwn.net/Articles/545244/ 另一个版本的翻译(有些句子没有翻): http://kernel.taobao.org/index.php?title=%E5%86%85%E6%A0%B8%E6%9C%88%E6%8A%A52013-04#In-kernel_memory_compression 吐槽 : 我的天呐!!翻译完我才发现有人翻译过了,早知道我就不自己翻译了,痛苦死我了。。 PS :内容我还没有完全理解,仅供参考,以原文为准。 阿姆达尔定律告诉我们一个计算机系统肯定存在一个瓶颈。历史上,对于很多工作负载这个瓶颈都是cpu,所以人们在不断提升cpu性能。所以现在,渐渐地,ram成为了瓶颈。有时当数据在ram和disk之间来回传递时,cpu就在一边干瞪眼呢。增大ram有时并不是一个好的或者经济的做法,更快的I/O或者ssd可以缓解问题,但是不能消除这个瓶颈。 如果可以增大ram中数据的有效容量,不是很好吗?既然cpu闲置,也许我们可以拿闲置的cpu周期来专注这件事。这就是内核内压缩的目标:用闲置的cpu周期来做ram中的压缩和解压缩。 算上刚刚发布的zswap,现在有3个内核内实现的压缩方法在被建议merge到内核的内存管理(memory management, MM) 子系统:zram, zcache和zswap。乍一看可能会让人觉得一个就够了吧,但是他们三个却有很大的不同,可能面向着不同的用户群。所以就像现在内核中存在很多文件系统一样,有一天内核中也会存在多种压缩方案吧,不过这还得李纳斯大神和主要的内核开发者说了算。。。为了方便说明,本文把这些方案统称“zproject”,并对比了这些方案。我们先说明一些关键原则和压缩遇到的挑战。然后我们会从三个层次说明并详细地阐释这些zprojects设计上的不同选择,之后我们还讨论zprojects怎么和内核其他部分交互,最后给出结论。 压缩基础 要让压缩在内核中工作,内核必须把字节序列放入内存中再压缩,之后内存中也应保有压缩后的版本,以备这些数据被再次使用。压缩状态下的数据不能被读写,所以对压缩版本的数据再进行解压缩后才能继续读写这些数据。 字节序列压缩多少都可以,但还是以一个固定大小的单元压缩较方便。贯穿整个内核的一种基本的存储单元是page,一个page由PAGE_SIZE个字节组成,通常的linux支持的架构中,page的大小是4KB。如果这个page对准了PIGE_SIZE的地址分界,那么它就被称为page frame。对于每个page frame,内核在ram中都有相应的struct page结构。所有这三个zprojects都用page作为压缩的单元,并且通过开辟和管理page frames来存储压缩页。 有很多可用的压缩算法,但总的来说,高压缩比意味着高cpu周期,运行的快的算法一般压缩比较低。在时间效率和压缩率之间做出权衡很重要。这三种zprojects,默认都使用内核lib/文件夹中的LZO(1X)算法,这种算法做出了很好的权衡。然而,算法的选择还是很灵活的,也许cpu运行的算法还会被一些特殊架构的硬件压缩引擎取代呢。 一般,存在一些数据一会儿压缩一会儿解压缩的循环,数据序列大概和序列中的字节数成正比。因为页比较大,页压缩和解压缩都是很昂贵的操作,所以我们希望限制这些操作的数量。因此我们必须谨慎的选择哪些页要被压缩,尽可能找到那些可能会被再次用到同时最近不会用的页,以免把cpu时间浪费在重复的压缩然后立刻又解压缩上。因为压缩页不能直接访存某个字节,我们必须要保证内核清楚地辨识出哪个是压缩页,避免对压缩页中的字节尝试cpu的线性地址操作,同时保证压缩页可以被找到并可以在被访问时解压缩。