C / CPPでptrace()を使用して他のプロセスのメモリを読み込む[RaspberryPi]

C / CPPでptrace()を使用して他のプロセスのメモリを読み込む[RaspberryPi]

したがって、最初にプロセスAは、ストリーム(UART)から読み取られたデータ(37バイト)を含むファイルを生成します。

プロセスBは/ dev / shmに保存されているこのデータを取得する必要があります。

プロセスAがファイルに書き込むことができる絶対最大時間は4ミリ秒です。この値を超えると、許容できないデータ損失が発生します。ファイル生成には平均600usかかります。これは完全に大丈夫で、ランダムに7ms以上に急増しません。

ファイル処理を避けるために、配列のアドレスを起動パラメータとして渡してRAMに直接アクセスしたいと思います。

// Process A
sprintf(cmd, "path_to_file.out %i", (unsigned int)&rx_buffer);
system(cmd);

// Process B
int rx_buffer_address = atoi(argv[1]);

使用Gillesが提案した手順、一度読むことができました。

sprintf(mem_file_name, "/proc/%d/mem", pid);
mem_fd = open(mem_file_name, O_RDONLY);
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
lseek(mem_fd, offset, SEEK_SET);
read(mem_fd, buf, _SC_PAGE_SIZE);
ptrace(PTRACE_DETACH, pid, NULL, NULL);

関数にclose(mem_fd)を追加しても、このメソッドを実行しようとする2回目の試みは繰り返し失敗します。 open() は ENOENT (該当するファイルやディレクトリなし) を返し、 ptrace は ESRCH (該当するプロセスなし) を返します。

さらなる調査によると、最初のPTRACE_DETACH呼び出しがESRCHを返したことがわかりました。

ptrace() 検索、PTRACE_PEEKDATAを使用してメモリを読み取ろうとすると、すべての読み取りは0xFFを返します。

PEEKDATAメソッドでアクセスするローカルマップが/ memファイル記述子と異なりますか?それとも、この2つの方法やファイルアクセス時間について何かが抜けましたか?

ベストアンサー1

おすすめ記事