在Ubuntu10.10上升级内核到2.6.36使用systemtap

一直在 linux 平台上做开发工作已经几年了,但对 linux 内核都没有认真研究过,个人对 linux 的了解都停留在系统 api 的使用层面,对 linux 的底层设计了解甚少。在身边的同事,不凡有熟悉 linux 内核的高手,在他们的耳濡目染下,也激发了自己研究 linux 内核的激情,所以在自己的小黑上装上了 vmware Ubuntu10.10  下面我将分享一下个人在搭建环境和学习 linux 内核的一些初步准备工作。

我学习 linux 内核分成两个方面,理论学习和实践。理论学习主要偏重理论书籍的阅读,短时间内,我囫囵吞枣的扫描了如下的介绍 linux 内核的书籍,《 linux 内核完全注释》,《 linux 内核修炼之道》,《 linux 内核设计与实现》第二版,《深入理解 linux 内核》第三版,《 独辟蹊径品内核 -- LINUX内核源代码导读 》,还有一本与内核关系不是太大,《 程序员的自我修养— 链接、装载与库》,这些书真的挺理论的,看完了,脑子居然没有留下多少东西,唯一留下的就是感觉 liunx 内核好深奥,真 NB。这肯定不是我想要的学习效果,我需要的是在学习理论的同时,不断地实践,尽量多的理解自己感兴趣的一些技术设计细节。虽然看这些理论书籍比较枯燥,但通过读这些书籍,我宏观上了解了 linux 内核的架构,知道了内核的学习方法,避免在实践时走弯路。个人对文件系统和网络系统比较感兴趣,但经历有限,只会深入研究其中一个系统,兼顾整个内核系统其它模块的学习。我的案头摆着几本以后要重点学习的书籍,《深入理解 linux 内核》第三版, 《深入理解 linux 架构》,《内核网络栈源代码情景分析》,希望这些理论书籍能提升自己对 linux 内核的了解。

下面谈谈我在内核学习中的一些初期实践工作,碰到不少问题,但还是耐心的一个个解决了。首先去 http://www.kernel.org/ 下载了最新的 linux 内核 2.6.36  让后就开始风风火火的准备看代码了,真的是初生牛犊不怕虎,啃了两天代码,也没有看明白一个小模块,看来盲目的学习不起作用,还是得补习点理论知识,于是借来几本理论书籍开始啃,在理论学习过程中,了解了 x86 的架构,汇编相关知识,内存管理,进程调度,文件系统等初步知识,似乎理解得更多一点了,前期学习的理论知识应该准备得差不多了,应该开始详细分析一些感兴趣的代码了。万事开头难,还得从搭建学习环境开始。

一番准备后,在小黑上装上了 vmware ,并装上了 Ubuntu10.10   Ubuntu10.10 自带的内核是2.6.35.22 ,我的学习目标是 2.6.36  所以首先是要升级内核。编译内核前对编译选项做了一些简单裁剪配置,主要打开了一些用于调试的开关。然后就是一番漫长的等待编译过程,最后 make install 。重启,选择 2.6.36 内核启动, oops ,启动不成功,哪里出问题了?重新进入原来的 2.6.35 内核启动系统,查看 /boot/ 目录,有 initrd.img-2.6.35-22-generic 这个 image ,但却没有 initrd.img-2.6. 36 这个image ,难道 vmware 需要内核支持 ramdisk 才能启动?我查看了编译内核的配置,“

Initial RAM filesystem and RAM disk (initramfs/initrd) support ”这个选项也选上了,那为什么编译的时候没有生成 initrd.img-2.6. 36 这个 image 呢?经过一番研究,没找到原因,但发现用 make-kpkg 可以编译出这个 image ,于是安装 make-kpkg 

sudo apt-get install make-kpkg 。

然后进入 linux 源代码的文件夹运行:

make -kpkg --initrd binary-arch

经过一段时间后,在源代码的上层目录生成了三个 deb 的安装文件。

linux-headers-2.6.36_2.6.36-10.00.Custom_i386.deb
linux-image-2.6.36_2.6.36-10.00.Custom_i386.deb
linux-image-2.6.36-dbg_2.6.36-10.00.Custom_i386.deb

分别安装这个三个包:

sudo dpkg -i l inux-headers-2.6.36_2.6.36-10.00.Custom_i386.deb
sudo dpkg -i l inux-image-2.6.36_2.6.36-10.00.Custom_i386.deb
sudo dpkg -i linux-image-2.6.36-dbg_2.6.36-10.00.Custom_i386.deb 

安装完成后重启系统,选择 2.6.36 内核进入系统,啊,成功启动,兴奋一把。尝试运行系统一些命令,似乎也正常。升级内核该告一个段落了吧,好戏还在后头。

Systemtap 是学习内核一个必不可少的工具,它不仅可以侦测内核空间的相关信息,还可以侦测用户空间的信息,是研究内核源代码,调试系统性能的一个必备工具。在 Ubuntu 下如何安装 Systemtap请参考:

http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu

运行 sudo apt-get install systemta p 安装 Systemtap 。由于在升级内核的时候已经安装了相应的debug 信息,

至此内核追踪已经可以执行,但module的信息还需要多做些工作 

sudo apt-get install elfutilsfor file in `find /usr/lib/debug -name '*.ko' -print`
dobuildid=`eu-readelf -n $file| grep Build.ID: | awk '{print $3}'`dir=`echo $buildid | cut -c1-2`fn=`echo $buildid | cut -c3-`mkdir -p /usr/lib/debug/.build-id/$dirln -s $file /usr/lib/debug/.build-id/$dir/$fnln -s $file /usr/lib/debug/.build-id/$dir/${fn}.debug
Done

到这里应该能运行 stap 执行 hello Word 的程序了吧,先试运行一个简单的

sudo stap -ve 'probe begin { log("hello world") exit() }'

运行出错了, error:‘param_ops_int64_t’ undeclared here (not in a function)

这是什么情况,先不管,再试运行一个脚本

sudo stap -c df -e 'probe syscall.* { if (target()==pid()) log(name." ".argstr) }'

任然遇到上面的错误,在网上搜了一番,原来这是 Systemtap  2.6.36 内核支持不好,有这个bug  Systemtap 官方网站说这个 bug 已经修复,使用最新的 Systemtap 就好了。于是下面的网站下载最新的 Systemtap 的源代码,编译安装。

http://sources.redhat.com/systemtap/ftp/snapshots/

然后运行 hello Word 脚本,

Pass 1: parsed user script and 75 library script(s) using 16300virt/12368res/1628shr kb, in 920usr/3670sys/4627real ms.Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 16564virt/12892res/1688shr kb, in 170usr/260sys/526real ms.Pass 3: translated to C into "/tmp/stapa7GBqo/stap_5d4a1f5ec0c40981d6d84405569c6127_669.c" using 16564virt/13116res/1896shr kb, in 150usr/130sys/277real ms.Pass 4: compiled C into "stap_5d4a1f5ec0c40981d6d84405569c6127_669.ko" in 8880usr/18060sys/27864real ms.Pass 5: starting run.hello worldPass 5: run completed in 60usr/2650sys/2871real ms.

试运行一下能否侦测系统函数的调用堆栈,这个功能在看源代码的时候用得着,脚本如下:

#!/usr/bin/stapprobe kernel.function("do_timer").return {print_backtrace();printf("\n");exit();
}

运行输出如下:

Returning from:  0xc0155e60 : do_timer+0x0/0x30 [kernel]
Returning to  :  0xc017574d : tick_do_update_jiffies64+0xed/0x170 [kernel]
0xc017597c : tick_sched_timer+0xbc/0xd0 [kernel]
0xc0169a0a : __run_hrtimer+0x7a/0x1c0 [kernel]
0xc0169df0 : hrtimer_interrupt+0x130/0x2a0 [kernel]
0xc05d08e6 : smp_apic_timer_interrupt+0x56/0x8a [kernel]
0xc05ca5d9 : apic_timer_interrupt+0x31/0x38 [kernel]
0xc012ab4a : native_safe_halt+0xa/0x10 [kernel] (inexact)
0xc0109e93 : default_idle+0x53/0xb0 [kernel] (inexact)
0xc0101e4a : cpu_idle+0x8a/0xf0 [kernel] (inexact)
0xc05c4242 : start_secondary+0x1ec/0x1f2 [kernel] (inexact)

不错, Systemtap 对内核的侦测功能应该运行正常了,下面我们来尝试一下 Systemtap 对用户空间的侦测功能,在开发过程中,我们也不时用 Systemtap 来侦测函数的调用堆栈,调用频率,性能如何等等。先写个简单的程序 test.c 试试看。

#include <stdlib.h>
#include <stdio.h>void func()
{int i = 0;int count = 0;for (i = 0; i < 1000000; ++i){++count;}
}int main(int argc, char** argv)
{func();return 0;
}

编译 gcc -gtest.c -o test ,用户程序要使用 Systemtap 需要在编译时加 -g 选项。写个简单的脚本 calltime.stp 来测试“ func ”的执行时间。

#!/usr/bin/stapglobal tm
global call_timeprobe begin {printf(":\)\n");
}probe process("./test").function("func") {tm = gettimeofday_ns();
}probe process("./test").function("func").return {call_time <<< (gettimeofday_ns() - tm);printf("func call_time: %d\n", @avg(call_time));
}probe end {if (@count(call_time) > 0) {printf("func call_time: %d\n", @avg(call_time));}
}

运行 sudo ./calltime.stp  运行出错了, SystemTap不支持process(" ./test ")的用户 空间 的调试的方法 ,在网上搜罗一番,原来是 Systemtap 对用户空间的调试需要 utrace 支持, utrace 只是在redhat 系统做了支持, Ubuntu 系统中默认不支持,内核也是默认不支持 utrace 。问题找到了,先给内核打上 utrace 的补丁,到如下网站下载 utrace  2.6.36 内核的补丁。

http://people.redhat.com/roland/utrace/

补丁的顺序如下:

  >cd /src/linux2 .6.36>patch – p1 <tracehook.patch>patch – p1 <utrace.patch>patch – p1 <utrace-ptrace.patch 

打好补丁之后,重新编译内核,注意需要选中 utrace 选项  General setup  -->  Infrastructure for tracing and debugging user processes  然后就是按照上面的步骤重新升级内核,内核升级完成后,先运行

sudo ./calltime.stp

等待出现“ :) ”,然后运行 ./test

结果是这样的

:)
func call_time: 10291909

至此,终于配置好了,可以在系统中作更多的测试学习了。

在Ubuntu10.10下升级内核到2.6.36使用systemtap相关推荐

  1. 详解Ubuntu10.10下Qt连接Mysql数据库

    转载自:http://mobile.51cto.com/symbian-273262.htm 详解Ubuntu10.10下Qt连接Mysql数据库是本文要介绍的内容,很详细的步骤,我们先来看内容. 第 ...

  2. 在Ubuntu10.10下安装osd-lyrics

    在Ubuntu10.10下,从google code 下载最新的deb文件安装时,显示错误如下: 下面改用从PPA安装osd-lyrics: 首先,在apt的source.list中添加PPA源: s ...

  3. TinyOS 学习第一周-Ubuntu-10.10下安装TinyOS-2.1.1

    1           Ubuntu-10.10下安装TinyOS-2.1.1 1背景:TinyOS主要有三种运行环境: <1> Windows环境: 虚拟机(Oracle VM Visu ...

  4. linux ubuntu10.10下最好的音乐播放器deadbeef

    linux ubuntu10.10下最好的音乐播放器deadbeef 十一 18 无冷 Linux , Ubuntu 1,162 viewsGo to comment 推荐一款播放器Deadbeef ...

  5. Fedora 18下 升级内核后VirtualBox不能正常使用的问题

    最近因为需要安装了VirtualBox来虚拟xp环境,本来用着好好的,但是最近升级内核后,重启机器再次运行VirtualBox,发现不能正常使用了,启动虚拟机会提示如下内容: Kernel drive ...

  6. 【BT下载】ubuntu10.10 下bit下载工具 Transmission 或者 wine+uTorrent 【PlayOnLinux:Wine 辅助程序】

    一.transmission-2.04修改后能够下载六维啦 ubuntu10.10 自带的版本就是transmission 2.04,按理说应该好用.但是貌似六维空间由于采用纯IPV6服务器,而且官方 ...

  7. Ubuntu10.04下Linux内核编译的完整步骤

    [转] http://supportopensource.iteye.com/blog/680483 1.在http://www.kernel.org/上下载最新的内核源代码linux-2.6.33. ...

  8. ubuntu10.10下更新无线网卡驱动

    说来,今天很郁闷. 自己很讨厌ubuntu的自动升级,于是在Synaptic中禁止linux内核升级.但是天算不如人算,不知道哪天我的ubuntu内核居然升级了. 哎,原来的linux-2.6.35- ...

  9. Ubuntu10.10下我用的软件

    自己做个记录,以免以后再做系统的时候给忘了. Ubuntu下我用的软件 1.VirtualBox:老牌的免费的虚拟机软件,也许在功能上比不过VM,比VM多占点资源,但--我真的没发现,我在Linux下 ...

  10. CentOS6.5升级内核到3.10.28

    本文适用于CentOS 6.4, CentOS 6.5,估计也适用于其他Linux发行版. 1. 准备工作 确认内核及版本信息 [root@hostname ~]# uname -r2.6.32-22 ...

最新文章

  1. 每秒处理240万帧游戏画面,AI训练成本降低80%,谷歌开源RL并行计算框架
  2. http://www.himigame.com/mac-cocoa-application/893.html
  3. python rbf神经网络_原创,基于径向基函数(RBF)神经网络RBF网络的举例应用!
  4. 六自由度机器人逆向运动学_【课程笔记】Notes for Robotics/机器人学 (Part1)
  5. 逻辑回归 - sklearn (LR、LRCV、MLP、RLR)- Python代码实现
  6. 代码管理工具TortoiseGit配置(GIT的客户端)
  7. 吴恩达机器学习总结一:初识机器学习
  8. 【java笔记】模拟B/S服务器
  9. Linux添加用户并赋管理员权限
  10. 【第四次JAVA课,java语法基础】课件总结
  11. .Net软件设计新思维
  12. Genius ACM(倍增+归并排序)
  13. JQuery中$.ajax()方法参数详解 转载
  14. android反编译工具手机,安卓apk反编译工具包
  15. java bitset clean方法_BitSet实现原理及源码解析
  16. word根据标题自动生成目录
  17. 双系统windows+linux如何正确删除linux
  18. 共享充电宝的优点有哪些
  19. centos7模板机的搭建
  20. 计算机三级上机题库百度云,全国计算机三级数据库等级考试全套(笔试背诵资料+笔试试题+详细答案+最新数据库技术上机试题题库).doc...

热门文章

  1. WinForm 单例模式实例
  2. HDFS如何检测并删除多余副本块
  3. 19.12添加自定义监控项目19.13/19.14 配置邮件告警19.15 测试告警19.16 不发邮件的问题处理...
  4. Perl 语言流行度处于历史最低点
  5. zabbix2.4.6升级zabbix3.0.8后无法发送报警邮件
  6. 关于编程开发的最小系统学习法
  7. 应用HTK搭建语音拨号系统2:创建单音素HMM模型
  8. 关注SharePoint 2010 ,更要关注InfoPath 2010!
  9. src2pkg:slackware下超强打包程式 [转]
  10. kafka中zookeeper的作用