某一天,领导安排一个任务,要画一份某个项目的eMMC的layout,将分区信息表示出来,哪个分区的起始地址和结束地址,占用了多大等等信息。在此,整理了相关的内容,通过这几个常用的命令可以大致了解这块eMMC的分区情况。
mount查看分区挂载情况
执行mount命令,可以查看分区挂载的情况。
1 | @xxx:/ |
可以知道,mmcblk0p1
挂载到/system
分区,mmcblk0p2
挂载到/data
分区。
查看eMMC分区情况
在 /sys/class/block/
目录下可以查看当前系统的分区情况:
1 | total 0 |
从上面的信息可以知道:
- 这个eMMC上总共共有5个分区,boot0/boot1/p1/p2/rpmb分区;
- 这个eMMC用到的控制器为6b030000.esdhc;
- 我们可以到
../../devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001/block/mmcblk0/
目录下查看更具体的信息;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30@xxx:/sys/devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001/block/mmcblk0
total 0
-r--r--r-- 1 root root 4096 1970-01-01 00:35 alignment_offset
-rw-r--r-- 1 root root 4096 1970-01-01 00:35 badblocks
lrwxrwxrwx 1 root root 0 1970-01-01 00:35 bdi -> ../../../../../../../virtual/bdi/179:0
-r--r--r-- 1 root root 4096 1970-01-01 00:35 capability
-r--r--r-- 1 root root 4096 1970-01-01 00:35 dev
lrwxrwxrwx 1 root root 0 1970-01-01 00:35 device -> ../../../mmc0:0001
-r--r--r-- 1 root root 4096 1970-01-01 00:35 discard_alignment
-r--r--r-- 1 root root 4096 1970-01-01 00:35 ext_range
-rw-r--r-- 1 root root 4096 1970-01-01 00:35 force_ro
drwxr-xr-x 2 root root 0 1970-01-01 00:00 holders
-r--r--r-- 1 root root 4096 1970-01-01 00:35 inflight
drwxr-xr-x 2 root root 0 1970-01-01 00:00 integrity
drwxr-xr-x 7 root root 0 1970-01-01 00:00 mmcblk0boot0
drwxr-xr-x 7 root root 0 1970-01-01 00:00 mmcblk0boot1
drwxr-xr-x 4 root root 0 1970-01-01 00:00 mmcblk0p1
drwxr-xr-x 4 root root 0 1970-01-01 00:00 mmcblk0p2
drwxr-xr-x 7 root root 0 1970-01-01 00:00 mmcblk0rpmb
drwxr-xr-x 2 root root 0 1970-01-01 00:00 power
drwxr-xr-x 3 root root 0 1970-01-01 00:00 queue
-r--r--r-- 1 root root 4096 1970-01-01 00:35 range
-r--r--r-- 1 root root 4096 1970-01-01 00:35 removable
-r--r--r-- 1 root root 4096 1970-01-01 00:35 ro
-r--r--r-- 1 root root 4096 1970-01-01 00:35 size
drwxr-xr-x 2 root root 0 1970-01-01 00:00 slaves
-r--r--r-- 1 root root 4096 1970-01-01 00:35 stat
lrwxrwxrwx 1 root root 0 1970-01-01 00:35 subsystem -> ../../../../../../../../class/block
-rw-r--r-- 1 root root 4096 1970-01-01 00:00 uevent
@xxx:/sys/devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001/block/mmcblk0 #
关于这些参数的意义,可以参照:
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-block
https://www.kernel.org/doc/Documentation/block/stat.txt
查看各个分区的大小
在/sys/devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001/block/
目录下,有几个以mmcblk0
开头的目录名,这里面包含了分区的起始和结束的block地址。比如说,mmcblk0p2
挂载出来的/data
分区。
- 获取分区的大小:
1
2
524288
读取到分区的size为524288 block大小,1个block为512字节,那么这个/data
分区的大小为:524288 block * 512Bytes/block = 268435456Bytes = 256MB
- 获取到分区的起始地址:
1
2
1423360
读取eMMC控制器的相关寄存器
eMMC控制器厂商会提供一个寄存器概要信息,比如说美光家的eMMC的spec,详见:http://www.chinaflashmarket.com/Uploads/file/2015/12/25/Micron_emmc_v50.pdf
如果想要更进一步了解每个寄存器各个bit的详细信息,需要参考JEDEC
提供的JESD84-B50-1
文档。
在/sys/devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001/
目录下可以读取到cid
、csd
、dsr
、ocr
、寄存器的值,如下:
1 | @xxx:/sys/devices/platform/6b030000.esdhc/mmc_host/mmc0/mmc0:0001 |
读取ext_csd寄存器
这个寄存器属于csd
扩展出来的,需要将debugfs
挂载出来才能读取到。首先执行:mount -t debugfs none /sys/kernel/debug/
,
在/sys/kernel/debug/mmc0
目录下,cat ios
可以查看这个eMMC控制器的工作频率和位宽基本信息。
1 | @xxx:/sys/kernel/debug/mmc0 |
然后在/sys/kernel/debug/mmc0/mmc0\:0001/
目录下就可以看到ext_csd
寄存器了。
1 | @xxx:/sys/kernel/debug/mmc0/mmc0:0001 |
cat ext_csd
可以得到一个512字节大小的数据,如下
1 | @xxx:/sys/kernel/debug/mmc0/mmc0:0001 |
当然这样看很难看,无法很快的确认寄存器中某些位的值。因此,网上就有个小哥写了个python脚本来解析这512字节的数据,以常人可以理解的格式进行解析。详见:https://blog.kylemanna.com/linux/parse-emmc-extended-csd-ecsd-registers-with-python/
输出的格式如下:
1 | victor @victor-HP:~/ work2/cal_time$ python analysis_ext_csd.py |
Python的内容如下:
1 | #!/usr/bin/env python |