Archive for ‘Linux’ Category

2016/02/25

很多纯 C 语言的项目都会自己开发一套基础数据结构,比如最常见的就是造一个 C++ Vector 或者 String 的轮子,有了 Vector 以后就可以往里面自由 add() 任意类型的数据,在具体实现中用 Void* 做强制类型转换,这样带来的问题是无论 gdb 还是 printf 调试程序,都必须手动转换指针指向的那一块内存区域:强制转换类型、明确数据占据的内存大小。例如 gdb 中打印 vector[0] 或者 vector[i] 的命令就必须写成这样: print *((unsigned long*)(vec->data + 8*i)) 当无法修改程序源码只能用 gdb 时,打印一个 vector 数组是相当蛋疼的事情,好在 gdb 提供了一个自定义命令的功能,或者说可以先把自定义的命令写成一串指定保存到文本中,然后在 gdb 中加载这个文件就可以使用这个命令了: define printvec set $total = $arg0->n_element // arg0 表示输入的第一个参数,arg1 类推 set $i = 0 print $total while […]

1,360 views
2016/02/03

又快过年了,爸妈也回到了安徽老家,这是我第三年没有回家过年了。前几天晚上一大家人在外婆家吃饭,饭后翻看着我们小时候的照片(真的可以算是“发黄的老照片”了),姐姐和妈妈也用手机拍了很多通过微信发给我看,由于时差的原因,我当时正在睡觉,早上醒来拿着手机看了好久,满满的都是回忆。今天 kc 还在群里问我啥时候回家,我说,我当然也想回家,特别是每当逢年过节,阖家团圆的时候,你们是无法感受到一个在外漂泊游子的思乡之情的。 这几天上班的路上一直听《小小》这首歌,以前听的时候就觉得歌词写得很让人有感触,拿起手机看了下发现居然是方文山作词,周杰伦作曲的。其实这首歌吸引我的并不是歌词里说的两小无猜、青梅竹马的爱情,而是透过歌词道出的对童年、对往事的那份回忆。

945 views
2015/11/08

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

1,722 views
2015/05/10

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

2,343 views
2014/01/02

如果你稍微了解过Linux内核的内存管理,那么对内存分区的概念一定不陌生,Linux内核把物理内存分成了3个区, 0 – 16M 为ZONE_DMA区, 16M – 896M 为ZONE_NORMAL区, 高于896M 为ZONE_HIGHMEM区 我没有去考证过为什么要取896这个数字,但是可以肯定的是这样的划分在当时看来是合理的,然而计算机行业的发展今非昔比,现在4G的物理内存已经成为PC的标配了,CPU也进入了64位时代,很多事情都发生着改变。

15,273 views
2014/01/01

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

14,284 views
2013/07/28

再不更新真的是太对不起观众了。 整个六月、七月都非常的忙碌。首先是在IBM实习的时候,组内给我分配了一个任务,即为perf添加对Power7 的PMU事件名称的支持,Power7支持多达500多个事件,所以我需要在内核源码里面添加500多项(行)。单从数量上来说这个改动还是蛮大的(实际上只是重复的体力劳动啦 ^_^),如果我能完成了这个patch并且被接受的话,就能在Linux Kernel源码里面留下我的大名了。 没过多久我就完成了第一版,经过组内的内部review后发到社区,收到反馈以后改,然后再发,直到发到v4,差不多结束了,接下来就是等待patch被merge到一级一级的分支中去,最终并入主线内核。中间还有几个小插曲:社区的某个人对这个patch提出质疑,认为不应该加入到内核,而应该放在用户态,然后IBM在澳大利亚的一个搞Power的大牛出来争论,甚至最后还用了F开头的单词,最终也就这么不了了之了。这些都是后话,如果有时间我将在以后的博客里面介绍。 patch的链接在这里

22,562 views
2013/03/29

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 […]

Tags: ,. 25,744 views
2013/01/29

There is no excerpt because this is a protected post.

23,681 views
2012/12/22

KVM保证guest OS正确执行的手段就是当guest执行I/O指令或者其他特权指令时,引发处理器异常,从而进入到根操作模式(Intel 的VT-x技术)。 当guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控制寄存器的操作,对MSR(Machine Special Register)的读写操作、数据包的到达等,都会引起CPU发生 VM Exit,发生VM Exit后,KVM 会将guest OS 的状态保存到VMCS中,把Host的状态装入物理CPU,处理器进入根操作模式。接着KVM会读取保存的VMCS中 VM_EXIT_REASON字段的内容,从而知道虚拟机退出的原因。如果由于I/O信号到达,则退出到用户模式,交给Qemu来处理,处理完毕后,再通过KVM重新进入guest OS运行;如果是外部中断,则有KVM做一些必要的处理再返回。

10,609 views
2012/11/23

有一段非常非常非常简单的网络编程代码,C语言,C/S模式,相信每一个学习C语言网络编程的人都写过,正因为特别简单,所以发生错误时第一反应并不是我的代码错了,而是系统的BUG! 事实证明,这种想法真是 too young, too simple, sometime naive ! 无论是系统调用还是库函数代码,全世界那么多人在用,经过这么多年的千锤百炼,发生错误的可能性是很小的,大多时候都是自己的粗心大意。本次乌龙事件最后查明的原因是传给recvfrom函数的最后一个参数 addrlen没有被初始化。 事情是这样的,一个非常简单的客户/服务器程序。 第一次运行 ./server 和 ./client 127.0.0.1 , 当client发送数据的时候,server收到了,但是显示client的IP地址是错误的,因为是错误的IP地址,所以server把回送的数据报发给了错误的地址,client当然就收不到了。

42,615 views
2012/03/31

Linux Kernel实现的链表与众不同,大多数人所熟悉的方式应该是在“链表中包含结构体”,而Linux内核的实现方式则是所谓的“结构体中包含链表”。这样的说法听起来很玄乎,不如给出具体的定义和实例。 1 struct list_head {2    struct list_head *next, *prev;3 }; 这就是内核代码中Linked List的结构体定义,从list_head定义可以看出,内核的链表是循环链表。我们可以这么用它:

12,307 views
2012/03/27

工欲善其事,必先利其器。 首先需要安装一下额外的工具包,一个是 libc6-dbg,这是带有debug symbol信息的 libc.so;另一个是libc6-dev,这是glibc的源代码,获取之后我们就可以在gdb中查看代码了。 在Ubuntu/Debian 系统上,我们可以通过以下2条命令获得:

Tags: ,. 24,598 views
2011/10/01

时间倒回到2011年5月的一天,大学的最后一门课《计算机信息安全技术》,讲到《缓冲区溢出》这一章,并且给出了一段示例代码来演示缓冲区溢出,回到宿舍后出于好奇我运行了一下这段代码,发现结果并不是书上所说的那样,当时在人人网也发过一篇吐槽的日志,但是一直拖到现在都没有仔细的去研究过,正好现在十一放假没事,就花点时间搞搞啦。 书第136页-137页。代码如下,出于简单考虑(其实书上的C++代码格式也是错的),我除去了头文件和cout函数,这样就跟纯C语言代码是一样了。 01 void function(int a) 02 { 03     char buffer[5]; 04     char *ret; 05     ret=buffer+12; 06     *ret+=8; 07 } 08 int main() 09 { 10     int x; 11     x=10; 12     function(7); 13     x=1; 14     return 0; 15 } 书上说最后x的值是10,不是1,而我的结果恰恰相反。 接着用gcc产生汇编代码,在这里用 gcc -O0 -S 命令告诉编译器不采用任何优化措施,产生最原始的汇编代码,这样有利于我们分析,即使是采用-O1级优化的时候,汇编代码已经很难读了,大家可以试一试。 01 function: 02     pushl %ebp 03    […]

Tags: ,. 9,879 views
2011/08/18

Python 新旧版本之间的语法不兼容,导致iBus图标不显示,候选词框也不显示;导致Wicd无法启动。如下图所示。 问题产生: 由于Ubuntu默认安装了python2.6 ,后来我自己又装了python3.1,但是在终端里面输入python启动的是2.6版本的,这个是系统的默认,我们可以查看/usr/bin/目录,如图:   可以看到,python实际上是一个软链接,指向了python2.6 。我把它修改指向python3.1,这样输入python直接启动3.1了,方便我在终端下启动python3.1的交互界面。 这样做带来了文章开头所说的问题,一开始我没想到跟python有关,以为是什么配置文件出错了,于是网上google之,用了不少方法都没有解决问题,后来想:在终端下启动,应该会有一些出错信息吧。于是我输入wicd ,果然出现了错误提示: File “/usr/share/wicd/daemon/wicd-daemon.py”,line 122 print “–no-autoconnect detected,not autoconnecting…” SyntaxError: invalid syntax 看到这句话第一反应是:程序的源码出现语法错误了?不可能啊,以前还正常运行过。 于是打开源代码。 看到print 这一句我恍然大悟了,因为在python3.X中是不允许这样的语法的,这个是2.X的语法,于是知道肯定是修改python链接的指向导致了这个问题,解决办法就是修改回去喽。之后这两个程序都正常显示图标,也能正常使用了。 写这篇文章的意义在于: 1、blog很久没更新了,发一篇充数。 2、发现了另外一种导致iBus 和wicd 等依赖python的程序无法正常启动的原因。网上很多iBus的错误都集中在配置文件和环境变量方面,像我这样的python版本之间语法不兼容导致的错误倒是没看到,所以记录之。

Tags: . 5,199 views