Linux/GParted はパーティション表を表示できますが、dd bs=512 count=1 は表示できません。

Linux/GParted はパーティション表を表示できますが、dd bs=512 count=1 は表示できません。

MBR形式のSDカードがあり、Linuxシステム(xubuntu 12.04)に接続すると、パーティションをマウントしてファイルシステムを解析できます(GPartedも可能)。ただし、ddを使用してデバイスからMBRを読み取ろうとすると、偽のデータがたくさん提供されます。

dd が MBR を読み取れない場合、Linux/GParted が MBR を読んで理解する方法を誰でも明らかにできますか?彼らはデータを取得するために別の方法を使用しますか?IEはopen()、read()を行うことはできません。

DDコマンドは次のとおりです。

dd if=/dev/sdb of=mbr.bin bs=512 count=1

DD出力は次のとおりです。

1+0 records in
1+0 records out
512 bytes transferred in 0.000786 secs (651345 bytes/sec)

mbr.bin ダンプはhexdump -C mbr.bin次のとおりです。

00000000  04 16 41 53 4d 49 2d 53  44 03 00 00 00 00 16 f1  |..ASMI-SD.......|
00000010  00 7f 00 32 1f 5b 80 00  36 db bf bf 96 c0 00 01  |...2.[..6.......|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  6f 00 00 10 00 00 02 2e  00 00 00 00 00 00 00 00  |o...............|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

ベストアンサー1

カードにMBR(マスターブートレコード)がありません。 16進ダンプがある場合は、オフセット0x1C0と最後に55aa少なくとも1つのパーティション項目が提供されます。

すべてのパーティション表が最初の512バイトにデータを配置するわけではありません。これ偽データあなたが見るのは(1/1)SDカードのSIDとCSDレジスタです。しかし、表面的に、これはカードに関する正しいデータではありません。(旧1MiB 2001モデルではない場合)

最初の16バイトは次のとおりです。

CID Register:
----------------------------------------------------------------------------
Manufacturer ID       (MID): 04               => (Transcend)
OEM/Application ID    (OID): 16 41            =  ?A
Product name          (PNM): 53 4d 49 2d 53   =  SMI-S
Product revision      (PRV): 44               =  0100 0100 => 4.4
Product serial number (PSN): 03 00 00 00
reserved               (-) : 00 >> 4          = 0000b
Manufacturing date    (MDT): (00 & 0x0f)|0x16 = 0001b,0110b => 2000+1,6=> Jun 2001
CRC7 checksum         (CRC): 1f >> 1          = 120
always 1               (1) : 1f & 1           = 1

次の16バイト(少なくともその一部):

CSD Register:
----------------------------------------------------------------------------
CSD Structure        (CSD_STRUCTURE): 00 >> 6  = 00b => CSD Version 1.0
reserved                         (-): 00 & 3f  = 00 0000b
Data read access time 1       (TAAC): 7f = 1111b => time val 8.0, 111b => 7=10ms
Data read access time 2       (NSAC): 00
Max. data transfer rate (TRAN_SPEED): 32 = 0110,010 time val 2.5, 2=10Mbit/s 25MHz
Card command classes           (CCC): 1f << 4 | 5b >> 4 = 0x1f5

...
Device size (C_SIZE) : (0x80 & 0x03) << 0xa | 00h | 36 >> 6 : 0

Max. read  current @VDD min (VDD_R_CURR_MIN) : 110 => 60mA
Max. read  current @VDD max (VDD_R_CURR_MAX) : 110 => 80mA
Max. write current @VDD min (VDD_W_CURR_MIN) : 110 => 60mA
Max. write current @VDD max (VDD_W_CURR_MAX) : 110 => 80mA
Device size multiplier         (C_SIZE_MULT) : 111 => 2^(7 + 2) = 512
Erase single block enable     (ERASE_BLK_EN) : 0
Erase sector size              (SECTOR_SIZE) : 1111111 => 127 + 1 = 128
Write protect group size       (WP_GRP_SIZE) : 0111111 =>  63 + 1 = 64

MULT      = 2^(C_SIZE_MULT + 2)  = 2^(7 + 2) = 512
BLOCKNR   = (C_SIZE + 1) * MULT  = 1 * 512   = 512
BLOCK_LEN = 2^READ_BL_LEN        = 2^11      = 2048

memory capacity = 
BLOCKNR * BLOCK_LEN = 512 * 2048 = 1048576 bytes = 1024 KiB = 1 MiB

また、CSD レジスタの CRC7 チェックが正しくありません。娯楽から残された古いデータかもしれません。

これらのレジスタなどは、さまざまなコマンドを介してカードから直接クエリできます。これは、モジュールドライバ、カードハブなどによって行われる。


Stephane Chazelas、slmなどが提供するコマンドで何を見つけたかを見るのは興味深いでしょう。

おすすめ記事