質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Linux

    2695questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

物理メモリと仮想メモリ,カーネルについて

解決済

回答 1

投稿 2017/11/28 18:37

  • 評価
  • クリップ 0
  • VIEW 99

s0r4syl

score 1

実現したいこと

Androidのメモリからデータを取って暗号化した後に戻すということをしたいと思い,まずはプロセスの物理アドレス取得するために,手始めにUbuntuでカーネルを落としてきて,システムコールを追加し,物理アドレスを取得しようとしているところ.

わからないこと

  • /proc/PID/mapsのようにpid番号を引数にtask_struct構造体を取得し,vm_area_struct構造体から仮想アドレスを取得することができるのは調べたのですが,物理アドレスはどこを見に行けばいいのか?
  • そもそもpid番号から物理アドレスは取得できるのか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

論理アドレスと物理アドレスの対応はMMUによって管理されています。
参考:https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88

/proc/PID/mapsのようにpid番号を引数にtask_struct構造体を取得し,vm_area_struct構造体から仮想アドレスを取得することができるのは調べたのですが,物理アドレスはどこを見に行けばいいのか?

メモリ管理、アドレス空間、ページテーブルによりますと、 vm_area_struct から mm_struct をたどり、 pgd の値からページテーブルを検索すると物理メモリのフレーム番号がわかるようです。

Androidのメモリからデータを取って暗号化した後に戻すということをしたいと思い

これを実行するために物理アドレスが必要となる理由がわかりません。たとえば、他のプロセスのメモリの内容を参照したいのであれば、/proc/mem 経由で参照することができますが、その場合に必要なアドレスは物理アドレスではなく論理アドレスです。
参考:https://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux

投稿 2017/11/28 21:02

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/29 17:36

    回答ありがとうございます.質問ですが,
    ・参考URLを見て,/proc/PID/memの内容がプロセスに関するメモリの内容と同じという理解で正しいでしょうか?
    ・メモリの書き換えはここではできるのでしょうか,暗号化が目標なので書き込みがしたいです

    キャンセル

  • 2017/11/29 17:50

    物理アドレスを求めようと思ったきっかけは,論理アドレスでは他のプロセスから見てどこに実際のデータがあるのかが分からないのではないかと思っていたからです

    キャンセル

  • 2017/11/30 00:57

    ・参考URLを見て,/proc/PID/memの内容がプロセスに関するメモリの内容と同じという理解で正しいでしょうか?
    そうですね。参考URLにあるとおり、 /proc/PID/maps でメモリマッピングがどうなっているかを調べて、論理アドレスに seek すれば、メモリの内容が参照できます。
    ただし、ptrace でプロセスにアタッチする必要があります。
    参考:http://www.nminoru.jp/~nminoru/programming/view_process_mem.html

    ・メモリの書き換えはここではできるのでしょうか,暗号化が目標なので書き込みがしたいです
    上記参考にあるとおり、この方法でできます。あと、 ptrace でもできます。

    キャンセル

  • 2017/11/30 01:32

    プロセスのメモリと/proc/PID/memはOSが同期をとってるということですか.
    直近で知りたいことは分かったと思います.実装してみたいと思います,ありがとうございました.

    キャンセル

  • 2017/11/30 12:18

    > プロセスのメモリと/proc/PID/memはOSが同期をとってるということですか
    いえ、複製同期しているわけではなく、直接プロセスのメモリが見えているものと思われます。ファイルに見えて実は・・・ていうのが /proc ファイルシステムの特長です。ファイルディスクリプタの read, seek, write がファイル以外のものにも使えるというは、オブジェクト指向でいう多様性(ポルモアフィズム)の一つで Unix の大きな発明の一つです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

  • 解決済

    構造体のポインタがわからない

    #include <stdio.h> #include<stdlib.h> struct name {    int a;    float b;    char c[30]; }

  • 受付中

    ダブルポインタと構造体

    キューを使ってenqueue,dequeueするプログラムをポインタのポインタを引数に持つ関数で作りたいです。 deq操作を行う関数とキューの中をカラにする関数で警告がでま

  • 解決済

    C言語 構造体連結リスト

    C言語で構造体の連結リストを作成しようとしているのですが malloc corruptionとエラーメッセージが出ます typedef struct _user { ch

  • 解決済

    railsが動いているサーバーが重い原因について

    centos6.7 apache2.2.15 上でrailsのアプリを入れて動かしているのですが、サイトの表示重いためtopコマンドで確認したところgitユーザーでbundle

  • 解決済

    プロセスのカーネルモードへの移行について

    ユーザーが作ったプロセスは通常ユーザーモードで動作していますが、 プロセスがシステムコールを発行するとプロセス自身がカーネルモードに移行するんですか?? 自分は今まで ユ

  • 解決済

    PIDとは、誰が割り当てる識別子でしょうか??

    プロセスに対するPIDの割り当ては、 ・カーネルが割り当てるものですか?? ・そのプロセスの親プロセスが割り当てるものですか?? PIDの割り当てを行うのは、誰なのか

  • 解決済

    C言語のポインタとスタック

    いつもお世話になってます。 C言語のポインタとスタックについて質問です。 現在、C言語でのメモリ領域の使われ方について勉強していたのですが、ポインタとスタックの関係についてわからな

  • 解決済

    対象型マルチプロセッシングで、カーネルはどこに置かれるのか?

    対象型マルチプロセッサをアーキテクチャーに持つシステムで、 マルチスレッド機能をもつカーネルは何処に配置され、どのように動くのか知りたいです。 つまり、昨今のマルチコアCPUで組ま

同じタグがついた質問を見る

  • Linux

    2695questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。