《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 監視嵌入式系統內進程間通信的技術原理
監視嵌入式系統內進程間通信的技術原理
摘要: 本文詳細描述了一種利用ptrace系統調用,實現嵌入式系統內部進程通信的監視方法,并提供了相應的實現方案。概述復雜的嵌入式系統中,常常同時運行著相當多的進程。
Abstract:
Key words :

本文詳細描述了一種利用 ptrace 系統調用,實現嵌入式系統內部進程通信的監視方法,并提供了相應的實現方案。
    概述

    復雜的嵌入式系統中,常常同時運行著相當多的進程。這些進程之間頻繁的進行著大量的通信動作。進程的運行狀態與這些不斷發生的通信有著直接和緊密的聯系。通過對進程間通信的監視,開發人員可以掌控系統內部運轉的狀態。發現錯誤時,利用獲取到的進程間通信的信息,調試工程師更容易發現問題之所在。

    但是,嵌入式系統與開發人員的接口往往較為單一。開發人員廣泛使用通常是基于串口或是網絡接口的終端( console )方式。在這個模式下,開發人員難以細致準確的觀察進程間的通信。而且對于計算能力薄弱的嵌入式系統來說,在終端上打印出通信報文既會影響系統內部的運行,同時,也會使屏幕上充斥的過多的無用信息,使開發人員的分析工作無從下手。

    為了解決這個問題,在嵌入式 Linux 的平臺上,我們開發了一整套用于監視嵌入式系統內進程間通信的軟件,用于調試我們開發的嵌入式產品。本文詳細介紹了監視嵌入式系統內進程間通信的技術原理和實現監視軟件的推薦方案。

    監視方法的基本原理

    Linux 中的 ptrace 系統調用是監視進程間通信的關鍵。 ptrace 為我們提供了一種觀察和控制其它進程的方法。利用 ptrace ,我們可以截獲正在運行的進程的所有的系統調用。所謂截獲是指,監視程序可以在這些系統調用發生和退出時,獲得系統調用的參數,甚至修改參數。這些系統調用包括: read , write , sendto, recv 等等。在 Linux 中,用戶可以通過“ man syscalls ”來查看當前版本的 Linux 所支持的系統調用。

    在我們的 Linux 嵌入式產品中, AF_UNIX 域的 socket 被廣泛使用。它被用來完成進程間通信的工作。 AF_UNIX 域的 socket 的編程模型與通常的 socket 編程模型完全相同。我們的使用方法是:接收進程創建一個 AF_UNIX 域的 socket ,設定其模式為數據報( SOCK_DGRAM )。在這之后,為其綁定一個含路徑的文件名,例如: /var/tmp/receive.unix 。這個文件名被內核用于標識socket。發送進程創建一個相同模式的 AF_UNIX 域的 socket 。然后,調用 sendto 向接收進程發送消息。用來標識接收進程 socket 的就是前面提到的文件名,也就是 /var/tmp/receive.unix 。而接收進程使用 recvfrom 系統調用,就可以收到發送進程發出的消息。

    因此,通過 ptrace ,一旦我們接管了被監視進程的 sendto 和 recvfrom 系統調用,將使我們能夠截獲到使用這兩個系統調用進行通信的數據。

    ptrace 系統調用的定義如下:

   

   #include
       long int ptrace(enum __ptrace_request request, pid_t pid,
                       void * addr, void * data);
 

    它共有四個參數。 request 的值決定 ptrace 執行什么樣的任務。 pid 指明被追蹤的進程的 id 。 request 參數決定了是否需要一個有效的 addr 參數,還是僅用 NULL 即可。如果有必要使用有效的 addr 參數,它的含義是被追蹤的進程的進程空間的偏移量。 data 類似于 addr 參數,有時也可以使用 NULL 來代替。如果它被使用,它的含義是指向一些數據,這些數據希望被放置到被監視的進程的用戶空間中。

    一個完整的示例代碼將向我們展示監視進程間通信的技術細節和關鍵點。代碼按前后順序分段說明。

  

 #include
               #include
               #include
               #include
               #include
               #include
               #include
               #include
 

    為了在程序中使用 ptrace 系統調用,我們需要增加 ptrace.h 頭文件。為了能夠獲得截獲的系統調用的函數入參,我們需要使用 struct user_regs_struct 結構。它在 user.h 中被定義。由于在程序中使用了信號,因此,我們也需要 wait.h 。我們要監視通信動作, socket.h 和 un.h 則是必不可少的。

    下面是程序的入口主函數:

   

   int main (int argc, char *argv[])
        {
            int status;
            int syscall_entry = 0;
            int traced_process;
            struct user_regs_struct u_in;
 

    status 用于記錄被監視進程的狀態變化; syscall_entry 記錄被監視進程當前是進入系統調用,還是從系統調用中返回; u_in 用來獲得截獲的系統調用的參數; traced_process 則是被監視進程的 PID 值。

   

    traced_process = atoi(argv[1]); /* 從命令行得到監視進程的PID */
             ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
             wait(&status);    /* 等待被監視進程狀態變化 */
             ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL);
 

    參數為 PTRACE_ATTACH 的 ptrace 對被監視進程在內核中的進程結構進行修改。使被監視進程成為當前程序的子進程。一旦被監視進程的狀態發生變化, wait() 將返回。程序再次調用 ptrace 。這次的參數為 PTRACE_SYSCALL 。被監視進程的進程結構再次被修改,其 trace 標志被激活。內核將在被監視進程的每一次系統調用時,觸發當前程序的運行。

   

  While (1) {
                 /* 等待被監視程序調用系統調用或是發生其它狀態變化 */
                 wait(&status);
                
                 /* 如果被監視進程退出,函數返回真。程序退出 */
                 if ( WIFEXITED(status) )
                     break;
                
                 ptrace(PTRACE_GETREGS, traced_process, 0, &u_in);
                 if (u_in.orig_eax == 102 && u_in.ebx == SYS_SENDTO) {
                     if (syscall_entry == 0) {  /* syscall entry */
                         insyscall = 1;
                         printf("call sendto()n");
                     }
                     else {  /* Syscall exit */
                         Syscall_entry = 0;
                     }
                 }
                 ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL);
              } /* while */

                           return 0;
                      }  /* main */
 

    被監視進程的 trace 標志被激活后,它的每一次系統調用都會被內核檢查。我們程序也隨之被內核用信號通知。使用參數 PTRACE_GETREGS 的 ptrace() 將獲得截獲的系統調用的參數。最重要的參數是系統調用號。它保存在了 u_in.orig_eax 中。通過系統調用號,我們可以確定發生的是那一個系統調用。系統調用號可以在 Linux 的源代碼中查找。它的定義在 Linux-source-2.6.xx/arch/x86/kernel/syscall_table_32.S 中。它的部分代碼如下所示:

  

 .long sys_fstatfs       /* 100 */
            .long sys_ioperm
            .long sys_socketcall
            .long sys_syslog
 

    在這里,我們最關心的是 sendto 系統調用。在 Linux 的內核中, sendto 的真實入口是 socketcall 系統調用。它是 bind , sendto 等socket相關系統調用的入口。在這個系統調用中,通過一個 call number 來區分出 bind , sendto 等不同的子系統調用。在我們的程序中,這個 call number 保存在 u_in.ebx 中。 從上面的 syscall_table_32.S 示例代碼就可以看出, socketcall 的系統調用號是102(從100向下數兩行)。而 call number 則在 net.h 有定義,我們關心的 sendto 的 call number 被定義為 SYS_SENDTO ,其絕對值為11。有了這兩個重要的數據,我們的程序據此判斷當前發生的系統調用是否為 sendto 。這一點表現為代碼:

   

     if (u_in.orig_eax == 102 && u_in.ebx == SYS_SENDTO)
 

    被監視進程進入系統調用和退出系統調用時,都會觸發 wait() 返回,使我們的程序有機會運行。因此,我們需要使用 syscall_entry 來記錄當前時刻是被監視進程進入系統調用,還是退出系統調用。這是一個開關量,非常容易理解。 最后,每次處理完,都需要再次調用參數為 PTRACE_SYSCALL 的 ptrace ,準備監視下一次的系統調用。

    上面的程序雖然很簡單,但已經可以完整的表現出利用 ptrace 截獲被監視進程的 sendto 系統調用的過程。值得補充一點的是,利用 ptrace 也可以獲得 sendto 向外發送的數據。

    sendto 系統調用的定義是:

 

   #include
        #include
        size_t sendto(int s, const void *msg, size_t len, int flags,
                      const struct sockaddr *to, socket len_t tolen);
 

    sendto 包含了六個參數,特別是 msg 參數指出了發送的數據內容。參數 to 指出了發送的目標。利用 PTRACE_PEEKDATA 參數的 ptrace ,監視程序將可以獲得 sendto 的全部的六個參數。這樣監視程序就完全獲得了被監視進程要向外發送的數據和發送目標。具體的實現細節在此不再展開論述。請參考 man ptrace 說明手冊。監視系統的體系和應用

    利用上面討論的技術,我們開發了可以運行在 mips 目標板上的監視程序,名為 ipcmsg 。它是一個命令行程序。在我們的應用環境中,它的使用方法是:

 

 root@host:~$ ipcmsg -p pid -l xxx.xxx.xxx.xxx -b 6000
 

    pid 是被監視進程的 pid ,可以通過 ps 命令獲得。 -l 參數后面指定 PC 主機的 IP 地址。 -b 參數指明了接收的端口號。

    最初進行監視時, ipcmsg 是沒有 IP 地址和端口號參數的。所有信息是輸出到串口控制臺中。這既影響了運行的效率(大量的在串口上的輸出會影響目標板的運行速度),也不利于信息的處理。由于我們的目標板具備以太網接口,我們很容易的想到將 ipcmsg 截獲的數據包轉發到 PC 主機上。使用 PC 主機更便于對進程間通信的數據包進行分析。在 PC 主機上,我們使用 wireshark 這個非常流行的開源的網絡報文分析軟件接收來自目標板的信息。整個監視系統的架構如下圖所示:

    在實際的使用過程中,我們使用以太網線將目標板與 PC 主機相連。然后,在目標板上啟動 ipcmsg ,并為其指定監視進程的 pid 。 ipcmsg運行后,我們在PC主機上啟動 wireshark 接收來自 ipcmsg 的數據包。這些數據包中包含了 mips 目標板上進程間通信的信息。利用我們為 ipcmsg 專門開發的 wireshark 插件,在 wireshark 上,我們可以詳細的分解 ipcmsg 轉發來的數據包,非常直觀的分析進程間通信的過程和可能存在的問題。下面是 wireshark 分解 ipcmsg 數據包的實際運行圖:   

 

    從圖中可以看到,我們從 ipcmsg 獲得了進程間通信的方式,參數( path 是 AF_UNIX域 socket 地址參數),方向和內容,以及進程名稱。這些信息幫助我們對嵌入式系統的運行狀態進行分析。而這一切非常直觀和便于操作。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          久久久久久香蕉网| 亚洲国产精品99久久久久久久久| 亚洲二区在线视频| 国产午夜一区二区三区| 欧美综合77777色婷婷| 韩国在线视频一区| 欧美日韩免费看| 经典三级久久| 欧美aⅴ一区二区三区视频| 亚洲成色www久久网站| 欧美婷婷在线| 国产欧美一区二区三区久久人妖| 国产精品一二三视频| 欧美日韩和欧美的一区二区| 中日韩美女免费视频网站在线观看| 国产精品xxxxx| 久久精品色图| 久久国产高清| 欧美一区二区精品久久911| 一本久道久久综合婷婷鲸鱼| 欧美日韩视频在线第一区| 老鸭窝毛片一区二区三区| 伊人蜜桃色噜噜激情综合| 欧美视频中文一区二区三区在线观看| 最新国产乱人伦偷精品免费网站| 久久久久久一区二区| 国产精品国产精品| 欧美国产日产韩国视频| 欧美偷拍一区二区| 亚洲精品视频在线| 久久久久久久精| 国产欧美一区二区精品性| 亚洲一线二线三线久久久| 欧美好骚综合网| 亚洲在线观看免费视频| 激情五月婷婷综合| 欧美福利一区二区三区| 亚洲欧美中文在线视频| 国产精品男人爽免费视频1| 欧美一区二区三区男人的天堂| 伊人婷婷欧美激情| 久久五月婷婷丁香社区| 国产一区再线| 久久久免费精品| 欧美日韩综合久久| 激情久久久久久久| 欧美亚洲免费电影| 欧美午夜视频在线| 永久免费毛片在线播放不卡| 亚洲看片一区| 欧美激情综合五月色丁香| 黑人巨大精品欧美黑白配亚洲| 国产精自产拍久久久久久| 亚洲精品九九| 亚洲欧美日韩另类精品一区二区三区| 欧美日韩国产欧| 亚洲小说欧美另类婷婷| 伊人色综合久久天天| 久久一区二区三区超碰国产精品| 一区二区三区.www| 亚洲第一网站免费视频| 伊人天天综合| 国产麻豆精品theporn| 久久久久久久波多野高潮日日| 亚洲级视频在线观看免费1级| 久久精品国产一区二区电影| 一级成人国产| 正在播放亚洲一区| 欧美日韩在线视频观看| 午夜精品久久久久久久白皮肤| 欧美日韩国产成人| 久久久福利视频| 亚洲少妇一区| 久久久久久久激情视频| 欧美日本三区| 欧美午夜一区二区| 国产一区二区久久精品| 国产欧美日韩亚洲一区二区三区| 欧美精品在线一区二区| 亚洲人久久久| 久久综合久久综合久久| 在线午夜精品自拍| 亚洲欧美怡红院| 亚洲国产成人午夜在线一区| 国语精品中文字幕| 国产一区香蕉久久| 国产精品国产三级国产aⅴ入口| 亚洲激情国产| 欧美成人在线网站| 在线观看欧美日韩国产| 亚洲精一区二区三区| 久久精品亚洲一区二区三区浴池| 久久久久久久综合日本| 亚洲人成人一区二区三区| 一本色道久久88综合日韩精品| 国产色综合网| 久久国产精品久久久| 久久精品99无色码中文字幕| 国产欧美一二三区| 久久久国产午夜精品| 日韩视频免费在线观看| 国产欧美精品在线观看| 国产精品女人久久久久久| 国产日产欧美一区| 国产精品扒开腿做爽爽爽视频| 国产欧美激情| 欧美日韩国产电影| 亚洲欧美资源在线| 亚洲欧美日韩天堂一区二区| 国产片一区二区| 欧美成人精品一区二区| 亚洲男人的天堂在线aⅴ视频| 欧美性生交xxxxx久久久| 欧美日韩三区四区| 欧美色精品天天在线观看视频| 一本在线高清不卡dvd| 久久在线免费观看| 欧美新色视频| 欧美在线免费一级片| 亚洲欧美日韩在线观看a三区| 亚洲三级影院| 欧美日本韩国一区| 毛片一区二区三区| 亚洲黄网站在线观看| 亚洲激情图片小说视频| 精品动漫3d一区二区三区免费| 久久青草久久| 久久精品99国产精品| 亚洲天堂免费在线观看视频| 国产精品99久久久久久有的能看| 久久亚洲春色中文字幕| 亚洲精品五月天| 亚洲精品你懂的| 亚洲欧美日本视频在线观看| 午夜日韩视频| 欧美另类99xxxxx| 亚洲欧洲日产国产综合网| 亚洲欧美日韩另类精品一区二区三区| 国产一区二区三区免费不卡| 性欧美激情精品| 亚洲精品乱码久久久久久日本蜜臀| 久久av老司机精品网站导航| 亚洲国产女人aaa毛片在线| 99热免费精品| 亚洲视频成人| 国产欧美日韩一区二区三区| 国产精品三上| 亚洲一区二区高清| 西西裸体人体做爰大胆久久久| 国产精品系列在线| 国产精品久久久久久久午夜片| 欧美不卡一区| 亚洲女性喷水在线观看一区| 欧美激情2020午夜免费观看| 久久中文字幕一区二区三区| 裸体素人女欧美日韩| 日韩视频在线你懂得| 国产精品日日做人人爱| 国产精品99久久久久久久vr| 99精品国产热久久91蜜凸| 欧美午夜电影完整版| 一区二区三区欧美激情| 亚洲欧美资源在线| 亚洲一区二区综合| 欧美亚洲成人网| 久久免费视频网站| 国产一区二区三区黄| 欧美网站在线观看| 国产亚洲精品福利| 在线观看三级视频欧美| 国产日韩欧美中文在线播放| 国产乱码精品一区二区三区不卡| 久久久久久久久岛国免费| 亚洲欧美日韩精品久久亚洲区| 国产精品入口| 国产亚洲精品激情久久| 亚洲一区中文字幕在线观看| 娇妻被交换粗又大又硬视频欧美| 中文一区二区在线观看| 国产精品女人网站| 99精品国产99久久久久久福利| 久久精品夜夜夜夜久久| 亚洲欧美成人一区二区在线电影| 欧美日韩一区综合| 亚洲国产精品久久久久秋霞影院| 亚洲欧美日韩在线不卡| 欧美大学生性色视频| 国产精品亚洲美女av网站| 久久综合综合久久综合| 国产伦理一区| 欧美.com| 欧美三区美女| 在线看一区二区| 久久青草福利网站| 日韩亚洲欧美中文三级| 欧美一区二粉嫩精品国产一线天| 久色婷婷小香蕉久久| 在线看视频不卡| 国产精品国产三级国产aⅴ浪潮| 激情五月***国产精品| 亚洲欧洲精品一区二区三区| 欧美日韩在线免费视频| 精品999日本| 久久精品五月| 亚洲午夜视频在线| 亚洲美女精品一区| 久久久夜夜夜| 性色av香蕉一区二区| 一区二区av| 美女精品国产| 亚洲一区二区在线看| 红杏aⅴ成人免费视频| 国产精品亚洲第一区在线暖暖韩国| 一区二区激情视频| 国产有码一区二区| 欧美日韩一区在线观看| 亚洲欧美日韩一区二区三区在线| 国产精品视频自拍| 欧美亚洲综合网| 黑人操亚洲美女惩罚| 老司机精品视频网站| 国内精品免费午夜毛片| 国产一区二区三区在线观看精品| 国产精品久久久久99| 亚洲欧美成aⅴ人在线观看| 久久久久久久综合狠狠综合| 在线精品视频一区二区三四| 老鸭窝亚洲一区二区三区| 国产欧美日韩综合一区在线播放| 久久精品国内一区二区三区| 日韩视频免费观看高清完整版| 亚洲电影在线| 亚洲另类一区二区| 免费国产自线拍一欧美视频| 欧美日韩久久精品| 免费日韩成人| 午夜激情久久久| 欧美了一区在线观看| 欧美二区乱c少妇| 一本久道综合久久精品| 在线精品国产成人综合| 欧美日韩免费观看中文| 国产欧美日韩在线播放| 亚洲一区二区在线观看视频| 午夜在线一区| av成人国产| 欧美午夜片在线观看| 老司机精品久久| 亚洲专区免费| 国产精品国产三级国产a| 一本久久a久久精品亚洲| 蜜臀久久久99精品久久久久久| 亚洲免费观看在线观看| 国产一区视频在线观看免费| 亚洲精品影视| 在线一区欧美| 欧美亚洲自偷自偷| 欧美激情综合五月色丁香| 国产精品igao视频网网址不卡日韩| 久久女同精品一区二区| 欧美视频在线不卡| 久久动漫亚洲| 欧美精品三区| 欧美在线免费视屏| 欧美特黄视频| 久久久亚洲精品一区二区三区| 欧美交受高潮1| 亚洲精品影视在线观看| 亚洲一区日本| 这里只有精品视频| 欧美成va人片在线观看| 亚洲一区二区成人| 午夜影院日韩| 国产农村妇女精品| 国产精品日韩欧美大师| 免费高清在线一区| 日韩亚洲精品在线| 免费在线欧美视频| 国产精品视频午夜| 亚洲永久免费av| 久久另类ts人妖一区二区| 亚洲激情电影在线| 欧美黑人国产人伦爽爽爽| 影音先锋亚洲电影| 欧美新色视频| 午夜欧美大尺度福利影院在线看| 国产精品美女久久久浪潮软件| 欧美四级伦理在线| 免费在线观看成人av| 亚洲一区在线观看视频| 国产精品资源| 久久av一区二区三区漫画| 久久综合五月| 在线播放中文一区| 久久99伊人| 国产视频一区二区三区在线观看| 国产精品yjizz| 欧美一区二区久久久| 久久精品人人| 好吊色欧美一区二区三区四区| 欧美精品一区二区在线观看| 国内精品视频在线播放| 永久免费视频成人| 免费欧美日韩| 亚洲一区精品在线| 久久国产精品99国产| 久久久999国产| 欧美性事在线| 在线观看国产精品网站| 亚洲手机成人高清视频| 国产一区二区按摩在线观看| 欧美日韩伊人| 91久久精品一区| 欧美女人交a| 巨乳诱惑日韩免费av| 欧美日韩中文字幕在线| 亚洲一区二区三区影院| 久久成人羞羞网站| 亚洲天堂成人| 午夜精品视频在线观看| 精品999成人| 国产精品极品美女粉嫩高清在线| 久久久精彩视频| 国产精品色一区二区三区| 久久久国产精品一区| 久久人人97超碰国产公开结果| 国产精品久久久久高潮| 精品69视频一区二区三区|