欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区
網絡消費網 >  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.yjkq2010.com All Rights Reserved.
 

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

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

備案號:京ICP備2022016840號-15

營業執照公示信息

欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区
主站蜘蛛池模板: 免费美女久久99| 亚洲国产精品www| 国产嫩草一区二区三区在线观看| 在线观看的日韩av| 久久综合九色综合久99| 欧美日韩的一区二区| 一区二区在线视频| 美女诱惑一区| 欧美三级网址| 黄色成人在线| 欧美与黑人午夜性猛交久久久| 国产精品女主播在线观看| 午夜精品久久久久久久蜜桃app| 国产精品网站视频| 亚洲激情图片小说视频| 亚洲一区二区三区四区五区黄| 久久国内精品自在自线400部| 国产欧美综合在线| 久久久亚洲人| 日韩视频不卡| 国产精品一二一区| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩国产美女| 亚洲免费在线观看| 亚洲福利在线视频| 亚洲欧美亚洲| 狠狠网亚洲精品| 午夜精品久久久久久久久久久久久 | 国产欧美日韩麻豆91| 亚洲电影观看| 欧美精品在线看| 欧美一区二区视频在线观看| 欧美成人精品激情在线观看 | 国产麻豆精品在线观看| 久久精品色图| 国产精品麻豆va在线播放| 久久国产精品黑丝| 一本色道久久综合亚洲精品按摩| 老色鬼精品视频在线观看播放| 国产精品日韩精品欧美在线| 久久久亚洲国产美女国产盗摄|