diff --git a/study/debug/tools/systemtap/01-install/README.md b/study/debug/tools/systemtap/01-install/README.md
index 7674611..5429efb 100644
--- a/study/debug/tools/systemtap/01-install/README.md
+++ b/study/debug/tools/systemtap/01-install/README.md
@@ -14,28 +14,29 @@ Linux内核调试的方式以及工具集锦
摘要 : `SYSTEMTAP` 是内核开发者必备的工具, 通过自动化的 `kprobe`, 而这个软件依赖于**内核符号表/调试信息/内核头文件**等等, 如果我们想测试最新的内核特性, 就需要安装带有 `debuginfo` 的内核和相关头文件. 而我们源仓库中自带的`systemtap` 很多时候, 因为版本和内核符号表的变动, 在新的内核中无法运行, 因此很多情况下我们需要自己编译 `systemtap`.
+
+
+#1 使用和编译Systemtap的依赖包
+-------
+
+
本文主要讲解了 `ubuntu` 上如果在自己编译的内核下编译安装使用 `systemtap`.
+我们从`systemtap`的工作原来来分析, 其可能需要的依赖和配置
-`systemtap` 依赖于 `elfutils`, 因此我们需要下载其源码包, 最好选择最新版下载.
+`Systemtap` 工作原理是, 参见[1.5 The stap command](https://sourceware.org/systemtap/langref/SystemTap_overview.html)
-* 最近的 `elfultils` 的下载地址: https://fedorahosted.org/releases/e/l/elfutils/
+1. 通过`stap`工具将脚本语句翻译成`C`语句, 编译成内核模块
-* 最新systemtap 的下载地址:http://sourceware.org/systemtap/ftp/releases/
+2. 模块加载之后, 将所有探测的事件以钩子的方式挂到内核上, 当任何处理器上的某个事件发生时, 相应钩子上句柄就会被执行
+
+3. 最后,当systemtap会话结束之后,钩子从内核上取下,移除模块。整个过程用一个命令 stap 就可以完成。
+
+可见, 除了必须安装 `systemtap` 包之外, 我们必须有内核头文件和开发包用于构建驱动, 还需要 `systemtap` 可识别的带 `kprobe`的内核, 同时`systemtap` 依赖于 `elfutils`, 因此我们需要下载其源码包, 最好选择最新版下载.
->参考
->
->[发行版本内核上system的安装与使用](http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu)
->
->[unbuntu下自定义内核上systemtap的安装](http://blog.chinaunix.net/uid-7427553-id-2627651.html)
->
->[如何在ubuntu上基于自定义内核安装systemtap](http://blog.csdn.net/trochiluses/article/details/9698449)
->
->[Optional: Installing on a custom kernel](https://www.ibm.com/support/knowledgecenter/linuxonibm/liaai.systemTap/liaaisystapcustom.htm)
-
-如果您需要使用`systemtap`, 则系统中必须包含以下包或者内核配置
+综上如果您需要使用`systemtap`, 则系统中必须包含以下包或者内核配置
* 内核支持并配置了kprobe(2.6.11和以上)调试内核需要,在进行内核编译之前的配置
@@ -50,7 +51,77 @@ Linux内核调试的方式以及工具集锦
* 有 `libdwfl` 的 `elfutils`(只有支持 `libwdfl` 的 `elfutils`, `systemtap`才能正常工作
-#1 构建和安装内核debuginfo
+
+如果您前期的运行支持, 比如内核头文件, `kernel-debuginfo` 包, 只想知道如果自行编译 `systemtap`, 那么请您自行忽略第2节和第3节
+
+#2 安装内核开发包(头文件)
+-------
+
+
+
+##2.1 Ubuntu安装内核开发环境
+-------
+
+
+```cpp
+# 查看内核版本
+uname -r
+
+# 查询有无内核头文件包
+# 如果您是自己编译的内核, 官方自然就没有对应内核头文件了
+dpkg-query -s linux-headers-$(uname -r)
+
+# 安装匹配的内核头文件。
+sudo apt-get install linux-headers-$(uname -r)
+```
+
+##2.2 CentOS安装内核开发环境
+-------
+
+
+```cpp
+# 查看当前内核版本
+`uname -r`
+
+
+# 查看当前yum仓库中的kernel-headers的版本是否和内核版本一致
+yum list | grep kernel-headers
+
+# 如果一致,直接
+yum install kernel-headers
+```
+
+对应的 `rpm`包下载站点, 也可以自行下载安装
+
+http://pkgs.org/centos-7/centos-x86_64
+
+
+
+##2.3 自定义内核安装内核头文件
+-------
+
+
+
+如果您是自己的内核, 那么您需要自己安装相应的内核和头文件并设置相关的连接, 您可以使用发行版配置的内核开发环境进行编译, 也可以自己手动编译
+
+参见
+
+* [ 构建源码树----Linux内核剖析(三)](http://blog.csdn.net/gatieme/article/details/44961475)
+
+* [SystemtapOnUbuntu](http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu)
+
+
+* 使用Ubuntu的集成环境构建, [BuildYourOwnKernel](https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel), [GitKernelBuild](https://wiki.ubuntu.com/KernelTeam/GitKernelBuild), [Kernel/Compile](https://help.ubuntu.com/community/Kernel/Compile)
+
+* 使用CentOS的集成环境构建, [I Need to Build a Custom Kernel](https://wiki.centos.org/HowTos/Custom_Kernel)
+
+
+* 自行构建Linux, [KernelBuild](https://kernelnewbies.org/KernelBuild)
+
+
+
+
+#3 构建和安装内核debuginfo
-------
`SystemTap` 需要通过内核调试信息来定位内核函数和变量的位置. 这些信息由`kernel-debuginfo`包来提供
@@ -70,11 +141,11 @@ Linux内核调试的方式以及工具集锦
* 下载内核源码包, 构建出 `debuginfo`
-##1.1 CentOS安装 `kernel-debuginfo`
+##3.1 CentOS安装 `kernel-debuginfo`
-------
-###1.1.1 方法一 下载 `CentOS` 的 `debuginfo` 包
+###3.1.1 方法一 下载 `CentOS` 的 `debuginfo` 包(推荐)
-------
一般的方式从软件仓库中是下载`debuginfo` 软件包, 然后直接安装
@@ -102,11 +173,12 @@ kernel-debuginfo-xxxx
如果你找不到对应的内核版本的 `rpm`, 你可以去 `google1`去寻找, 可以使用 `RedHat` 的 `debuginfo rpm` 包, 或者去其他站点[下载](http://rpm.pbone.net)
-###1.1.2 方法二 添加debuginfo源
+###3.1.2 方法二 添加 `debuginfo` 源
-------
-如果提示没有源, 可以为`debuginfo`包增加repository, 然后直接用源安装
+如果提示没有源, 可以为 `debuginfo` 包增加 `repository`, 然后直接用源安装
+
如果`Centos yum repository`上没有`kernel-debuginfo`包, 方法一把这个包及依赖包 `rpm`文件下载到本地安装. 我们也可以手工添加有这个包的`repository`, 然后直接用`yum`安装
在 `/etc/yum.repos.d`新建一个文件,我把他命令为debuginfo
@@ -119,21 +191,23 @@ baseurl=http://debuginfo.centos.org/5/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
-
+```
其他版本的CentOS请自行修改, 版本号和源地址```
-##1.1.3 方法三 使用 `debuginfo-install` 工具
+###3.1.3 方法三 使用 `debuginfo-install` 工具
-------
当然也可以使用 `debuginfo-install`工具来安装 kernel
+
+
```cpp
debuinfo-install kernel-debuginfo-`uname -r`
+```
-
-##1.2 Ubuntu安装 `kernel-debuginfo`
+##3.2 Ubuntu安装 `kernel-debuginfo`
-------
`Ubuntu` 桌面版默认没有安装 `kernel-debug-info`, 因此需要手动安装 `kernel-debug-info` 包.
@@ -143,7 +217,7 @@ debuinfo-install kernel-debuginfo-`uname -r`
查看当前内核版本`uname -r`,
-###1.2.1 直接从源中安装
+###3.2.1 直接从源中安装
-------
@@ -155,6 +229,7 @@ sudo apt-get install linux-image-`uname -r`-dbgsym
如果提示`Unable to locate packag`, 说明软件包不在源中, 可以手动添加源, 或者直接下载deb包安装
+
添加源的方法如下
```cpp
@@ -182,21 +257,16 @@ sudo apt-get install linux-image-`uname -r`-dbgsym
-###1.2.3 下载 `debuginfo` 包, 安装
+###3.2.2 下载 `debuginfo` 包, 安装(推荐)
-------
-```
-
-http://www.domaigne.com/blog/random/getting-debug-kernel-on-ubuntu/
-`
-
下载对应内核版本的 `debug-info package`
http://ddebs.ubuntu.com/pool/main/l/linux/
-这里下载linux-image-4.4.0-72-generic-dbgsym_4.4.0-72.93_amd64.ddeb
+这里下载 `linux-image-4.4.0-72-generic-dbgsym_4.4.0-72.93_amd64.ddeb`
```cpp
wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-4.4.0-72-generic-dbgsym_4.4.0-72.93_amd64.ddeb
@@ -205,16 +275,47 @@ sudo dpkg -i linux-image-4.4.0-72-generic-dbgsym_4.4.0-72.93_amd64.ddeb
```
-
-
-##1.3 自定义内核安装`kernel-debuginfo`
+###3.2.3 使用 `get-dbgsym` 下载 `debuginfo`
-------
+
+
+参照[Getting Debug Kernel On Ubuntu](http://www.domaigne.com/blog/random/getting-debug-kernel-on-ubuntu/)
+
+
+`get-dbgsym` 是国外大神写的 `Ubuntu` 下的 `debuginfo`包获取工具
+
+下载并安装 `get-dbgsym` 工具
+
+
+```cpp
+# 下载get-dbgsym
+wget http://www.domaigne.com/download/tools/get-dbgsym
+
+# 添加可执行权限
+chmod +x get-dbgsym
+
+# 拷贝到系统目录
+cp get-dbgsym /usr/bin
+```
+
+使用 `get-dbgsym`, 直接运行即可
+
+
+##3.3 自定义内核安装`kernel-debuginfo`
+-------
+
+
+如果你需要自己编译内核, 那么意味着 `apt-get install` 的 `systemtap` 是不能直接使用的, 内核的准备过程如下 :
+
+首先,编译生成带有内核符号表和调试信息的内核镜像和相关内核头文件.
+
+
对应自己编译的内核, 我们需要开启下列选项 :
```cpp
-CONFIG_DEBUG_INFO
-CONFIG_KPROBES
-CONFIG_RELAY
+CONFIG_DEBUG_INFO(必须)
+CONFIG_KPROBES(必须)
+CONFIG_RELAY(必须)
CONFIG_DEBUG_FS
CONFIG_MODULES
CONFIG_MODULE_UNLOAD
@@ -222,77 +323,130 @@ CONFIG_UTRACE
```
+参见
+
+```cpp
+Kernel hacking --->
+ [*] Kernel debugging
+ [*] Compile the kernel with debug info
+
+Instrumentation Support --->
+ [*] Kprobes (EXPERIMENTAL)
+
+General setup --->
+ [*] Kernel->user space relay support (formerly relayfs)
+```
+
+经过以上安装配置后, 就可以跟踪监控内核信息了, 编译出的内核和模块驱动信息就是我们带 `debuginfo` 的内核驱动包了
-经过以上安装配置后,就可以跟踪监控内核信息了
-2.内核方面的准备:(我们假设要编译的内核源码位置是/usr/src/linux)
-
- 如果你是发行版的内核,没有自己进行编译,请参考这里: http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu
- 如果你需要自己编译内核,那么意味着apt-get install的systemtap是不能直接使用的,内核的准备过程如下:
-1)首先,编译生成带有内核符号表和调试信息的内核镜像和相关内核头文件。
-
-这个过程中,我们不使用传统的config,make,makeinstall命令(传统命令是make modules_install install headers_install),建议使用kernel-package工具,可以把内核和内核头文件都打包安装,这样比较方便。具体可以参考这里:http://blog.chinaunix.net/uid-7427553-id-2627651.html
-(1)进入源代码目录:$: cd /usr/src/linux
-(2)进行相关配置
-(3)安装内核源码编译的集成命令: $:sudo apt-get install kernel-package
-(4)编译内核源码 $:make-kpkg --initrd --revision 3.11 --append-to-version -zswap kernel_image kernel_headers
-
-2)安装相应的内核和头文件并设置相关的连接
-
-具体可以参考这篇博文:http://blog.chinaunix.net/uid-7427553-id-2627651.html
-上一步生成的内核安装包和头文件的安装包,在运行make-kpkg命令的父目录之中,进入
-(1)进入父目录:$cd ..
-(2)安装都内核镜像包和头文件包:
- $:dpkg -i [thekernel.deb]
- $:dpkg -i [thekernelheaders.deb]
-(3)将编译内核时的build树链接到 /lib/modules/`uname -r`/build(
- 内核编译的时候,这一步一般自动完成了,可以使用
-
-
-
-#2 systemtap与elfutils的安装
+#4 systemtap与elfutils的安装
-------
+如果您的系统的 `elfutils` 较旧, 您必须下载 `elfutils` 源码包来编译, `systemtap`能够和 `elfutils` 一块编译, 使用命令
- 如果您的系统的 `elfutils` 较旧, 您必须下载 `elfutils` 源码包来编译, `systemtap`能够和 `elfutils` 一块编译, 使用命令
+* 最近的 `elfultils` 的下载地址: https://fedorahosted.org/releases/e/l/elfutils/
+
+* 最新systemtap 的下载地址: http://sourceware.org/systemtap/ftp/releases/
+
+构建在systemtap目录执行如下命令即可
```cpp
./configure --with-elfutils=/path/to/elfutils/dir --prefix=yourpatch)
```
- 2)elfutils RPM:SystemTap需要elfutils软件包提供的库函数来分析调试信息。目前的SystemTap要求安装elfutils-0.123以上版本。目前最新的版本是0.156,我们尽量选择最新的elfutils,这里是官方下载地址:https://fedorahosted.org/releases/e/l/elfutils/
+##4.1 下载elfultils
+-------
- 运行Systemtap的前提条件是:
+目前 `elfultils` 的最新版是 `0.168`
+
+```cpp
+# 下载
+wget https://sourceware.org/elfutils/ftp/0.168/elfutils-0.168.tar.bz2
+# 解压缩
+tar -xvf elfutils-0.168.tar.bz2
+```
+
+##4.2 下载systemtap
+-------
-1)卸载系统已经安装的systemtap(发行版对应的):
- 首先,如果你的系统已经使用apt-get安装了systemtap,尽量在这一步先卸载已经安装的systemtap。如果不进行卸载,在mmtests等软件运行的时候调用的命令stap来自于原来已经安装的systemtap,是无法在新内核上运行的。
-2)安装systemtap和elfutils:
- 下载最新的systemtap和elfutils源码:注意,此处一定要下载最新的源码自己安装,否则可能会造成编译以后的软件无法运行
- 最近的elfultils的下载地址:https://fedorahosted.org/releases/e/l/elfutils/
- 最新systemtap 的下载地址:http://sourceware.org/systemtap/ftp/releases/
- 一块编译:
-将2个包解压到2个不同的目录,然后进入systemtap包目录,执行
- ./configure --with-elfutils=/path/to/elfutils/dir --prefix=yourpatch
- make
- make install
-总结:这一步的关键是软件版本一定要是最新的(如果测试最新内核),环境变量要进行设置。
-
-注意:如果我们设置了安装路径,一定要把对应systemtap安装路径下面的bin添加到环境变量PATH之中,否则,mmtests调用stap的时候会发现找不到这个程序。
-
- 安装完成以后,我们使用下面的shell命令进行测试,如果输出hello world,说明systemtap安装成功。
- $:stap -ve 'probe begin { log("hello world") exit() }'
-
-本文来源:谁不小心的CSDN博客 如何在ubuntu上基于自定义内核安装systemtap
+目前 `systemtap` 的最新版为 `3.1`
+```cpp
+# 下载
+wget https://sourceware.org/systemtap/ftp/releases/systemtap-3.1.tar.gz
+# 解压缩
+tar -zxvf systemtap-3.1.tar.gz
+```
+##4.3 编译和安装systemtap
+-------
+
+
+下载好两个源码包后, 就可以开始构建了
+
+
+
+```cpp
+# 配置
+./configure --with-elfutils=/home/gatieme/Work/GitHub/Tools/SystemTap/elfutils-0.168 --prefix=/opt/systemtap3
+
+# 编译
+make -j6
+
+#安装
+make install
+```
+
+其中 `--with-elfutils` 指定了 `elfutils` 源码包的路径, ` --prefix` 指定了安装路径, 最后我们的软件安装到了 `/opt/systemtap3` 下
+
+
+
+
+
+>注意 :
+>
+>如果我们设置了安装路径, 一定要把对应 `systemtap` 安装路径下面的 `bin` 添加到环境变量 `PATH` 之中, 否则, `stap` 的时候会发现找不到这个程序.
+
+
+##4.4 验证安装
+-------
+
+
+安装完成以后,我们使用下面的shell命令进行测试,如果输出hello world,说明systemtap安装成功。
+
+```cpp
+stap -ve 'probe begin { log("hello world") exit() }'
+```
+
+
+
+
+
+#5 参考
+-------
+
+
+>参考
+>
+>[发行版本内核上system的安装与使用](http://sourceware.org/systemtap/wiki/SystemtapOnUbuntu)
+>
+>[unbuntu下自定义内核上systemtap的安装](http://blog.chinaunix.net/uid-7427553-id-2627651.html)
+>
+>[如何在ubuntu上基于自定义内核安装systemtap](http://blog.csdn.net/trochiluses/article/details/9698449)
+>
+>[Optional: Installing on a custom kernel](https://www.ibm.com/support/knowledgecenter/linuxonibm/liaai.systemTap/liaaisystapcustom.htm)
+
+
+
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作
因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦
-
+
diff --git a/study/debug/tools/systemtap/01-install/hello_world.png b/study/debug/tools/systemtap/01-install/hello_world.png
new file mode 100644
index 0000000..a9b8c7b
Binary files /dev/null and b/study/debug/tools/systemtap/01-install/hello_world.png differ
diff --git a/study/debug/tools/systemtap/01-install/install.png b/study/debug/tools/systemtap/01-install/install.png
new file mode 100644
index 0000000..56a3674
Binary files /dev/null and b/study/debug/tools/systemtap/01-install/install.png differ
diff --git a/study/debug/tools/systemtap/01-install/prefix.png b/study/debug/tools/systemtap/01-install/prefix.png
new file mode 100644
index 0000000..8221d9b
Binary files /dev/null and b/study/debug/tools/systemtap/01-install/prefix.png differ