ブログ

memtool を使用して任意のメモリ空間にアクセスする方法

at_shiita.ishigaki
2022年7月20日 15時58分

以前にdevmem2を使用して任意のメモリ空間にアクセスする方法を挙げており、似た機能を持つコマンドとして memtool があります。
memtool は debian パッケージとして配布されているため、ビルドせずに使用することができます。
memtool をインストールするには以下のコマンドを実行します。

[armadillo ~]# apt install memtool

Armadillo-IoT G4 を使用している場合は、stretch 以降の debian コンテナを使用する必要があります。また、/dev/mem のアクセスとメモリへの読み込み・書き込みを許可する必要があります。以下に podman コンテナを立ち上げるコマンド例を示します。

[armadillo ~]# podman run -it --name=memtest \
                --cap-add SYS_RAWIO \
                --device /dev/mem:/dev/mem \
                docker.io/debian:bullseye \
                /bin/bash

memtool の書式を以下に示します。

書式: memtool <cmd> [OPTIONS]

cmd はメモリの値を読み出す場合は md とし、 メモリに値を書き込む場合は mw とします。
メモリに 8bit でアクセスする場合は -b、16bit は -w、32bit は -l、64bit は -q を OPTIONS に指定します。
その他の OPTIONS については、 memtool md -h もしくは、 memtool mw -h を実行し、ヘルプを参照してください。
以下ではメモリの値を読み出す例としてアドレス 0xa0000000 に 8bit 単位でアクセスしリードを行います。

[armadillo ~]# memtool md -b 0xa0000000
a0000000: 39 09 8b 18 84 57 88 51 08 ce b6 2c 0a 1d f2 16    9....W.Q...,....
a0000010: 10 92 79 29 0e 00 80 8e 1c 1a ec c1 36 c3 07 fd    ..y)........6...
a0000020: 08 34 ac 18 be 40 b0 14 09 89 00 99 41 16 48 bd    .4...@......A.H.
a0000030: 9b 41 11 8e 22 10 95 b7 08 01 d8 80 1b 07 c0 18    .A.."...........
a0000040: 5e c5 41 28 48 8d 4d 43 e0 a7 02 45 6d 01 57 07    ^.A(H.MC...Em.W.
a0000050: d4 11 08 90 8e da 02 01 c4 08 d0 57 12 e5 86 6f    ...........W...o
a0000060: dc 90 96 d4 08 07 48 56 9c 55 00 14 00 05 12 5c    ......HV.U.....\
a0000070: 64 5b 70 08 22 a4 37 50 3a d0 9c 6f 0a 5d 80 fe    d[p.".7P:..o.]..
a0000080: e7 19 0a 90 54 12 10 2f 19 13 07 c8 ac a4 4b 44    ....T../......KD
a0000090: e7 13 cc 05 0f 89 49 f1 0d 2f 29 5e 01 31 29 04    ......I../)^.1).
a00000a0: 9f 40 0c 70 3b 90 c8 13 48 71 8b 01 86 1a 06 05    .@.p;...Hq......
a00000b0: c0 35 01 a0 8c 40 60 16 84 42 1d 56 b9 81 2f 07    .5...@`..B.V../.
a00000c0: 1f b5 09 40 a1 24 8f 4d 8a 14 4e 20 40 4f d6 c2    ...@.$.M..N @O..
a00000d0: 08 b1 19 09 36 d3 45 89 20 05 20 c8 d3 93 14 41    ....6.E. . ....A
a00000e0: 20 18 40 0d 1a 04 8f 49 9d db e0 6b 21 60 14 d3     .@....I...k!`..
a00000f0: 46 60 00 10 04 ab 17 2f 9d c3 b9 12 9e 26 0b 44    F`...../.....&.D

メモリに値を書き込む例として、アドレス 0xa0000000 に 8bit 単位でアクセスし、0x1234 を書き込みます。

[armadillo ~]# memtool mw -b 0xa0000000 0x1234
[armadillo ~]# memtool md -b 0xa0000000
a0000000: 34 12 00 00 84 57 88 51 08 ce b6 2c 0a 1d f2 16    4....W.Q...,....
a0000010: 10 92 79 29 0e 00 80 8e 1c 1a ec c1 36 c3 07 fd    ..y)........6...
:(省略)

アドレス 0xa0000000 の先頭に 0x1234 が書き込まれていることが確認できます。
メモリのアドレスを read する分には問題ありませんが、誤ったアドレスに write してしまうと最悪ハードウェアの故障にもつながる可能性もありますのでご注意ください。