2014/03/27

In linux, the system call sys_kill() is used to send signals to processes, although the function’s name has a ‘kill’, it doesn’t just send a SIGKILL to kill a process, actually, all the signals which are defined in arch/x86/include/asm/signal.h can be sent by sys_kill().

SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
{
	struct siginfo info;
	struct task_struct *p;
	info.si_signo = sig;  
	info.si_errno = 0;
	info.si_code = SI_USER;  // From where the signal comes
	info.si_pid = task_tgid_vnr(current); // sending process id
	info.si_uid = current_uid();
	return kill_something_info(sig, &info, pid);
}
 (more...)
已经有1,987个围观
2014/01/02

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

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

已经有3,932个围观
2014/01/01

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

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

(more…)

已经有2,743个围观
2013/07/28

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

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

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

patch的链接在这里

(more…)

已经有7,528个围观
2013/05/02

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

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

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

(more…)

Tags: . 已经有4,756个围观
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 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.
(more…)

Tags: ,. 已经有12,386个围观
2013/03/17

离导师发来开题通知已经过去3个礼拜了,而且下周四学校也要组织不定期检查,可悲的是我到现在还没想好毕业论文写什么。

毕业论文主题应该会是和KVM相关的,因为去年下半年就看过一部分,如果要改成写Linux Kernel的其他模块,又要几乎重新从零开始,还是省点力吧。之前想过很多题目,比如《KVM虚拟机研究及性能优化》感觉范围太大了,又改成《KVM内存虚拟化研究及优化》又觉得范围太小了。

其实范围的大小不是主要问题,最最难的是怎样在论文里提出自己的观点,发现不合理的地方并做出改进。 这一点太TM难了。 要知道Linux内核代码都是大牛们杰作,这些人技术上远远的超过我,都甩开我几条街了,我如何去发现他们代码里面不合理的地方呢!简直天方夜谭。

(more…)

已经有9,944个围观
2013/02/22

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

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

Tags: ,. 已经有21,619个围观
2013/01/29

上篇博客里讲到要介绍KVM 影子页表和EPT, 于是尝试着去读源代码,发现很难读懂,所以第三篇学习笔记这么久才“写”出来。至于为什么难懂,我想原因应该是这样的:

1、不知道为什么需要影子页表或者EPT,只是知道有这个概念然后去读代码,所以读得晕头转向,白费了很多功夫。 一个新的方案被提出来肯定是为了解决原有的代码无法解决的问题,所以在读源码之前一定要明白为什么要有影子页表,没有就不行吗?现有的MMU、内存分页机制又会产生哪些制约呢? EPT的出现又解决了影子页表的哪些缺点呢?这些都是预备知识,一定要搞清楚。

2、对体系结构方面的知识理解不够深入,这个是硬伤,只能一边看一边补习了。

(more…)

已经有11,648个围观
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做一些必要的处理再返回。

(more…)

已经有4,429个围观
2012/12/15

最近用一些零碎的时间学习KVM,算算大概也快有一个月了吧,进度还是很缓慢的,感觉该写一些类似读书笔记的东西了。欢迎大家来讨论,如果有错误,还请不吝赐教

KVM 即 Kernel Based Virtual Machine, 是一个内核模块,使用它需要CPU支持虚拟化。加载KVM模块后,系统中会有一个 /dev/kvm 设备,这个设备提供 ioctl 和 mmap操作。目前,KVM还必须和修改过的Qemu配合起来使用(这样说是不准确的,因为已经有一个叫 native kvm tool的东东了),KVM 使用Qemu做I/O模拟,虽然Qemu也提供CPU的模拟,但是KVM不用,也许这正是KVM+Qemu比单纯用Qemu进行虚拟化性能高的原因吧。

运行在Qemu中的虚拟机被称为Guest,运行Qemu的物理机称为Host, 每一个guest是host上的一个进程,guest的每一个cpu对应进程中的一个线程。Qemu和KVM之间通过ioctl进行交互,KVM和guest之间通过VM Entry和VM Exit进行切换。 (more…)

已经有4,772个围观
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当然就收不到了。

(more…)

已经有35,221个围观
2012/10/04

以前看到过一个很文艺的话:“要么旅行要么读书,身体或者是心灵,总有一个需要在路上”,平时工作学习太累了,那么乘着假期风和日丽的好天气,环太湖挑战一下吧!

骑行路线从江苏吴江出发,顺时针环太湖一圈,下图是总路线。

(more…)

Tags: . 已经有21,203个围观
2012/09/29

简单回顾一下OpenStack三大组件的用途:

OpenStack Compute (Nova),为云组织的控制器,它提供一个工具来部署云,包括运行实例、管理网络以及控制用户等等。
OpenStack Object Storage (Swift),是一个可扩展的对象存储系统。
OpenStack Image Service (Glance),是一个虚拟机镜像的存储、查询和检索系统。

对于Nova,我们先来看一张图:

(more…)

Tags: . 已经有12,180个围观
2012/09/23

OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一, 是整个OpenStack项目的一个模块。

Swift最适合的就是永久类型的静态数据的长期存储。
比如虚拟机的镜像啦,文档的备份啦,还有陈老师、李老师的艺术作品啦之类的。

先来熟悉一下Swift中的几个概念:
Account
出于访问安全性考虑,使用Swift系统,每个用户必须有一个账号(Account)。只有通过Swift验证的账号才能访问Swift系统中的数据。提供账号验证的节点被称为Account Server。Swift中由Swauth提供账号权限认证服务。用户通过账号验证后将获得一个验证字符串(authentication token.),后续的每次数据访问操作都需要传递这个字符串。

Container
Swift中的container可以类比Windows操作系统中的文件夹或者Unix类操作系统中的目录,用于组织管理数据,所不同的是container不能嵌套。数据都以Object的形式存放在container中

(more…)

Tags: . 已经有202,033个围观