小小

又快过年了,爸妈也回到了安徽老家,这是我第三年没有回家过年了。前几天晚上一大家人在外婆家吃饭,饭后翻看着我们小时候的照片(真的可以算是“发黄的老照片”了),姐姐和妈妈也用手机拍了很多通过微信发给我看,由于时差的原因,我当时正在睡觉,早上醒来拿着手机看了好久,满满的都是回忆。今天 kc 还在群里问我啥时候回家,我说,我当然也想回家,特别是每当逢年过节,阖家团圆的时候,你们是无法感受到一个在外漂泊游子的思乡之情的。

这几天上班的路上一直听《小小》这首歌,以前听的时候就觉得歌词写得很让人有感触,拿起手机看了下发现居然是方文山作词,周杰伦作曲的。其实这首歌吸引我的并不是歌词里说的两小无猜、青梅竹马的爱情,而是透过歌词道出的对童年、对往事的那份回忆。
Continue reading ‘小小’ »

硅谷夜谈 二

君子当谋时而动,顺势而为。

平常在网上查有关技术的资料的时候,经常会搜到一些个人博客,以我的经验通常个人博客里面的文章质量还是不错的,想来原因可能是这样:因为自己花钱买的域名、虚拟主机空间,又费了好大力气搭起博客系统,那么文章肯定会好好写咯。有的时候我看完的想查的内容,也顺便去看一眼博主的自我介绍之类的,有点拜访 “同道中人” 的意思。

现在经常看到有不少大一大二,甚至是高中的小朋友已经在做app开发了,而且都做的很不错,在他们的博客上也谈论着 android、ios 开发的各种术语,很显然,这些术语我都听不懂,大多数时候我只是草草的浏览一遍,不得不感叹后生可畏,也不得不承认自己 “老” 了。

回首我上大一的那会儿已经是8年前,与现在app开发如火如荼的情景相比,那个时候 iPhone 才刚刚发布不久,没有 app 开发这个概念。当年我的诺基亚手机上,唯一算得上是 app 的可能也就是 QQ 了吧。

上大学的时候,我也在想以后毕业了做什么样的工作呢? 学Java .Net?当时觉得这两者一般给企业客户做定制软件的,那时候觉得客户都是不懂技术的傻逼,懒得去跟他们打交道,因此决定不做这个。然后觉得做 Linux 后台开发听起来比较高大上,而且也不会 “过时”,于是就开始玩 Linux,先是安装各种发行版,然后发现做 Linux 开发并不是折腾发行版,于是就打算开始学 Linux 下的 C 开发,开始看 《Unix环境高级编程》之类的书。随着学习深入,越发的对操作系统非常的感兴趣,于是一度想往底层研究,想搞懂 Linux 内核,以至于深深的影响我之后走的道路,从实习到现在的正式工作,我都是在用 C 语言和 Linux 打交道。

如果我现在才读大一,我想我会对app开发产生浓厚的兴趣,因为对于一个刚刚步入软件开发大门的新生而言,能开发出一个app,然后安装在自己的手机上是多么有成就感的事。 我肯定会乐此不疲,那么有可能我与现在走的就是完全不同的一条路。

曾经一度痴迷于 Linux,一方面是喜欢底层的各种技术,另一方面,是觉得 Linux 的技术永远不会过时。现在看来当时的想法并没有错,是的,Linux 永远不会过时,但是让我没有料到的是,app 开发会迅速发展,如火如荼,甚至成为以后做任何一个产品的标配,不但是虚拟世界,app 已经开始影响到我们的衣食住行。

IT 这个行业太瞬息万变,下一个10年,又会发生什么呢?

硅谷夜谈 一

最近湾区天气转凉,早晚温差很大,白天在家坐了一天,临近傍晚的时候感觉手脚冰凉的,突然想到为何不去泡个澡呢?以前在南卡的时候,租的房子是和室友公用卫生间的,我都是冲个澡就走了,现在住的房子有独立的卫生间,相对也比较干净,而且也不怕泡澡占用卫生间过多的时间。说泡就泡,放了一大缸水舒舒服服的洗了个澡,然后靠在床上拿着笔记本上上网,这种感觉真TM爽,有种“偷得浮生半日闲”的意境。

上初中、高中那会儿,每到冬天我也经常这样泡澡。江南的冬天很寒冷,而且TM是湿冷,被子里都感觉潮潮的,所以睡觉前我一般先用电热毯或者热水袋把被子里的寒气去掉。每到周六的晚上,吃完晚饭必做的事情就是泡澡了,在自己家浴缸里放满水舒舒服服洗个澡,经常要泡一个多小时,然后靠在床上,拿本书看看,看累了就直接睡觉。

后来上大学了也基本保持这个习惯,冬天下着小雪,然后拎着换洗的衣服去宿舍不远的公共澡堂,当时学校的澡堂是对社会开放的,澡堂子里有一个大池子,在里面一边泡一边听当地人扯蛋,等到泡出一身汗了,去旁边的淋浴洗一洗。等走出澡堂的时候全身都冒着热气,在冰天雪地里只穿薄薄的一件外套都不觉得冷。回到宿舍躺在床上,架起电脑听听歌上上网,相当舒服。

每年过年回到老家,按照习俗大年三十之前是要洗个澡的,干干净净过新年,一般我是和外公一起在年二十九那天下午去澡堂洗个澡,一年一次给外公擦个背,搓个澡,洗完出来全身热乎乎,然后一起踩着积雪回家,一路有说有笑。

自2013年夏来到美帝,算上今年已经三年没有回家过年了,以后我还是会回到家乡的,因为那里有我熟悉的人和事,还有回忆。

用 Kippo 部署一个蜜罐

前段时间因为拿了一个 digitalocean 的优惠码,于是开了一个 VPS,配置好了一些常用的功能以后就放在那边了,今天登录进去无意间看了一下 /usr/log/auth.log, 也就是ssh登录的记录,TMD发现有成千上万条记录————很显然,有人想暴力破解我的root密码,绝对不能忍!! 于是想到用Kippo部署一个ssh的蜜罐耍一耍这个王八蛋。

Continue reading ‘用 Kippo 部署一个蜜罐’ »

用Python读取pcap文件

pcap 文件通常用 wireshark 工具打开。 wireshark 在抓取和分析网络数据包的时候非常有用,不得不说它是一个很强大的工具。用wireshark 打开pcap文件后,所有的信息一目了然,但是作为一个(伪)geek ,还是需要有一点刨根问底的精神的,总想自己手动解析一次,那么这次就来玩转一下 pcap 文件。

首先看一下 pcap 的文件格式,出乎意料的是pcap的格式非常简单。

pcap

 

 

Pcap Header 是整个文件的头部,存放了关于这个pcap的一些信息。之后每个被捕获的数据包用一个(Head, Data)表示,Head里是关于这个数据包的捕获时间等信息,后面的Data就是这个数据包了。Data包含了MAC帧之上的所有内容。

Continue reading ‘用Python读取pcap文件’ »

硅谷夜谈 零

今天到公司比较早,其他同事都还没来,就随手打开网页上上网,习惯性的在浏览器地址栏输入几个字母,突然在自动补全最下面看到了一个久违的网站—— CFan BBS。回想起来我大概有一年没有登录过这个网站了吧,幸好浏览器自动保存了账号密码,赶紧登录一下,逛了逛这个对现在的我来说熟悉又陌生的地方。

大概是在高中注册的账号,这个论坛陪伴我度过了大一、大二几乎所有的课余时光,那个时候的校园网特别慢,我当时是办的校外的电信网,一个月好像是90还是120个小时的样子,宝贵的上网时间得计划着用,那个时候每天下了晚自习回到宿舍,打开电脑登录论坛灌灌水,有的时候第一天发了帖子问问题,第二天便会迫不及待的登录论坛看看谁给我回复了,也因此结识了一帮共同爱好的朋友;有时候也为在论坛上学了点新知识而沾沾自喜。可以说每天上网的时候是我最开心的时候,而CFan论坛也成了我获取计算机知识一个重要的地方。同一时期网上也有很多其他的技术论坛,但是我偏偏只在这儿安家了,为什么呢? 我也说不清楚。

当年的编程技术讨论区还是比较火热的,如今人走茶凉,荒草丛生,连每月一次的精华帖依然停留在2011年,我对CFan编程版的记忆也停留在2011年,那一年,哥大学毕业。

虽然高中也捣鼓过程序,但走的是野路子。刚进大学的时候我对编程一知半解,编程语言、算法、数据结构对我来说都是全新的东西。大学为我打开了一扇门,让我知道了学编程要学这么多东西,而路要自己去探索,这也许就是大学的意义所在。翻一翻我曾经发过的帖子,现在看来真的很幼稚,代码写的乱七八糟也非常自信的发到论坛,还被加了精华,要是哪天某个好事者把我发的帖子扒出来黑我的话,脸都不知道往哪搁。但就是凭着这份初生牛犊不怕死的精神,经常在论坛里灌水,因此结识了一帮好友,也充实了大学的课余时光。试想一下,与其在宿舍和同学打游戏看黄片,还不如在论坛发点精华帖来的有意义。

看着我以前发的帖子,虽然幼稚,但是却隐隐约约透过屏幕让我感觉到了那份久违的满腔热血,而这份满腔热血正是我渐渐被时间所磨灭的东西。几天前,我在18摸实习时认识的内核大神 Xiao Guangrong 也重新开张了他的博客,在新博客中他写道“路漫漫其修远兮,吾将上下而求索”,大神都如此,我等更应当加倍努力。

我是一个意志力薄弱的人,经常给自己定了目标最后又不了了之,所以有必要把一些思绪记录下来,提醒自己不忘初心。

Start

博客荒废了很久,从现在开始要好好写博客了,思绪来得快走的也快,不记录下来就没了。
好在现在工作定下了,以后上班下班按部就班,目标要在技术上有所成长,毕竟年纪也不小了。

Depth First Search

深度优先搜索一般用递归的方法实现,但是怎么写好一个递归程序对于我来说挺难的。
每隔一段时间写又会犯各种错误,思绪来得快也走得快,有必要记录一下。

首先用一个问题来引出 DFS:给定一个字符串,要求用空格来分割,生成它的所有可能的分割方法。
比如给定 “abc”, 那么可能的分割是
“a” “b” “c”
或者 “ab” “c”
或者 “a” “bc”

这些题目都是给一个字符串,生成符合题意要求的分割后的结果。 既然解法类似,那么代码肯定也是类似了,只是会多加一些判断条件。

我们先回到一开始的问题:如何生成所有可能的分割?
Continue reading ‘Depth First Search’ »

Why Does Not X86_64 Have ZONE_HIGHMEM

如果你稍微了解过Linux内核的内存管理,那么对内存分区的概念一定不陌生,Linux内核把物理内存分成了3个区,
0 – 16M 为ZONE_DMA区,
16M – 896M 为ZONE_NORMAL区,
高于896M 为ZONE_HIGHMEM区

我没有去考证过为什么要取896这个数字,但是可以肯定的是这样的划分在当时看来是合理的,然而计算机行业的发展今非昔比,现在4G的物理内存已经成为PC的标配了,CPU也进入了64位时代,很多事情都发生着改变。 Continue reading ‘Why Does Not X86_64 Have ZONE_HIGHMEM’ »

Linux Memory Management Slob Allocator 1

貌似2013年写的技术文章只有个位数,实在是不应该啊! 最近几天看了些Linux Kernel的内存管理,就写点东西吧。

我们知道Linux内核内存管理最底层的是伙伴系统,伙伴系统解决是的内存外碎片问题,而不能解决内碎片问题,因此在伙伴系统之上,有Slub/Slab/Slob 三种内存分配策略(有的书上叫高速缓存,我个人很不喜欢这个名字,因为很容易与硬件的高速缓存TLB混淆),不过内核同时只能使用这三种中的一种,Slub 是现在内核默认的选项,无论是我们安装在自己电脑上的Linux系统,还是运行在服务器上的系统,都是用的Slub; Slab 作为鼻祖曾经辉煌一时,现在退居二线了; Slob 则是主要用于内存非常小的嵌入式系统,只有在编译内核的时候配置了 Embedded System 选项,才可以选择使用Slob。

Continue reading ‘Linux Memory Management Slob Allocator 1’ »

I Changed My Mind

再不更新真的是太对不起观众了。

整个六月、七月都非常的忙碌。首先是在IBM实习的时候,组内给我分配了一个任务,即为perf添加对Power7 的PMU事件名称的支持,Power7支持多达500多个事件,所以我需要在内核源码里面添加500多项(行)。单从数量上来说这个改动还是蛮大的(实际上只是重复的体力劳动啦 ^_^),如果我能完成了这个patch并且被接受的话,就能在Linux Kernel源码里面留下我的大名了。

没过多久我就完成了第一版,经过组内的内部review后发到社区,收到反馈以后改,然后再发,直到发到v4,差不多结束了,接下来就是等待patch被merge到一级一级的分支中去,最终并入主线内核。中间还有几个小插曲:社区的某个人对这个patch提出质疑,认为不应该加入到内核,而应该放在用户态,然后IBM在澳大利亚的一个搞Power的大牛出来争论,甚至最后还用了F开头的单词,最终也就这么不了了之了。这些都是后话,如果有时间我将在以后的博客里面介绍。

patch的链接在这里

Continue reading ‘I Changed My Mind’ »

Picking Tea Leaves

“五一” 假期去了安徽省黄山市歙县,此行的目的是去参加表哥的婚礼的,也顺便趁着春暖花开之际去爬爬山。

第一天去山上的野生竹林里采了好多竹笋,野生的、纯天然的哦!!(可惜当时没带相机,所以也没拍照片了);第二天去山上采了好多茶叶,有不少是野生的茶树回来以后和爸妈摸索着用灶上的锅烘干,制成了真正的茶叶,我现在杯子里喝的就是呢!!

身处大山深处,远离城市的喧嚣,有一种世外桃源的感觉,于是我决定等以后不干IT这行了就归隐山林,过“采菊东篱下,悠然见南山”的日子。

Continue reading ‘Picking Tea Leaves’ »

Access Kernel Space From User Space by Using mmap

This post will introduce a funny way to access physical memory from user space, I will:

  • write a kernel module and load it. The module will allocate a page in kernel space and write some characters in this page.
  • write a user program, read the content of that page and print.
    What’s the difficulty in doing this ?

As we know, a user program (or process) has its own virtual address space, when it calls malloc() to apply a block of memory, the malloc will return the start address of the allocated virtual memory, user program doesn’t know the actual start address of physical memory.

Here, I will access the physicall address from a user program with the help of /dev/mem.

Firstly, let’s talk about /dev/mem, and enable access to /dev/mem

/dev/mem is a virtual device which provides a way to access to system physical memory, but unfortunately, in most Linux distributions, userspace(including root) can’t read /dev/mem by default [1]. So, if you want to use this feature, please compile a new kernel by yourself. I will show you step by step.

go to www.kernel.org download a latest version of linux kernel.
decompress it.

the following is in command line ( shell ):
$ sudo su //change to root
# make menuconfig // this will generate a .config file
# vim .config
set
CONFIG_STRICT_DEVMEM=n
CONFIG_X86_PAT=n
CONFIG_EXPERT=y

ok, continue to compile it.

# make -j4
# make modules
# make module_install
# make install

reboot my computer, and I will enter OS with a new kernel.

Secondly, let’s write a kernel module.

mmap.c :

to compile the kernel module, I need a Makefile:

# make
after make, a kernel module “mmap.ko” will appears in my current directory.
# insmod mmap.ko
then, look the “printk(“addr= 0x%08x\n”, (int)addr);” in `dmesg`
# dmesg

[80005.141345] addr= 0x77128000

Finally, write a user program using mmap() function.

the declaration of mmap is:

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

`man 2 mmap` says:

The contents of a file mapping are initialized using `length` bytes starting at offset `offset` in the file (or other object) referred to by the file descriptor fd. `offset` must be a multiple of the page size.

so, I can use the address printed by mmap.ko (0x77128000) as the `offset` parameter.

user.c

Attention, the KERNEL_PHY_ADDR may vary every time you load the mmap.ko, so, if you copy the code and complie it on your own computer, please remember to change it.

ok, compile user.c
# gcc -o user user.c

make sure you are a super user
# ./user

the out put is:

With great power, comes great responsibility

That’s all.

References
[1] http://lwn.net/Articles/267427/
[2] http://stackoverflow.com/questions/9662193/how-to-access-kernel-space-from-user-spacein-linux
[3] http://hi.baidu.com/damonzhou/item/e15d06e9ae20f1f5e1a5d4a9

Skiplist and its Implementation

跳表(skiplist) 是一个非常有趣的、简单的数据结构, 应用也非常广泛, 著名的NoSQL内存数据库Redis, 就用到了skiplist作为排序集合的基础数据结构。 跳表最大的特点就是插入、删除操作的性能均为O(logn) 。

关于它的原理网上有一大堆,如果不了解的话,可以先看看文章末尾的【参考资料】, 或者动手google一下。 正好这里也有一篇我觉得写的不错的文章, 可以猛击此处 。
Continue reading ‘Skiplist and its Implementation’ »