手机U盘模式MSG

这篇具有很好参考价值的文章主要介绍了手机U盘模式MSG。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 通用概念
1.1 原理分析
将手机以U盘模式(Mass Storage Gadget,MSG)通过OTG线连到Android手机上(as host),切换手机的USB模式为USB存储,此时我们在Android手机上查看文件管理器是没有外接手机的SD卡存储目录的。

现象是只有/dev/block/sda,但是没有/dev/block/sda1。


原因分析如下(Ubuntu也有该issue):
由于Android是将形如 /dev/block/mmcblk0p1 写到USB的 /sys/class/android_usb/android0/f_mass_storage/lun0/file 里面,并且 /dev/block/mmcblk0p1 只有PBR扇区而没有MBR扇区,导致Linux内核 kernel/block/partitions/msdos.c 分析该分区时没有找到MBR以致产生分区节点失败,为了解决这一问题可以在函数int msdos_partition(struct parsed_partitions *state) 中的 p = (struct partition *) (data + 0x1be)之前添加如下形式的代码:

if (state->bdev->bd_disk->part0.nr_sects > 0) {
    state->parts[1].from = 0;
    state->parts[1].size = state->bdev->bd_disk->part0.nr_sects;
}

即可解决该问题(备注:Android 8.0后只需要修改external/gptfdisk/sgdisk.cc,不再需要修改kernel代码)。

该patch的另外一个应用就是USB-ZIP和USB-FDD格式的安装U盘。原因是:USB-ZIP和USB-FDD会将U盘的第一个扇区格式化成DOS.PBR而不是DOS.MBR。
USB-FDD和USB-ZIP的来历:软盘的容量小,没有分区结构,所以软盘是没有MBR的,整个软盘只有一个分区,第一个扇区就是PBR。

1.2 创建USB-FDD或者USB-ZIP格式U盘步骤
1)Android上:dd if=/dev/zero of=/dev/block/sda bs=512 count=4
2)Windows上:快速格式化该U盘,这个U盘就只有PBR扇区而没有MBR扇区

2 Windows文件系统
2.1 FAT32分配单元大小
FAT32分配单元大小 - 簇的大小,譬如16KB,命令chkdsk f:\

3 Linux文件系统
3.1 GRUB简介
GRUB镜像组成:
- GRUB.MBR(boot.img)
- 硬盘扇区offset 1 到offset 62放置GRUB的core.img
- /boot分区的boot/grub/grub.cfg

3.2 block设备性能分析工具
CONFIG_BLK_DEV_IO_TRACE
@ external/e2fsprogs/debugfs
@ external/blktrace
需要加下面的声明在blkparse.c,否则编译出错。
extern int strverscmp (const char *s1, const char *s2);

blktrace -d /dev/block/sda -o - | blkparse -i - -o /data/blk.parsed

根据扇区offset找到具体的文件:
ls -l /dev/block
debugfs -R "stats" /dev/block/sda1 |grep "Block size"

BLKNO=SECTOR_OFFSET/8
debugfs -R "icheck $BLKNO" /dev/block/sda1

GOT THE INODE NUMBER FROM THE LAST CMD: 9
debugfs -R "ncheck 9" /dev/block/sda1

3.3 ext4调试步骤
@ external/e2fsprogs/misc/dumpe2fs.c

1)找到inode号,stat /data/mytest.txt,磁盘上的inode结构体是struct ext4_inode
2)dumpe2fs /dev/block/mmcblk1p19,从超级块中获得每个块组有多少个inode数目、block size、以及inode的大小(一般256Bytes)
3)块组偏移 = inode号 / 每个块组的inode数目
4)块组内inode偏移 = inode号 % 每个块组的inode数目
5)inode在块组内哪个块which_block,块组内inode偏移 = (4096 / 256) * which_block + 剩余的inode数目residue_inode
6)dumpe2fs /dev/block/mmcblk1p19,获得对应块组Inode table块偏移
7)dd if=/dev/block/mmcblk1p19 bs=4096 skip=<块组Inode table块偏移 + which_block> |busybox hexdump -Cv -n 4096
8)从超级块中可以获得每个inode大小一般是256Bytes,从上一步dump出来的数据中偏移residue_inode * 256Bytes,找到对应的256字节内容
9)i_size在inode中偏移为4字节,大小为4字节;i_block[0]在inode中的偏移为40(0x28)字节,大小为4字节,如果i_block[0]的前2个字节是0xf30a,说明使用了extent tree
10)extent tree包含3种结构:ext4_extent_header(12byte),ext4_extent_idx(12byte),ext4_extent(12byte)
11)查看ext4_extent_header的第6个字节(偏移46和47字节)的eh_depth,如果depth=0,则header后跟一个ext4_extent结构,该结构指向一个数据块
12)读出偏移(0x38,0x39)处的块计数,LE模式
13)读出偏移(0x40,0x41)处的块地址的HI,偏移(0x42,0x43,0x44,0x45)处的块地址的LO,都是LE模式,组成完整的文件起始48位块地址start_block_no
14)查看文件第一个块的内容:dd if=/dev/block/mmcblk1p19 bs=4096 skip=<start_block_no> |busybox hexdump -Cv -n 4096

3.4 Linx command
fdisk -l /dev/block/sda
fdisk -l mbr.img
gdisk -l gpt.img

4 USB MSC
4.1 LUN
LUN - 表示一块硬盘,可以是物理上的,也可以是逻辑上,譬如Android MSG的一个mmcblk0p1分区,命令lsscsi查看
lshw
lsscsi - 返回值Host:Controller:Target:LUN
lscpu
lsusb
lsblk

4.2 SCSI CDB
31个字节长度的USB CBW报文的前15个字节是固定的头,从偏移15开始到偏移30结束是16个字节长度的SCSI CDB。
13个字节长度的USB CSW的最后一个字节表示SCSI CDB执行状态,0表示成功,1或者2表示失败。

4.3 Linux内核SCSI硬盘盘符分配
- usb层和scsi层传自定义参数
通过struct Scsi_Host {}

4.4 TUR执行流程
4.4.1 methodology
drivers/usb/storage/scsiglue.c
queuecommand_lck()
add dump_stack() to find who calls TUR.

4.4.2 enable TUR polling
echo 2000 > \
/sys/module/block/parameters/events_dfl_poll_msecs

dfl means default.

4.4.3 Construct TUR Fail CDB
If the device is not ready, the bCSWStatus field in CSW is set to 0x01 (command failed). When device reports 00h in the bCSWStatus field in CSW, which indicates that media is ready.

// srb->sense_buffer
unsigned char
usb_stor_sense_media_notpresent[18] = {
    [0] = 0x70,
    [2] = 2,           /* Sense Key */
    [7] = 0x0a,
    [12] = 0x3a,   /* ASC */
    [13] = 0,         /* ASCQ */
};

4.5 REQUEST_SENSE auto_sense
USB host MSC(transport.c)每发送一个命令后,都会检测设备返回的CSW的状态值是否为0(Good Status),如果不为0,则USB host MSC马上发送REQUEST_SENSE命令,获取18字节的出错信息,并保存在srb->sense_buffer中供SCSI层分析。

drivers/usb/storage/transport.c
usb_stor_invoke_transport()
srb->sense_buffer

5 Abbreviations
ARC:Argonant RISC Core
AT91SAM9260:SAM means Smart ARM-based Microcontroller
ATMEL SAMBA:ATMEL Smart ARM-based Microcontroller Boot Assistant
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
MSG:Mass Storage Gadget
Quirks:the attributes of a device that are considered to be noncompliant with expected operation
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.文章来源地址https://www.toymoban.com/news/detail-510608.html

到了这里,关于手机U盘模式MSG的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理笔记11:自上而下语法分析(1)基础概念、左递归和公共左因子处理、递归下降分析(咕咕咕)

    词法分析,是把源程序分析成记号流,识别其中的单词。 语法分析,是要分析词法分析产生的记号流中的语法结构是否正确——对词法分析得到的记号流进行分析,以确认其是不是一个可以由我们定义好的文法推出来的句子。如果语法结构正确,语法分析器最终要为输入序列

    2024年02月11日
    浏览(30)
  • 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第三章 分布式文件系统HDFS

    大数据要解决数据存储问题,所以有了分布式文件系统(DFS),但可能不符合当时的一些应用需求,于是谷歌公司开发了GFS(Google file System)。GFS是闭源的,而HDFS是对GFS的开源实现。 1.GFS和DFS有什么区别? GFS(Google File System)和DFS(Distributed File System)都是分布式文件系统,

    2024年02月03日
    浏览(59)
  • 深入 K8s 网络原理(一)- Flannel VXLAN 模式分析

    这周集中聊下 K8s 的集群网络原理,我初步考虑分成3个方向: Pod-to-Pod  通信(同节点 or 跨节点),以 Flannel VXLAN 模式为例; Pod/External-to-Service  通信,以 iptables 实现为例; Ingress  原理,以 NGINX Ingress Controller 实现为例; 其他:(到时候看心情)Flannel host-gw 模式,Calico,…

    2024年01月17日
    浏览(30)
  • spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

    😀前言 本片文章是spring 容器结构/机制debug分析和几个重要概念以及IOC 的开发模式 🏠个人主页:[尘觉主页](https://blog.csdn.net/apple_67445472?type=blog) 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 在csdn获奖荣誉: 🏆csdn城市之星2名

    2024年02月02日
    浏览(50)
  • Rust学习-通用编程概念

    静态类型(statically typed)的语言,必须在编译期知道所有变量的类型 允许使用类型后缀来指定类型,例如 57u8 数字字面量还可以使用 _ 作为可视分隔符以方便读数,如 1_000 使用 --release 参数进行发布(release)模式构建时,Rust 不检测会导致 panic 的整型溢出,Rust 会进行一种

    2024年02月13日
    浏览(27)
  • Rust通用编程概念

    变量与可变性 在Rust中,声明变量使用let,并且默认情况下,声明的变量是不可变的,要使变量可变需要在声明变量时,在变量前面加上mut。如下: 如果将上述代码中的mut去掉,那么在编译代码时就会报错,报错结果就是不能对不可变的变量进行二次赋值

    2024年02月08日
    浏览(29)
  • 通用爬虫的概念简述

    通用爬虫(General Purpose Web Crawler或Scalable Web Crawler)是一种网络爬虫,其设计目标是对整个互联网或尽可能广泛的网络空间进行数据抓取。通用爬虫主要用于搜索引擎构建其庞大的网页索引数据库,从互联网中自动爬取、下载网页内容,形成网页的海量集合,以便后续对这些

    2024年04月12日
    浏览(20)
  • 数据抓取(四):获取手机通用信息

    总篇:数据抓取:抓取手机设备各种数据 分篇(一):【数据抓取(一)】手机通讯录数据获取 分篇(二):数据抓取(二)定位方案:地址信息的获取 分篇(三):数据抓取(三):免权限获取所有安装的应用程序信息(系统和非系统) 在应用中,我们有时候需要获取手

    2024年02月03日
    浏览(25)
  • 【概念】区块链中账本是什么?通用区块链平台账本概念介绍,一个谁都能看懂的账本概念

    目录 前言 举个例子 账本在不同链中担任什么角色 联盟链 公有链 私有链 随着区块链的发展,目前国内也掀起了一阵区块链的热潮,无论是金融、信任、交易、溯源等领域都是非常受欢迎,慢慢的我们也将成为第一个吃螃蟹的人,本篇文章主要是与大家一起聊聊什么是区块链

    2023年04月10日
    浏览(29)
  • 手机通用便签APP哪个比较好用?

    手机通用便签APP哪个比较好用?随着现代科技的不断发展,手机的更新换代频率是比较快的,基本两三年就会换新手机。其中Android和iOS系统为手机主要使用系统,有些用户在使用一个系统腻了后,通常想更换另一个系统的品牌手机使用,更换不同系统的手机后,最让人头疼的

    2024年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包