網絡消費網 >  5G > > 正文
        監視嵌入式系統內進程間通信的技術原理介紹
        時間:2022-01-31 10:22:03

        本文詳細描述了一種利用 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 sys/ptrace.h> 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 stdio.h> #include stdlib.h> #include sys/ptrace.h> #include sys/wait.h> #include Linux/user.h> #include sys/socket.h> #include sys/un.h> #include Linux/net.h>

        為了在程序中使用 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 */

        關鍵詞: 技術 原理 介紹 通信 進程 嵌入式 系統 監視

        版權聲明:
            凡注明來網絡消費網的作品,版權均屬網絡消費網所有,未經授權不得轉載、摘編或利用其它方式使用上述作品。已經本網授權使用作品的,應在授權范圍內使用,并注明"來源:網絡消費網"。違反上述聲明者,本網將追究其相關法律責任。
            除來源署名為網絡消費網稿件外,其他所轉載內容之原創性、真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考并自行核實。
        熱文

        網站首頁 |網站簡介 | 關于我們 | 廣告業務 | 投稿信箱
         

        Copyright © 2000-2020 www.fnsyft.com All Rights Reserved.
         

        中國網絡消費網 版權所有 未經書面授權 不得復制或建立鏡像
         

        聯系郵箱:920 891 263@qq.com

        備案號:京ICP備2022016840號-15

        營業執照公示信息

        国产精品亚洲玖玖玖在线观看 | 亚洲成av人片不卡无码久久| 亚洲精品高清国产麻豆专区| 亚洲AV无码日韩AV无码导航| 亚洲区小说区图片区QVOD| 亚洲日本成本人观看| 亚洲欧洲国产精品香蕉网| 亚洲无人区一区二区三区| 亚洲精品无码久久不卡| 亚洲国产国产综合一区首页| 亚洲高清在线视频| 亚洲伊人久久大香线蕉苏妲己| 亚洲视频在线视频| 亚洲蜜芽在线精品一区| 亚洲成AV人综合在线观看 | 日本红怡院亚洲红怡院最新| 国产成人亚洲综合无码精品| 亚洲AV无码专区国产乱码4SE| 亚洲91av视频| 亚洲综合视频在线观看| 亚洲国产精品久久久久秋霞影院| 亚洲中文字幕久在线| 亚洲国产精品一区二区三区在线观看 | 亚洲av区一区二区三| 精品亚洲一区二区三区在线播放| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲日韩精品一区二区三区| 亚洲AV日韩精品久久久久久| 亚洲图片在线观看| 亚洲国产成人精品无码一区二区| 亚洲最大福利视频| 相泽南亚洲一区二区在线播放| 亚洲国产精品一区二区九九 | 亚洲人AV永久一区二区三区久久| 国产亚洲成人久久| 久久久久亚洲AV成人无码| 亚洲无圣光一区二区| 亚洲色大网站WWW永久网站| 国产成人高清亚洲一区久久| 久久精品国产亚洲一区二区三区| 亚洲国产精品一区二区久久hs|