emmc 调试

本文深入探讨eMMC存储设备的工作原理,包括分区信息的传递过程、兼容性方案、工作负载计算方式及其日志解读等内容,旨在帮助读者理解eMMC在移动设备中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、/dev/block

root@:/dev/block #ls

bootdevice

mmcblk0

mmcblk0p1

mmcblk0p10

…….

mmcblk0p18

mmcblk0p19

mmcblk0p2

mmcblk0p20

……

mmcblk0p29

mmcblk0p3

mmcblk0p30

……

mmcblk0rpmb

platform


LK获取分区信息 
smem_ptable_init()SMEMentry SMEM_AARM_PARTITION_TABLE中读取分区信息,保存在smem_ptable结构中(hard coded)。调用smem_add_modem_partitions()smem_ptable中的内容解析出来保存在flash_ptable

将分区信息传递给kernel 
Lk将分区信息打包成atag形式传递给kernel,让kernel知道分区信息。 
target_atag_mem()->flash_get_ptable() 

Kernelget the partition info and add partition: 
blkdev_get_by_path()->blkdev_get()->__blkdev_get()-> 
rescan_partitions()->add_partition()


/dev/block/bootdevice/by-name/xxx,目录及后面的链接是在userspaceinit进程中创建出来的,init收到增加新分区的uevent事件后,构造出以上by-name下的文件。

Code:system/core/init/devices.c

Function:parse_platform_block_device(structuevent*uevent

二、/sys/class/mmc_host/mmc0/mmc0:0001

root@:/sys/class/mmc_host/mmc0/mmc0:0001#ls

block

cid

csd

date

driver

enhanced_area_offset

enhanced_area_size

erase_size

fwrev

hwrev

manfid

name

oemid

power

preferred_erase_size

prv

raw_rpmb_size_mult

rel_sectors

runtime_pm_timeout

serial

subsystem

type

uevent

三、/sys/block/mmcblk0

root@:/sys/block/mmcblk0 #ls

alignment_offset

bdi

bkops_check_threshold

capability

dev

device

discard_alignment

ext_range

force_ro

holders

inflight

mmcblk0p1

mmcblk0p10

……

mmcblk0p9

mmcblk0rpmb

no_pack_for_random

num_wr_reqs_to_start_packing

power

queue

range

removable

ro

Size   // emmc size = Size * 512Btye

slaves

stat

subsystem

uevent

四、/proc/partitions

root@:/proc # cat partitions                                           

major minor  #blocks  name

 253        0    486188 zram0

 179        0  15267840 mmcblk0    //emmc size,单位KB

 179        1     65536 mmcblk0p1

 179        2       512 mmcblk0p2

 179        3       512 mmcblk0p3

179       15         16 mmcblk0p15

 179       16     20480 mmcblk0p16

 ……

179       26    2097152 mmcblk0p26

 179       27       512 mmcblk0p27

 179       28         32 mmcblk0p28

 179       29     65536 mmcblk0p29

 179       30    268288 mmcblk0p30

 179       31  12312559 mmcblk0p31

 179       32      4096 mmcblk0rpmb

五、多种size规格eMMC兼容方案一:利用文件系统自身resize功能

mountdata之前,比较super block的size与block deviceszie,不一样就去resize。



六、多种size规格eMMC兼容方案之二:第一次开机format data分区

如果使用的filesystem没有resize功能,比如f2fs, fat32等。

那只能采用此种办法啦:

不下载userdata.img

mountdata之前,fs_mgrservice判断是否会第一次开机,如果是,则启动format

system/core/fs_mgr


七、存储空间保护,防止空间满导致系统启动异常

内置sd卡保护:

fuse增加保护,内置sd卡最大可写容量data total size-reserved(50MB)

Code:system/core/sdcard/sdcard.c

#define LIMIT_SDCARD_SIZE

MTP保护:

Mtpservice增加保护,PC可写的最大可写容量internalsdcardfs total size-reserved

code:frameworks/base/services/Java/com/android/server/MountService.java

FileSystem保护:

Ext4文件系统增加保护,保留16MB给uid<= 10010的使用

Code:kernel/fs/ext4/balloc.c

init.{platform}.rc:exec /system/bin/tune2fs -Ohas_journal -u 10010 -r 4096 /dev/block/platform/mtk-msdc.0/by-name/userdata 

resv_clusters: -r 4096=4096blocks=4096*4096=16MB

dirty_clusters: default 16M当flags有EXT4_MB_USE_RESERVED才可写

sbi->s_resuid:-u10010

sbi->s_resgid:tune2fs没有传递default0





八、eMMCworkload & performance log

1.Workload是根据什么计算出来的呢? 
500ms内花在io上的时间比例 
/kernel/drivers/mmc/card/block.c 
static intmmc_blk_issue_rw_rq(structmmc_queue *mq,struct request *rqc) 
xlog_printk(ANDROID_LOG_DEBUG,"BLOCK_TAG", "mmcqd:%d Workload=%d%%, duty %lld,period %lld00, req_cnt=%d \n",mmcqd[idx],t_percent,t_usage,t_period,mmcqd_rq_count[idx]); 

2.能否知道主要哪个app占得workload? 
/kernel/drivers/mmc/card/block.c 
static intmmc_blk_issue_rw_rq(structmmc_queue *mq,struct request *rqc) 
sprintf (g_pid_logger[index].pid_buffer+i*37,"{%05d:%05d:%08d:%05d:%08d}",g_pid_logger[index].pid_logger[i],g_pid_logger[index].pid_logger_counter[i],g_pid_logger[index].pid_logger_length[i],g_pid_logger[index].pid_logger_r_counter[i],g_pid_logger[index].pid_logger_r_length[i]); 

如 {26626:00000:00000000:00878:03596288}含义:pid为26626的进程500ms内read3512KB(03596288)的数据,write0KB的数据。 
可以查看某段时间内,各个进程读写的情况,进而判断是哪个进程占用的worload比较高; 


3. 当workload比较高的时候,log打印read、write也比较高,能否说明emmc是没有问题的? 
<6>[16656.919474] (5)[142:mmcqd/0][BLOCK_TAG]mmcqd:142 Workload=63%, duty 317163907, period 500889000, req_cnt=1426

<6>[16656.919483] (5)[142:mmcqd/0][BLOCK_TAG] mmcqd:142 WriteDiversity=5553653 sectors offset, req_cnt=12, break_cnt=0, tract_cnt=0,bit_cnt=0

<6>[16656.919534] (0)[142:mmcqd/0][BLOCK_TAG] mmcqd:142 ReadDiversity=607567 sectors offset, req_cnt=1414, break_cnt=0, tract_cnt=0,bit_cnt=0 

<6>[16656.919565] (0)[142:mmcqd/0][BLOCK_TAG] mmcqd:142 WriteThroughput=69222 kB/s, size: 692224 bytes, time:10 ms 

<6>[16656.919617](0)[142:mmcqd/0][BLOCK_TAG] mmcqd:142 Read Throughput=93819 kB/s, size:28708864 bytes, time:306 ms


是的。从log看,eMMC的performance还可以。


九、eMMC ext_csd

root@:/sys/kernel/debug/mmc0/mmc0:0001# cat ext_csd                   


十、eMMC HS200 & HS400


十一、eMMC cache

cache对emmc write performance影响很大,使能它。

### Swin Transformer 论文精读:Hierarchical Vision Transformer Using Shifted Windows Swin Transformer 是一种基于视觉的分层 Transformer 模型,其核心创新在于通过 **Shifted Window-based Self-Attention** 实现了线性计算复杂度,同时能够生成多尺度特征表示。这种方法在图像分类、目标检测和语义分割等任务中取得了显著的性能提升 [^2]。 #### 核心架构概述 Swin Transformer 的整体结构分为多个阶段(Stage),每个阶段包含多个 Swin Transformer Block。这些块使用 **窗口化自注意力机制** 和 **移位窗口策略** 来实现高效计算并捕捉长距离依赖关系。 - **分层特征提取** 类似于传统卷积神经网络(如 ResNet),Swin Transformer 采用分层设计来逐步降低空间分辨率并增加通道维度。这种设计允许模型从局部到全局地构建特征表示。 - **窗口划分与移位窗口机制** 在每个 Swin Transformer Block 中,输入特征图被划分为不重叠的窗口,并在这些窗口内执行自注意力计算。为了增强跨窗口的信息交互,在下一个 Block 中对窗口进行移位操作(Shifted Windows)。这种方式既减少了计算量,又保持了模型对全局信息的感知能力 [^1]。 ```python # 窗口划分伪代码示例 def window_partition(x, window_size): B, H, W, C = x.shape # 将图像划分为多个窗口 x = tf.reshape(x, shape=[B, H // window_size, window_size, W // window_size, window_size, C]) windows = tf.transpose(x, perm=[0, 1, 3, 2, 4, 5]) return tf.reshape(windows, shape=[-1, window_size, window_size, C]) # 移位窗口伪代码 def shifted_window_attention(x, window_size, shift_size): B, H, W, C = x.shape # 对特征图进行滚动操作以实现窗口移位 x = tf.roll(x, shift=(-shift_size, -shift_size), axis=(1, 2)) return window_partition(x, window_size) ``` #### 自注意力机制优化 传统的 Vision TransformerViT)在整个图像上应用自注意力机制,导致计算复杂度为 $O(n^2)$,其中 $n$ 是图像块的数量。而 Swin Transformer 通过将注意力限制在局部窗口内,将复杂度降低到 $O(n)$,使其适用于高分辨率图像处理 [^4]。 此外,移位窗口机制确保了相邻窗口之间的信息流动,从而避免了局部注意力带来的信息隔离问题。这种设计使得 Swin Transformer 能够在保持计算效率的同时实现全局建模能力。 #### 实验结果与性能优势 Swin Transformer 在多个视觉任务中表现出色: - **ImageNet 分类任务**:Swin-Tiny、Swin-Small、Swin-Base 和 Swin-Large 四种变体均在 ImageNet-1K 上实现了优于其他 Transformer 主干网络的 Top-1 准确率。 - **COCO 目标检测**:在 COCO 数据集上,Swin Transformer 在 Faster R-CNN 框架下达到了 SOTA 性能,mAP 超过之前的最佳方法。 - **ADE20K 语义分割**:在 ADE20K 数据集上,Swin Transformer 作为编码器也取得了领先的 mIoU 指标 [^2]。 #### 消融实验分析 论文还进行了详细的消融研究,验证了以下几个关键组件的有效性: - **窗口大小的影响**:较大的窗口有助于捕捉更广泛的上下文,但会增加计算开销。 - **移位窗口的重要性**:实验证明,移位机制可以显著提升模型性能,尤其是在长距离依赖任务中。 - **不同层级的设计**:通过对比不同层级深度和通道配置,论文展示了如何平衡精度与效率 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值