<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 監視嵌入式系統內進(jìn)程間通信的技術(shù)原理介紹

監視嵌入式系統內進(jìn)程間通信的技術(shù)原理介紹

作者: 時(shí)間:2012-09-02 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/154010.htm

的 trace 標志被激活后,它的每一次調用都會(huì )被內核檢查。我們程序也隨之被內核用信號通知。使用參數 PTRACE_GETREGS 的 ptrace() 將獲得截獲的調用的參數。最重要的參數是調用號。它保存在了 u_in.orig_eax 中。通過(guò)系統調用號,我們可以確定發(fā)生的是那一個(gè)系統調用。系統調用號可以在 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

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

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

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

上面的程序雖然很簡(jiǎn)單,但已經(jīng)可以完整的表現出利用 ptrace 截獲被監視進(jìn)程的 sendto 系統調用的過(guò)程。值得補充一點(diǎn)的是,利用 ptrace 也可以獲得 sendto 向外發(fā)送的數據。

sendto 系統調用的定義是:

#include sys/types.h>
#include sys/socket.h>
size_t sendto(int s, const void *msg, size_t len, int flags,
const struct sockaddr *to, socket len_t tolen);

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

利用上面討論的,我們開(kāi)發(fā)了可以運行在 mips 目標板上的監視程序,名為 ipcmsg 。它是一個(gè)命令行程序。在我們的應用環(huán)境中,它的使用方法是:

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

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

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


圖1 架構

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>