1. 程式人生 > >systemtap在android、pandaboard上的移植

systemtap在android、pandaboard上的移植

         systemtap是一個非常好用的linux除錯工具,systemtap從版本1.0開始變支援arm處理器,但是隻支援OMAP的,pandaboardES上的處理器是OMAP 4460,由於“工作”需要將systemtap移植到執行android的pandaboard ES上(執行ubuntu的pandaboard直接apt安裝就行)。官方資料http://omappedia.org/wiki/Systemtap個人感覺寫得不太好,下面簡述一下自己的移植過程。

搭建主機編譯環境

         編譯成功的主機環境是ubuntu10.04 32bit,在ubuntu 64位上編譯報了幾個不好解決的錯誤,索性就在虛擬機器中安裝32位的ubuntu來作為host主機。

下載systemtap原始碼

不同的android核心對應著不同的systemtap版本(systemtap在OMAP上沒有做到向下相容),我的pandaboard上執行的kernel是omap-pand-3.0(linux kernel3.0),對應的systemtap版本是1.5,從http://sourceware.org/systemtap/ftp/releases/下載對應的版本。

編譯systemtap安裝在ubuntu

         systemtap要在OMAP上執行,需要在ubuntu主機上生成執行在OMAP上的模組,因此ubuntu主機上也應該有systemtap,在ubuntu上安裝systemtap可以採用apt-get的方式(若只是編譯執行在OMAP上的模組,則不需要ubuntu的debuginfo資訊),也可以採用自己編譯的方式

apt-get build_dep systemtap
make clean
./configure --exec-prefix=/mnt/work/pandaboard/systemtap-1.5-ubuntu--prefix=/mnt/work/pandaboard/systemtap-1.5-ubuntu
make install


編譯systemtap安裝在pandaboard

       在systemtap1.5的原始碼中執行如下命令,交叉編譯systemtap(需要安裝交叉編譯器,apt-get install gcc-arm-linux-gnueabi)。

ac_cv_file__usr_include_avahi_common=noac_cv_file__usr_include_avahi_client=no ac_cv_file__usr_include_nspr=noac_cv_file__usr_include_nspr4=no ac_cv_file__usr_include_nss=noac_cv_file__usr_include_nss3=no ac_cv_func_malloc_0_nonnull=yes  ./configure --exec-prefix=/mnt/work/pandaboard/systemtap-1.5-macharm--prefix=/mnt/work/pandaboard/systemtap-1.5-macharm--host=arm-none-linux-gnueabi CXXFLAGS=-static CFLAGS=-static--disable-translator --disable-docs --disable-refdocs --disable-grapher--without-rpm

編譯omap-pand-3.0

         修改omap-pand-3.0的Makefile:

ARCH= arm,CROSS_COMPILE=/mnt/work/pandaboard/arm-eabi-4.4.3/bin/arm-eabi-

編譯核心的交叉編譯器並不是編譯systemtap的交叉編譯器,而是跟編譯android原始碼的編譯器一樣(使用systemtap的交叉編譯器也可以編譯通過,但是執行到pandaboard上會出現滑鼠、網絡卡等不能使用的情況,原因還不知道),這個可以直接從自己下載的android原始碼中拷貝到ubuntu主機中。

         修改完Makefile,執行以下命令,生成.config檔案

         makepanda_defconfig

         systemtap的執行需要核心開啟相關除錯資訊(debug info)選項,我們的systemtap要在pandaboard上執行,因此omap-pand-3.0的kenrel需要開啟如下選項:

CONFIG_KPROBES: General Setup -> Kprobes

CONFIG_RELAY: General Setup -> user spacerelay support

CONFIG_PROFILING: General Setup -> Profilingsupport (EXPERIMENTAL) + General Setup -> Oprofile system profiling(EXPERIMENTAL)

         修改kernel/arch/arm/include/asm/ptrace.h檔案如下:

#defineinterrupts_enabled(regs) \

    (!((regs)->ARM_cpsr & PSR_I_BIT))

#definefast_interrupts_enabled(regs) \

    (!((regs)->ARM_cpsr & PSR_F_BIT))

++  #define condition_codes(regs) \

++          ((regs)->ARM_cpsr &(PSR_V_BIT|PSR_C_BIT|PSR_Z_BIT|PSR_N_BIT))

/* Are thecurrent registers suitable for user mode?

 * (used to maintain security in signalhandlers)

 */

         接下來便可以執行make –j2來編譯omap-pand-3.0的核心了。

編譯android

         將編譯生成的arch/arm/boot/zImage檔案,替換掉android原始碼中的device/ti/panda/kernel檔案,然後重新編譯android原始碼,結束後將相關檔案燒寫到pandaboard上,詳情參見:http://blog.csdn.net/lzuzhp06/article/details/7716452

交叉編譯systemtap指令碼

         Systemtap指令碼的名字叫syscall_all.stp,在ubuntu主機上交叉編譯的命令如下:

stap -gv -a arm -BCROSS_COMPILE=arm-none-linux-gnueabi- -r /mnt/work/pandaboard/omap -msyscall_all.ko syscall_all.stp

/mnt/work/pandaboard/omap是omap-pand-3.0原始碼所在的檔案。

向pandaboard拷貝交叉編譯檔案

         由於採用的是virtualbox虛擬機器,因此我先用scp命令將交叉編譯systemtap生成的檔案systemtap-1.5-macharm、交叉編譯生成的模組syscall_all.ko拷貝到64位的物理主機上,然後使用adb的push命令將systemtap-1.5-macharm檔案push到開發板的/data目錄下,將syscall_all.ko檔案push到/data/local目錄下。

adb push kprobes/systemtap-1.5-macharm /data/

adb push ./kprobes/syscall_all.ko /data/local/

重新掛在pandaboard的根分割槽為可讀寫分割槽:

mount -o remount,rw rootfs /

然後建立檔案及軟連結:

mkdir –p /mnt/work/pandaboard/

ln –s /data/ systemtap-1.5-macharm  /mnt/work/pandaboard/ systemtap-1.5-macharm

使用staprun命令執行syscall_all.ko模組:

/data/ systemtap-1.5-macharm/bin/staprun/data/local/syscall_all.ko

pandaboard的串列埠輸出結果如下:

…

adbd(110) sys_write

InputReader(156) sys_clock_gettime

InputReader(156) sys_read

adbd(110) sys_read

InputReader(156) sys_writev

InputReader(156) sys_write

InputReader(156) sys_epoll_wait

adbd(110) sys_read

InputReader(156) sys_write

InputReader(156) sys_nanosleep

adbd(110) sys_select

adbd(110) sys_read

…


如此你知道syscall_all.stp的內容了嗎?

probe kernel.function("sys_*"){

       printf("%s(%d) %s\n",execname(),pid(),probefunc());

}

相關推薦

systemtap在androidpandaboard移植

         systemtap是一個非常好用的linux除錯工具,systemtap從版本1.0開始變支援arm處理器,但是隻支援OMAP的,pandaboardES上的處理器是OMAP 4460,由於“工作”需要將systemtap移植到執行android的pan

在Tiny4412移植3602代WIFI的AP模式

下文的ap模式,不需要hostaod就能產生熱點,目前只能讓其和手機連線,並且能夠ping通。(還沒支援上網@[email protected],後期可以在更新) 一、開發環境 宿主機 :redhat5.3 交叉編譯器 :arm-linux-gcc(4.5.1)

python基礎----socketserver多並發實現FTP傳多並發

span end 沒有 res hasattr ret net packet except 一、socketserver多並發 基於tcp的套接字,關

angularjs傳圖片

() 狀態 bower 錯誤 測試 adf 操作 pattern accep 上傳圖片需要引入插件ngFileUpload,使用bower安裝方法: bower install ng-file-upload --save,安裝後需要在命名app的名字js文件中註入,如下所

WAF——針對Web應用發起的攻擊,包括但不限於以下攻擊類型:SQL註入XSS跨站Webshell命令註入非法HTTP協議請求非授權文件訪問等

授權 文件訪問 http協議 火墻 針對 str sql 包括 fire 核心概念 WAF Web應用防火墻(Web Application Firewall),簡稱WAF。 Web攻擊 針對Web應用發起的攻擊,包括但不限於以下攻擊類型:SQL註入、XSS跨站、Websh

【轉】stm32CubeMx移植自己的printf()和scanf()函數

smi config 用戶 type 連接器 標準庫 can 修改 esp 要想printf()和scanf() 函數工作,我們需要把printf()和scanf() 重新定向到串口中。重定向是指用戶可以自己重寫C 的庫函數,當連接器檢查到用戶編寫了與C 庫函數相同名字的函

golang 2行代碼在基於arm linux的樹莓派orangepi運行http web服務

目標 開發板 server post fontsize alt main函數 handle 基於 go語言(golang)簡化了跨平臺交叉編譯步驟,支持在windows系統下交叉編譯基於arm+linux平臺的應用,運行時無需其它依賴庫。以下以一個簡單的http serve

嵌入式Linux移植unzip工具

16px 文件 bsp ont div 嵌入 for .gz .tar.gz   由於busybox編譯出來的unzip不支持有密碼的壓縮包解壓,因此基於unzip60源碼包,交叉編譯一個嵌入式Linux上的unzip工具。 1.下載地址是: http://sourcefo

html5django傳文件

http html django 上傳文件 前端代碼: <!DOCTYPE html><html><head><title>uploadFile</title> </head> <body> <

5ORTP庫移植

工作目錄 man RM inux 交叉 libtool hub ptp XP 1、ORTP的引入 為什麽要使用RTP:http://blog.51cto.com/ticktick/462746 RTP協議分析:http://www.xuebuyuan.com/739929.

Java面試題:switch能否作用在bytelongString

1.7 季節 spa name fault des lte false 枚舉類 switch可作用於char byte short int switch可作用於char byte short int對應的包裝類 switch不可作用於long double fl

動態添加刪除傳域(可限制添加條數)

device child clas scale this DDM doc tex puts 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <met

Java框架-SpringMVC的應用(json資料互動控制器方法返回值檔案傳)

1. 搭建SpringMVC開發環境 1.1 建立專案,新增依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" x

◮ R語言筆記(七): 利用Apply()函式在二維資料行進行統計

這裡的二維資料可以是矩陣的形式也可以是資料框的形式, 通過apply()函式的正確使用,可以在二位資料的行、列上進行自己想要的操作: 例如: 每一列/每一行的資料之和sum、中位數median、均值mean和方差var等;   *******************

Java 自定義註解&通過反射獲取類方法屬性的註解

反射 JAVA中的反射是執行中的程式檢查自己和軟體執行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。   註解的定義 註解通過 @interface 關鍵字進行定義。 /** * 自定義註解 *

阿里騰訊百度華為京東搜狗滴滴 10家試題彙總(史最全)

瘋狂創客圈整理了數百道面試題, 不光是為了面試,如果能全部解答, JAVA的技術水平也是傲視群雄了。 後續還會不斷更新。有些題目挺難的,歡迎大家來交流答案。 [第一部分] JAVA基礎 [第一篇] 面向物件 [第1題] 面向物件是什麼? [第2題] 類載入的過程 [第3題] 類載入器有哪些 [第4題] 雙

Springmvc傳圖片

springmvc.xml <!-- 上傳圖片配置實現類 注意:id不能變 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartReso

SprinMVC轉發重定向收集date資料自定義轉換器檔案json資料轉換

1.專案模組圖 2.完成SpringMVC的基本搭建 pom.xml(下載jar包的檔案) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.

Linux rzsz 下載檔案

sz、rz 這兩個命令 傳輸 自己 簡單的檔案 可以用用,正式場合 不建議使用,後果自負  1、簡介 1.1 系統環境     本文測試環境為 Ubuntu 16.04 amd64 # lsb_release -a   1.2 軟體安裝

Linux rzsz 下載文件

apt 兩個 測試環境 從服務器 strong 服務器 tro linux rz 6.0 sz、rz 這兩個命令 傳輸 自己 簡單的文件 可以用用,正式場合 不建議使用,後果自負  1、簡介 1.1 系統環境     本文測