<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 監(jiān)視嵌入式系統(tǒng)內(nèi)進(jìn)程間通信的技術(shù)原理

          監(jiān)視嵌入式系統(tǒng)內(nèi)進(jìn)程間通信的技術(shù)原理

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

          的 trace 標(biāo)志被激活后,它的每一次調(diào)用都會(huì)被內(nèi)核檢查。我們程序也隨之被內(nèi)核用信號(hào)通知。使用參數(shù) PTRACE_GETREGS 的 ptrace() 將獲得截獲的調(diào)用的參數(shù)。最重要的參數(shù)是調(diào)用號(hào)。它保存在了 u_in.orig_eax 中。通過(guò)系統(tǒng)調(diào)用號(hào),我們可以確定發(fā)生的是那一個(gè)系統(tǒng)調(diào)用。系統(tǒng)調(diào)用號(hào)可以在 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 系統(tǒng)調(diào)用。在 Linux 的內(nèi)核中, sendto 的真實(shí)入口是 socketcall 系統(tǒng)調(diào)用。它是 bind , sendto 等socket相關(guān)系統(tǒng)調(diào)用的入口。在這個(gè)系統(tǒng)調(diào)用中,通過(guò)一個(gè) call number 來(lái)區(qū)分出 bind , sendto 等不同的子系統(tǒng)調(diào)用。在我們的程序中,這個(gè) call number 保存在 u_in.ebx 中。 從上面的 syscall_table_32.S 示例代碼就可以看出, socketcall 的系統(tǒng)調(diào)用號(hào)是102(從100向下數(shù)兩行)。而 call number 則在 net.h 有定義,我們關(guān)心的 sendto 的 call number 被定義為 SYS_SENDTO ,其絕對(duì)值為11。有了這兩個(gè)重要的數(shù)據(jù),我們的程序據(jù)此判斷當(dāng)前發(fā)生的系統(tǒng)調(diào)用是否為 sendto 。這一點(diǎn)表現(xiàn)為代碼:

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

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

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

          sendto 系統(tǒng)調(diào)用的定義是:

          #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è)參數(shù),特別是 msg 參數(shù)指出了發(fā)送的數(shù)據(jù)內(nèi)容。參數(shù) to 指出了發(fā)送的目標(biāo)。利用 PTRACE_PEEKDATA 參數(shù)的 ptrace ,監(jiān)視程序?qū)⒖梢垣@得 sendto 的全部的六個(gè)參數(shù)。這樣監(jiān)視程序就完全獲得了被監(jiān)視進(jìn)程要向外發(fā)送的數(shù)據(jù)和發(fā)送目標(biāo)。具體的實(shí)現(xiàn)細(xì)節(jié)在此不再展開(kāi)論述。請(qǐng)參考 man ptrace 說(shuō)明手冊(cè)。監(jiān)視系統(tǒng)的體系和應(yīng)用

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

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

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

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


          圖1 架構(gòu)

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();