JEDEC eMMC と経験に基づいて、入念に整理され、オリジナルが保護されており、転載は禁止されています。
ホームページ「メタストレージ - CSDN ブログ」
全文15000語、主な内容
Linux での eMMC の初期化
Linux eMMC デバッグ ツールMMC-utils
mmc-utils関数
mmc-utils コンシューマ
Linux/Android eMMC パフォーマンス テスト ツール
DDテスト
FIO テスト
IOZoneテスト
カーナル mmc_test
この記事の内容は実践的なヒントに基づいており、各ツールについて完全に説明することはできません。読者は暗記する必要はなく、保存して参考書として使用するだけです。
ツールに関しては、好きなものを選択してください。最適なものはなく、最も適したものがあるだけです。使用が比較的簡単な場合は、MMC-utils と keneral mmc_test を使用してください。さらに詳しく知りたい場合は、MMC-utils、DD テスト、および FIO テストを使用してください。DD は簡単に始めることができ、FIO は比較的専門的ですが、もちろん使用するのはより複雑になります。
プライマー
この記事では Linux を使用して説明しますが、Android は Linux カーネルに基づいているため、この記事の方法は Android にも適用できます。
LinuxでのeMMC の初期化
SD、SDIO、MMC は非常に似ているため、Linux はどのようにして MMC を認識するのでしょうか? デバイスの初期化中の識別プロセスは次のとおりです。
- 初期化するときは、まずcmd0を送信してカードをアイドル状態にします。
- 次に、cmd8を送信して、カードが SD2.0 であるかどうかを確認します。SD1.1 は cmd8 をサポートしていないため、cmd8 の送信時に応答がない場合、カードは SD1.1 であり、それ以外の場合は SD2.0 です。
- mmc_attach_sdio は cmd5 を送信してOCR レジスタを読み取り、それが sdio であるかどうかを判断し、sdio である場合は sdio バスをバインドします。
- mmc_attach_sd はコマンドacmd55およびcmd41を送信して、カードを動作状態にします。合格した場合、それは SD カードとみなされ、SD バスにバインドされます。mmc カードは acmd55 および cmd41 をサポートしていないため、応答がない場合、カードは mmc カードとみなされます。
- mmc_attach_mmc でcmd1を送信してmmc カードかどうかを判定し、応答した場合は mmc バスをバインドします。cmd1 からの応答がない場合、それは mmc カードではありません。
Linux eMMC デバッグ ツールMMC -utils
[3] Ulf Hanssonによって管理されている mmc-utils 用の MMC デバッグ ツール。次のパブリック git リポジトリにあります:
https://git.kernel.org/pub/scm/utils/mmc/mmc-utils .git
このオープンソース ツールは Linux 環境で使用されます。Android のコアも Linux なので、このツールも使用できます eMMC と MMC の違いは、一方が溶接されており、もう一方がプラグインであるためです。このツールは、eMMC と MMC の両方に適用できます。
まずは機能を見てみましょう それぞれの機能の使い方を覚える必要はなく、どのような用途に使えるのかを知っておくだけで十分です。
mmc-utils関数
mmc-utils ツールは次のことを実行できます。
- excsdデータを出力して解析します。
- eMMC書き込み保護ステータスを確認します。
- eMMC書き込み保護ステータスを設定します。
- エミュレーションを無効にして、eMMC データ セクター サイズを 4KB に設定します。
- GPAP 一般パーティションを作成します。
- Enhance Area (拡張ユーザー領域)を有効にします。
- 各パーティションの書き込みの信頼性を有効にします。
- STATUS_SEND (CMD13) への応答を出力します。
- ブート(ブート) パーティションを有効にします。
- ブートストラップバスの条件を設定します。
- eMMC BKOPS機能を有効にします。
- eMMC H/W リセット機能を永続的に有効にします。
- eMMC H/W リセット機能を永続的に無効にします。
- サニタイズコマンドを送信します。
- デバイスのプログラム認証キー (認証キー、 RPMB で使用されます)。
- RPMB パーティションのカウンター値は、標準出力デバイス (画面など) に読み込まれます。
- RPMB デバイスから 出力に読み取ります。
- データ ファイルからRPMBデバイスに書き込みます。
- eMMC キャッシュ (キャッシュ) 機能を有効にします。
- eMMC キャッシュ (キャッシュ) 機能を無効にします。
- CIDデータを印刷して解析します。
- CSDデータを印刷して解析します。
- SCRデータを印刷して解析します。
MMC-utilsの使用方法
パラメータなしで mmc を通じて使用状況を表示できます
Usage:
mmc extcsd read <device>
Print extcsd data from <device>.
mmc writeprotect get <device>
Determine the eMMC writeprotect status of <device>.
mmc writeprotect set <device>
Set the eMMC writeprotect status of <device>.
This sets the eMMC to be write-protected until next boot.
mmc disable 512B emulation <device>
Set the eMMC data sector size to 4KB by disabling emulation on
<device>.
mmc enh_area set <-y|-n> <start KiB> <length KiB> <device>
Enable the enhanced user area for the <device>.
Dry-run only unless -y is passed.
NOTE! This is a one-time programmable (unreversible) change.
mmc write_reliability set <-y|-n> <partition> <device>
Enable write reliability per partition for the <device>.
Dry-run only unless -y is passed.
NOTE! This is a one-time programmable (unreversible) change.
mmc status get <device>
Print the response to STATUS_SEND (CMD13).
mmc bootpart enable <boot_partition> <send_ack> <device>
Enable the boot partition for the <device>.
To receive acknowledgment of boot from the card set <send_ack>
to 1, else set it to 0.
mmc bkops enable <device>
Enable the eMMC BKOPS feature on <device>.
NOTE! This is a one-time programmable (unreversible) change.
mmc hwreset enable <device>
Permanently enable the eMMC H/W Reset feature on <device>.
NOTE! This is a one-time programmable (unreversible) change.
mmc hwreset disable <device>
Permanently disable the eMMC H/W Reset feature on <device>.
NOTE! This is a one-time programmable (unreversible) change.
mmc sanitize <device>
Send Sanitize command to the <device>.
This will delete the unmapped memory region of the device.
mmc help|--help|-h
Show the help.
mmc <cmd> --help
Show detailed help for a command or subset of commands.
0.1
使用例
mmc extcsd 読み取り /dev/mmc0
Linux/Android eMMC パフォーマンス テスト ツール
Linux emmc パフォーマンス テストには主に4 つのツールがあります。
- DD
- FIO
- IOゾーン
- 一般 mmc_test
どちらがいいですか?人によって意見は違うと思いますが、私はDDを先に書いているので、どちらが好みか分かると思います^^
DDテスト
書き込みパフォーマンステスト
2 つのケースに分けてテストします
ブロックデバイスへの書き込み
キャッシュ パーティションは通常、OTA アップグレード パッケージを保存するために使用されます。通常の状態では、マウントの失敗はシステムの通常の動作に影響を与えないため、書き込みテストにキャッシュ パーティションを使用し、最初に対応するブロック デバイス ファイルを見つけます。キャッシュに
1 2 3 |
KKHi3751V810:/ #ls -l /dev/block/platform/soc/f9830000.emmc/by-name/cache < lrwxrwxrwx 1 root root 21 1970-01-01 08:00 /dev/block/platform/soc/f9830000。 emmc/by-name/cache -> /dev/block/mmcblk0p18 KKHi3751V810:/ # |
キャッシュパーティションのブロックデバイスファイルは/dev/block/mmcblk0p18です。
テストを書きます:
1 2 3 4 5 6 |
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches KKHi3751V810:/ # Busybox dd if=/dev/zero of=/dev/block/mmcblk0p18 bs=1M count=1024 conv=fsync 1024 +0 レコード ( 1024 件) +0 レコード出力 1073741824 バイト (1.0GB) コピー、24.122624 秒、42.4MB/秒 KKHi3751V810:/ # |
入力ファイルは仮想デバイスである /dev/zero ですが、このデバイスの読み取り速度は無限、つまり読み取り速度が書き込み速度に影響を与えないと考えることができます。
bs=1M: 一度に 1M を書き込みます
count=1024: 1024 回書き込みます、つまり、書き込まれるデータの総量は 1G です
conv=fsync: このパラメーターが追加されない場合、dd の終了前にデータを emmc に同期します、データがまだキャッシュにある可能性があります。データの正確性を確保するには、このパラメータを追加する必要があります。
テストを数回繰り返します。速度は基本的に約 42M/s です。
ファイルに書き込む
1 2 3 4 5 6 |
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches KKHi3751V810:/ # ビジーボックス dd if=/dev/zero of=/data/ddtest.bin bs=1M count=1024 conv=fsync < 1024+0 records in 1024+0 レコード出力 1073741824 バイト (1.0GB) コピー、30.607905 秒、33.5MB/秒 KKHi3751V810:/ # |
テストを数回繰り返します。速度は基本的に約 33M/s です。ブロックデバイスファイルを直接書き込む場合と比較すると、約10M/s遅くなります。これはファイル システムの影響である可能性があります。
読み取りテスト
読み取りブロックデバイス
上で紹介した例を使用してキャッシュをクリアするだけなので、ここでは繰り返しません。
上記の例から得られるデータは約 203M/s です。
ファイルを読み取る
1 2 3 4 5 6 |
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches KKHi3751V810:/ # ビジーボックス dd if=/data/ddtest.bin of=/dev/null bs=1M count=1024 1024 +0 レコード中 1024+0 レコードout 1073741824 バイト (1.0GB) コピー、4.915286 秒、208.3MB/s KKHi3751V810:/ # |
書き込み速度をテストするときに生成されたファイルを直接取得し、テストを数回繰り返すと、速度は基本的に約 208MB/s になります。
FIO テスト
Iops、読み取りおよび書き込みの帯域幅レート、その他の情報を取得できます。
読み取りおよび書き込み速度は、キューの深さ、ブロックサイズ、スレッド数などに密接に関係しており、SSD の動作原理に関係しています。
1. ランダムリード(ランダムリード)
fio -filename=/tmp/test_randread -direct=1 -io Depth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=30G -numjobs=10 -runtime=600 -group_reporting -name=mytest
10スレッドの場合
実行ステータス グループ 0 (すべてのジョブ):
読み取り: io=51200MB、aggrb=257806KB/s、minb=257806KB/s、maxb=257806KB/s、mint=203365msec、maxt=203365msec
スレッドのとき
実行ステータス グループ 0 (すべてのジョブ):
読み取り: io=1024.0MB、aggrb=27522KB/s、minb=27522KB/s、maxb=27522KB/s、mint=38099msec、maxt=38099msec
2スレッドの場合
実行ステータス グループ 0 (すべてのジョブ):
読み取り: io=2048.0MB、aggrb=48400KB/s、minb=48400KB/s、maxb=48400KB/s、mint=43329msec、maxt=43329msec
ランダム書き込み
fio -filename=./test_randread -direct=1 -io Depth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=1G -numjobs=10 -runtime=600 -group_reporting -name=mytest
実行ステータス グループ 0 (すべてのジョブ):
書き込み: io=10240MB、aggrb=66959KB/s、minb=66959KB/s、maxb=66959KB/s、mint=156599msec、maxt=156599msec
ディスク統計 (読み取り/書き込み):
sda: ios=1/655282、merge=0/86、ticks=0/135704、in_queue=135652、util=86.80%
シーケンシャルリード
fio -filename=./test_randread -direct=1 -io Depth 1 -thread -rw=read -ioengine=psync -bs=16k -size=1G -numjobs=5 -runtime=600 -group_reporting -name=mytest
実行ステータス グループ 0 (すべてのジョブ):
読み取り: io=5120.0MB、aggrb=45658KB/s、minb=45658KB/s、maxb=45658KB/s、mint=114829msec、maxt=114829msec
シーケンシャルライト
fio -filename=./test_randread -direct=1 -io Depth 1 -thread -rw=write -ioengine=psync -bs=16k -size=1G -numjobs=5 -runtime=600 -group_reporting -name=mytest
実行ステータス グループ 0 (すべてのジョブ):
書き込み: io=2048.0MB、aggrb=15644KB/s、minb=15644KB/s、maxb=15644KB/s、mint=134053msec、maxt=134053msec
FIO の実行問題について
Android プラットフォームで fio を実行すると、2 つの理由で fio が正常に実行できないことがわかります。
- インポートされた fio 実行可能プログラムは 32 ビットですが、現在の CPU は 64 ビットで、実行中のカーネルには /system/bin/linker、system/lib/libc.so lbc++ などの 32 ビット関連ライブラリがありませ ん。 . および 32 ビット プログラムの実行に必要な他のダイナミック リンカー、共有ライブラリなど。ここでは、カーネルで有効になっている限り、64 ビット CPU と Linux が EL0 での 32 ビット プログラムの実行をサポートしていることを説明する必要があります。関連する 32 ビット プログラムがライブラリのインポートを実行します。
- fio は静的プログラムにコンパイルできるため、fio が依存する必要があるライブラリも static.a である必要があります。
- fio のコンパイルに使用されるコンパイラの選択については、Android をサポートする Linux 環境で実行されるため、コンパイラは aarch-linux-android-gcc バージョンを使用します。カーネル内のライブラリ関数もこのコンパイラを使用してコンパイルされるため、コンパイラは aarch-linux-android-gcc バージョンを使用します。アプリケーション層とカーネルコンパイラは一貫している必要があります。
FIO テストの実行中
ファイルの書き込み速度
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches
KKHi3751V810:/ # fio -filename=/dev/block/mmcblk0p18 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=1m -size=1G -numjobs=4 -runtime=60 -group_reporting -name=rand_write_1m
rand_write_1m: (g=0): rw=randwrite, bs=1M-1M/1M-1M/1M-1M, ioengine=psync, iodepth=1
...
fio-2.2.6
Starting 4 threads
Jobs: 3 (f=3): [w(3),_(1)] [98.1% done] [0KB/80734KB/0KB /s] [0/78/0 iops] [eta 00m:01s]
rand_write_1m: (groupid=0, jobs=4): err= 0: pid=8316: Wed Feb 12 21:03:34 2020
write: io=4096.0MB, bw=83067KB/s, iops=81, runt= 50493msec
clat (msec): min=10, max=1361, avg=48.60, stdev=44.45
lat (msec): min=10, max=1361, avg=48.86, stdev=44.44
clat percentiles (msec):
| 1.00th=[ 18], 5.00th=[ 22], 10.00th=[ 23], 20.00th=[ 26],
| 30.00th=[ 34], 40.00th=[ 37], 50.00th=[ 46], 60.00th=[ 48],
| 70.00th=[ 58], 80.00th=[ 65], 90.00th=[ 76], 95.00th=[ 87],
| 99.00th=[ 104], 99.50th=[ 114], 99.90th=[ 758], 99.95th=[ 1123],
| 99.99th=[ 1369]
bw (KB /s): min= 1343, max=41353, per=25.49%, avg=21171.93, stdev=4637.55
lat (msec) : 20=1.51%, 50=60.52%, 100=36.40%, 250=1.37%, 500=0.02%
lat (msec) : 750=0.05%, 1000=0.05%, 2000=0.07%
cpu : usr=0.43%, sys=1.13%, ctx=10620, majf=0, minf=6
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=0/w=4096/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: io=4096.0MB, aggrb=83067KB/s, minb=83067KB/s, maxb=83067KB/s, mint=50493msec, maxt=50493msec
Disk stats (read/write):
mmcblk0: ios=54/8332, merge=5/888, ticks=60872/378355, in_queue=439181, util=100.00%
KKHi3751V810:/ #
4 スレッドの平均書き込み速度は bw=83067KB/s で、約 80M/s と dd の 2 倍以上高速です。
ファイルの読み取り速度
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches
KKHi3751V810:/ # fio -filename=/dev/block/mmcblk0 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=1m -size=1G -numjobs=4 -runtime=60 -group_reporting -name=rand_read_1m
rand_read_1m: (g=0): rw=randread, bs=1M-1M/1M-1M/1M-1M, ioengine=psync, iodepth=1
...
fio-2.2.6
Starting 4 threads
Jobs: 1 (f=1): [_(3),r(1)] [96.2% done] [148.5MB/0KB/0KB /s] [148/0/0 iops] [eta 00m:01s]
rand_read_1m: (groupid=0, jobs=4): err= 0: pid=7889: Wed Feb 12 20:56:21 2020
read : io=4096.0MB, bw=171813KB/s, iops=167, runt= 24412msec
clat (msec): min=4, max=9350, avg=19.50, stdev=215.06
lat (msec): min=4, max=9350, avg=19.50, stdev=215.06
clat percentiles (msec):
| 1.00th=[ 7], 5.00th=[ 8], 10.00th=[ 8], 20.00th=[ 11],
| 30.00th=[ 11], 40.00th=[ 11], 50.00th=[ 11], 60.00th=[ 14],
| 70.00th=[ 14], 80.00th=[ 14], 90.00th=[ 14], 95.00th=[ 14],
| 99.00th=[ 16], 99.50th=[ 30], 99.90th=[ 2638], 99.95th=[ 4113],
| 99.99th=[ 9372]
bw (KB /s): min= 964, max=145420, per=46.41%, avg=79740.53, stdev=25495.41
lat (msec) : 10=13.77%, 20=85.55%, 50=0.29%, 100=0.12%, 500=0.05%
lat (msec) : 750=0.05%, 2000=0.05%, >=2000=0.12%
cpu : usr=0.22%, sys=3.16%, ctx=9195, majf=0, minf=1030
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=4096/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
READ: io=4096.0MB, aggrb=171813KB/s, minb=171813KB/s, maxb=171813KB/s, mint=24412msec, maxt=24412msec
Disk stats (read/write):
mmcblk0: ios=8365/46, merge=15/47, ticks=633927/61332, in_queue=695214, util=99.20%
KKHi3751V810:/ #
4 スレッドの平均読み取り速度は bw=171813KB/s、つまり約 170M/s です。
IOZoneテスト
Android システムのソース コードには iozone がありません。公式 Web サイトからダウンロードしてコンパイルする必要があります。私がダウンロードしたときの最新バージョンは iozone3_489 です。このバージョンには、コード内に Android.mk がすでに含まれているため、ソース コードを入れるだけですAndroid システムのソース コードと mm.
ランダムな読み取りおよび書き込みテスト:
KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches
KKHi3751V810:/ # iozone -azecI -+n -L64 -S32 -r1m -s1024m -i0 -i2 -w -f /data/iozonetest.bin
Iozone: Performance Test of File I/O
Version $Revision: 3.489 $
Compiled for 64 bit mode.
Build: linux-arm
Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
Al Slater, Scott Rhine, Mike Wisner, Ken Goss
Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
Vangel Bojaxhi, Ben England, Vikentsi Lapa,
Alexey Skidanov, Sudhir Kumar.
Run began: Wed Feb 12 20:47:58 2020
Auto Mode
Cross over of record size disabled.
Include fsync in write timing
Include close in write timing
O_DIRECT feature enabled
No retest option selected
Record Size 1024 kB
File size set to 1048576 kB
Setting no_unlink
Command line used: iozone -azecI -+n -L64 -S32 -r1m -s1024m -i0 -i2 -w -f /data/iozonetest.bin
Output is in kBytes/sec
Time Resolution = 0.000001 seconds.
Processor cache size set to 32 kBytes.
Processor cache line size set to 64 bytes.
File stride size set to 17 * record size.
random random bkwd record stride
kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
1048576 1024 74782 0 199299 71520
iozone test complete.
KKHi3751V810:/ #
結果から、ランダム読み取り速度は 199299 kB/s で、これは約 200M/s です。ランダム書き込み速度は 71520 kB/s、つまり約 70M/s です。
テストを数回繰り返しますが、結果は同様で、読み取り速度は基本的に dd と同じです。書き込みは dd のほぼ 2 倍高速です。
カーナル mmc_test
転載元: Linux カーネル mmc フレームワークの説明 (mmc_test_operation および maintenance_kivy_xian のブログ、CSDN ブログを含む)
Linux カーネルに付属する mmc_test.ko を使用して、速度設定、バス幅設定、マルチ操作、トリム操作、コマンドおよび基本データの読み書き、その他の特性テストを含む mmc の機能テストを実行します。以下の手順に従ってください。
1. CONFIG_MMC_BLOCK=n、CONFIG_MMC_TEST=y。または、CONFIG_MMC_BLOCK=y、CONFIG_MMC_TEST=y。後者の構成を選択した場合は、システムの起動後にバス ドライバーで手動でバインドおよびバインド解除を行う必要があります (後述)。
2. CONFIG_DEBUG_FS=y、CONFIG_DEBUG_KERNEL=y、これら 2 つの項目はプロジェクトのカーネルの defconfig で構成されているため、変更を行う必要はありません。
3. mount -t debugfs none /sys/kernel/debug。これはプロジェクトにマウントされているため、変更する必要はありません。
上記3項目を完了後、システムを起動します 手順1でCONFIG_MMC_BLOCK=yの場合、最初に以下の操作を行う必要があります。
etau:/ # ls sys/bus/mmc/devices/
mmc0:aaaa
etau:/sys/bus/mmc/drivers # ls
mmc_test/mmcblk/
etau:/sys/bus/mmc/drivers # cd mmcblk/
etau:/sys/bus/mmc/drivers/mmcblk # ls -al
合計 0
drwxr-xr-x 2 ルート ルート 0 2000-01-01 01:27 。
drwxr-xr-x 4 ルート ルート 0 2000-01-01 01:27 ..
--w------ 1 ルート root 4096 2000-01-01 01:28bind
lrwxrwxrwx 1 ルート ルート 0 2000-01-01 01:28 mmc0:aaaa ->../../../../devices/soc0/20a50000.rda-mmc0/mmc_host/mmc0/mmc0:aaaa
--w------ 1 ルート root 4096 2000-01-01 01:28uevent
--w------ 1 ルート root 4096 2000-01-01 01:28unbind
etau :/sys/bus/mmc/drivers/mmcblk # echo –n mmc0 : aaaa > unbind
etau:/sys/bus/mmc/drivers # cdmmc_test/
etau:/sys/bus/mmc/drivers/mmc_test # ls
バインドイベントのバインドを解除する
etau : /sys/bus / mmc / drivers / mmc_test # echo – n mmc0 : aaaa > バインド
以上の操作が完了すると、mmc0:aaaaとmmc_testドライバーのバインドが完了します。以降の手順は次のようにまったく同じです。
etau:/sys/kernel/debug/mmc0/mmc0:aaaa# cat testlist
1: Basic write (no data verification)
2: Basic read (no data verification)
3: Basic write (with data verification)
4: Basic read (with data verification)
5: Multi-block write
6: Multi-block read
7: Power of two block writes
8: Power of two block reads
9: Weird sized block writes
10: Weird sized block reads
11: Badly aligned write
12: Badly aligned read
13: Badly aligned multi-block write
14: Badly aligned multi-block read
15: Correct xfer_size at write (start failure)
16: Correct xfer_size at read (start failure)
17: Correct xfer_size at write (midway failure)
18: Correct xfer_size at read (midway failure)
19: Highmem write
20: Highmem read
21: Multi-block highmem write
22: Multi-block highmem read
23: Best-case read performance
24: Best-case write performance
25: Best-case read performance into scattered pages
26: Best-case write performance from scatteredpages
27: Single read performance by transfer size
28: Single write performance by transfer size
29: Single trim performance by transfer size
30: Consecutive read performance by transfer size
31: Consecutive write performance by transfer size
32: Consecutive trim performance by transfer size
33: Random read performance by transfer size
34: Random write performance by transfer size
35: Large sequential read into scattered pages
36: Large sequential write from scattered pages
37: Write performance with blocking req 4k to 4MB
38: Write performance with non-blocking req 4k to 4MB
39: Read performance with blocking req 4k to 4MB
40: Read performance with non-blocking req 4k to 4MB
41: Write performance blocking req 1 to 512 sg elems
42: Write performance non-blocking req 1 to 512 sg elems
43: Read performance blocking req 1 to 512 sg elems
44: Read performance non-blocking req 1 to 512 sg elems
45: Reset test
次に、etau:/sys/kernel/debug/mmc0/mmc0:aaaa# echo 1 > test を実行して、テスト結果を確認します。
[314034.644348] mmc0:cardmmc0:aaaa のテストを開始しています...
[314034.645080] mmc0: テスト ケース 1. Basicwrite (データ検証なし)...
[314034.647583] mmc0: 結果: OK
[314034.647827] mmc0: テストが完了しました。
参考
[1] Linux カーネル mmc フレームワークの説明 (mmc_test_Operation およびmaintenance_kivy_xian のブログ - CSDN ブログ)
[2] Linux emmc テスト - Zhihu
[3] MMC ツールの紹介 — Linux カーネルのドキュメント
免責事項:
この記事は公開情報に基づいて構成されており、ストレージに関するより多くの知識を紹介することを目的としています。記事に含まれる記事は著者の意見のみであり、投資や商業上のアドバイスを構成するものではありません。この記事は学習とコミュニケーションのみを目的としており、商用目的ではありません。ご質問や権利侵害がある場合は、作者までご連絡ください。