Difference between revisions of "Partitions"

From Vita Development Wiki
Jump to navigation Jump to search
 
(28 intermediate revisions by 6 users not shown)
Line 1: Line 1:
All devices on the Vita are partitioned the same way. Logical block size is 512 bytes and the first logical block is the [[Partitions#Master Block|master block]] which defines the partition table along with other information. Because of block level encryption, the master block is also encrypted along with everything else and cannot be seen if the device is dumped from an external dumper.
+
All devices on the PS Vita are partitioned the same way. Logical block size is 512 bytes and the first logical block is the [[Partitions#Master Block|master block]] which defines the partition table along with other information.
 +
 
 +
== Types ==
 +
 
 +
<source lang="C">
 +
typedef struct SceMbrPartEntry { // size is 0x11-bytes
 +
unsigned int start_lba;
 +
unsigned int n_sectors;
 +
unsigned char id;
 +
unsigned char type;
 +
unsigned char flag;
 +
unsigned short acl;
 +
unsigned int unused;
 +
} __attribute__((packed)) SceMbrPartEntry;
 +
 
 +
typedef struct SceMbrParts { // size is 0x110-bytes
 +
SceMbrPartEntry entries[0x10];
 +
} __attribute__((packed)) SceMbrParts;
 +
 
 +
typedef struct SceMbr { // size is 0x200-bytes
 +
char magic[0x20];
 +
unsigned int version;
 +
unsigned int n_sectors;
 +
char unused[8];
 +
 
 +
unsigned int loader_start;
 +
unsigned int loader_count;
 +
unsigned int current_bl_lba;
 +
unsigned int bl_bank0_lba;
 +
 
 +
unsigned int bl_bank1_lba;
 +
unsigned int current_os_lba;
 +
char unused2[8];
 +
SceMbrParts parts;
 +
char unused3[0x6E];
 +
char unused4[0x30];
 +
unsigned short signature;
 +
} __attribute__((packed)) SceMbr;
 +
</source>
  
 
== Master Block ==
 
== Master Block ==
 +
 
The first block (512 bytes) provides a partition table as well as auxiliary information to the block management drivers.
 
The first block (512 bytes) provides a partition table as well as auxiliary information to the block management drivers.
 +
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Offset
 
! Offset
 
! Size
 
! Size
Line 11: Line 50:
 
| 0x0
 
| 0x0
 
| 0x20
 
| 0x20
| Magic string "<code>Sony Computer Entertainment Inc.</code>"
+
| magic. Magic string "<code>Sony Computer Entertainment Inc.</code>"
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x4
 
| 0x4
| Version ? (0x3)
+
| version. Usually 3.
 
|-
 
|-
 
| 0x24
 
| 0x24
 
| 0x4
 
| 0x4
| Size of device in blocks
+
| n_sectors. Size of device in blocks (ex: 0x70A000, 0x71A000: bigger ur0:)
 
|-
 
|-
 
| 0x28
 
| 0x28
| 0x28
+
| 0x8
| ?
+
| unused.
 +
|-
 +
| 0x30
 +
| 0x4
 +
| loader_start. Second Loader (second_loader.enp) offset in blocks
 +
|-
 +
| 0x34
 +
| 0x4
 +
| loader_count. Second Loader (second_loader.enp) size in blocks
 +
|-
 +
| 0x38
 +
| 0x4
 +
| current_bl_lba. Active SLB2 offset in blocks (must be either bank0 or bank1)
 
|-
 
|-
| 0x50
+
| 0x3C
| 0x11 - 0x110
+
| 0x4
| [[Partitions#Partition Entries|Partition entries]] (there are 0x10 partitions at most (derived from code and data structure of SdStor driver))
+
| bl_bank0_lba. SLB2 bank0 offset in blocks (default: 0x4000)
 
|-
 
|-
| 0x160
+
| 0x40
| 0x5E
+
| 0x4
| unknown (zeros)
+
| bl_bank1_lba. SLB2 bank1 offset in blocks (default: 0x6000)
 
|-
 
|-
| 0x1BE
+
| 0x44
| 0x10
+
| 0x4
| unknown (may contain some data) (In standard MBR this area corresponds to Partition Entry)
+
| current_os_lba. Active os0 offset in blocks (ex: 0x8000, 0x10000)
 
|-
 
|-
| 0x1CE
+
| 0x48
| 0x10
+
| 0x8
| unknown (must contain zeros) (In standard MBR this area corresponds to Partition Entry)
+
| unused.
 
|-
 
|-
| 0x1DE
+
| 0x50
| 0x10
+
| 0x110 (0x11 per partition * 0x10 partitions)
| unknown (must contain zeros) (In standard MBR this area corresponds to Partition Entry)
+
| partition_table. [[Partitions#Partition Entries|Partition entries]] (there are 0x10 partitions at most (derived from code and data structure of SdStor driver))
 
|-
 
|-
| 0x1EE
+
| 0x160
| 0x10
+
| 0x9E
| unknown (must contain zeros) (In standard MBR this area corresponds to Partition Entry)
+
| unused.
 
|-
 
|-
 
| 0x1FE
 
| 0x1FE
 
| 0x2
 
| 0x2
| 0xAA55 signature
+
| signature. MBR signature: 0xAA55
 
|}
 
|}
  
 
== Partition Entries ==
 
== Partition Entries ==
Each partition entry is 17 bytes long. Offset 0x0 means end of table.
+
 
 +
Each partition entry is 17 bytes long.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
 
 
! Offset
 
! Offset
 
! Size
 
! Size
Line 64: Line 116:
 
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| Partition offset (blocks)
+
| start_lba. Partition offset (blocks)
 
|-
 
|-
 
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| Partition size (blocks)
+
| n_sectors. Partition size (blocks)
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x1
 
| 0x1
| [[Partitions#Partition Code|Partition code]]
+
| part_id. [[Partitions#Partition ID|Partition ID]]
 
|-
 
|-
 
| 0x9
 
| 0x9
 
| 0x1
 
| 0x1
| [[Partitions#Partition Type|Partition type]]
+
| part_type. [[Partitions#Partition Type|Partition Type]]
 
|-
 
|-
 
| 0xA
 
| 0xA
 
| 0x1
 
| 0x1
| [[Partitions#Partition Active|Partition active]]
+
| part_flag. [[Partitions#Partition Flag|Partition Flag]] (boolean)
 
|-
 
|-
 
| 0xB
 
| 0xB
| 0x4
+
| 0x2
| Flags ? seen: <code>0x00000F1F</code>, <code>0x00000F0F</code>, <code>0x00000FFF</code>, <code>0x??????55</code>, <code>0x00000F4F</code>
+
| acl. Access control lists. Seen: <code>0x0555</code>, <code>0x0F0F</code> (sloader, os, vsh) -> r--, <code>0x0F1F</code> (idstor) -> ---, <code>0x0F4F</code>, <code>0x0FFF</code> (sysdata, vtrm, vshdata, updater, pidata, user) -> rwx
 
|-
 
|-
 
| 0xF
 
| 0xF
| 0x2
+
| 0x4
| ?
+
| unused
 
|}
 
|}
=== Partition Code ===
+
 
The partition code uniquely identifies the partition to its function. It is related to [[SceKernelModulemgr#Partition Code]] but the meaning of the code is still unknown.
+
=== Partition ID ===
 +
 
 +
The Partition ID uniquely identifies the partition to its function. It is related to [[SceKernelModulemgr#Partition ID]].
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
+
! Partition ID
! Code
+
! Block Device
! Name
+
! Mountpoint
! Location Seen
+
! Physical Storage Holder
 
! Description
 
! Description
 
|-
 
|-
 
| 0x0
 
| 0x0
 +
|
 
|  
 
|  
 
|  
 
|  
Line 105: Line 161:
 
|-
 
|-
 
| 0x1
 
| 0x1
 +
| "idstor"
 
|  
 
|  
| Internal
+
| Internal Flash
| first eMMC partition, some data, [[IdStorage]]?
+
| [[IdStorage]]
 
|-
 
|-
 
| 0x2
 
| 0x2
 +
| "sloader"
 
|  
 
|  
| Internal
+
| Internal Flash
| [[SLB2]] [[Boot Sequence|Boot loaders]]
+
| [[SLB2]] [[Boot Sequence#Boot_Partition|Boot loaders]]
 
|-
 
|-
 
| 0x3
 
| 0x3
 +
| "os"
 
| os0
 
| os0
| Internal
+
| Internal Flash
| Main OS partition, contains kernel [[Libraries#Kernel|libraries]]
+
| Main OS partition, contains kernel [[Modules|modules]]
 
|-
 
|-
 
| 0x4
 
| 0x4
 +
| "vsh"
 
| vs0
 
| vs0
| Internal
+
| Internal Flash
| Contains [[Libraries#System Applications|system applications]] & libraries
+
| [[Modules|System applications & libraries]]
 
|-
 
|-
 
| 0x5
 
| 0x5
 +
| "vshdata"
 
| vd0
 
| vd0
| Internal
+
| Internal Flash
 
| [[Registry]] and error history
 
| [[Registry]] and error history
 
|-
 
|-
 
| 0x6
 
| 0x6
 +
| "vtrm"
 
| tm0
 
| tm0
| Internal
+
| Internal Flash
| Unknown, has an empty folder <code>nphome</code>
+
| NpDrm, Marlin and DevKit/TestKit activations files
 
|-
 
|-
 
| 0x7
 
| 0x7
 +
| "user"
 
| ur0
 
| ur0
| Internal
+
| Internal Flash
 
| User resources, [[LiveArea]] cache, database, & other stuff
 
| User resources, [[LiveArea]] cache, database, & other stuff
 
|-
 
|-
 
| 0x8
 
| 0x8
 +
| "userext"
 
| ux0
 
| ux0
| Memory Card
+
| Internal Flash / Memory Card
 
| [[Memory Card]]
 
| [[Memory Card]]
 
|-
 
|-
 
| 0x9
 
| 0x9
 +
| "gamero"
 
| gro0
 
| gro0
 
| Game Card
 
| Game Card
| [[Game Card]]
+
| [[Game Card]] read-only area
 
|-
 
|-
| ?
+
| 0xA
 +
| "gamerw"
 
| grw0
 
| grw0
 
| Game Card
 
| Game Card
Line 155: Line 221:
 
|-
 
|-
 
| 0xB
 
| 0xB
 +
| "updater"
 
| ud0
 
| ud0
| Internal
+
| Internal Flash
| [[Updater]] copied here before reboot
+
| [[Updater]] application and PUP copied here before reboot
 
|-
 
|-
 
| 0xC
 
| 0xC
 +
| "sysdata"
 
| sa0
 
| sa0
| Internal
+
| Internal Flash
 
| Dictionary and font data
 
| Dictionary and font data
 
|-
 
|-
 
| 0xD
 
| 0xD
 +
| "mediaid"
 
|  
 
|  
| External
+
| Memory Card / Game Card
 
| Some data on [[Memory Card]] & [[Game Card]]
 
| Some data on [[Memory Card]] & [[Game Card]]
 
|-
 
|-
 
| 0xE
 
| 0xE
 +
| "pidata"
 
| pd0
 
| pd0
| Internal
+
| Internal Flash
| [[Welcome Park]] and welcome video
+
| [[Welcome Park]] and welcome video (Partition not present in Prototype units)
 +
|-
 +
| 0xF
 +
| "unused"
 +
|
 +
|
 +
| Unknown
 
|}
 
|}
  
 
=== Partition Type ===
 
=== Partition Type ===
The partition type code indicates the file system used or if there is no file system (for example, in the case of a [[SLB2]] archive).
+
 
 +
The partition type indicates the file system or if there is no file system (for example, in the case of a [[SLB2]] archive).
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
|-
+
! Partition Type
! Code
+
! Name
! Description
 
 
|-
 
|-
 
| 0x6
 
| 0x6
Line 192: Line 269:
 
|}
 
|}
  
=== Partition Active ===
+
=== Partition Flag ===
Some partitions (specifically <code>os0</code> and the boot loaders) have a shadow redundant copy. On update, only the inactive partition is written to and finally the active partition is swapped. For partitions that do not use this feature, this value is ignored.
+
 
 +
Some partitions (specifically <code>os0</code> and the boot loaders) have a shadow redundant copy. On System Software update, only the inactive partition is written to and finally the active partition is swapped. For partitions that do not use this activation feature, this value is ignored.
 +
 
  
 
[[Category:System]]
 
[[Category:System]]

Latest revision as of 11:49, 1 August 2023

All devices on the PS Vita are partitioned the same way. Logical block size is 512 bytes and the first logical block is the master block which defines the partition table along with other information.

Types

typedef struct SceMbrPartEntry { // size is 0x11-bytes
	unsigned int start_lba;
	unsigned int n_sectors;
	unsigned char id;
	unsigned char type;
	unsigned char flag;
	unsigned short acl;
	unsigned int unused;
} __attribute__((packed)) SceMbrPartEntry;

typedef struct SceMbrParts { // size is 0x110-bytes
	SceMbrPartEntry entries[0x10];
} __attribute__((packed)) SceMbrParts;

typedef struct SceMbr { // size is 0x200-bytes
	char magic[0x20];
	unsigned int version;
	unsigned int n_sectors;
	char unused[8];

	unsigned int loader_start;
	unsigned int loader_count;
	unsigned int current_bl_lba;
	unsigned int bl_bank0_lba;

	unsigned int bl_bank1_lba;
	unsigned int current_os_lba;
	char unused2[8];
	SceMbrParts parts;
	char unused3[0x6E];
	char unused4[0x30];
	unsigned short signature;
} __attribute__((packed)) SceMbr;

Master Block

The first block (512 bytes) provides a partition table as well as auxiliary information to the block management drivers.

Offset Size Information
0x0 0x20 magic. Magic string "Sony Computer Entertainment Inc."
0x20 0x4 version. Usually 3.
0x24 0x4 n_sectors. Size of device in blocks (ex: 0x70A000, 0x71A000: bigger ur0:)
0x28 0x8 unused.
0x30 0x4 loader_start. Second Loader (second_loader.enp) offset in blocks
0x34 0x4 loader_count. Second Loader (second_loader.enp) size in blocks
0x38 0x4 current_bl_lba. Active SLB2 offset in blocks (must be either bank0 or bank1)
0x3C 0x4 bl_bank0_lba. SLB2 bank0 offset in blocks (default: 0x4000)
0x40 0x4 bl_bank1_lba. SLB2 bank1 offset in blocks (default: 0x6000)
0x44 0x4 current_os_lba. Active os0 offset in blocks (ex: 0x8000, 0x10000)
0x48 0x8 unused.
0x50 0x110 (0x11 per partition * 0x10 partitions) partition_table. Partition entries (there are 0x10 partitions at most (derived from code and data structure of SdStor driver))
0x160 0x9E unused.
0x1FE 0x2 signature. MBR signature: 0xAA55

Partition Entries

Each partition entry is 17 bytes long.

Offset Size Information
0x0 0x4 start_lba. Partition offset (blocks)
0x4 0x4 n_sectors. Partition size (blocks)
0x8 0x1 part_id. Partition ID
0x9 0x1 part_type. Partition Type
0xA 0x1 part_flag. Partition Flag (boolean)
0xB 0x2 acl. Access control lists. Seen: 0x0555, 0x0F0F (sloader, os, vsh) -> r--, 0x0F1F (idstor) -> ---, 0x0F4F, 0x0FFF (sysdata, vtrm, vshdata, updater, pidata, user) -> rwx
0xF 0x4 unused

Partition ID

The Partition ID uniquely identifies the partition to its function. It is related to SceKernelModulemgr#Partition ID.

Partition ID Block Device Mountpoint Physical Storage Holder Description
0x0 empty partition
0x1 "idstor" Internal Flash IdStorage
0x2 "sloader" Internal Flash SLB2 Boot loaders
0x3 "os" os0 Internal Flash Main OS partition, contains kernel modules
0x4 "vsh" vs0 Internal Flash System applications & libraries
0x5 "vshdata" vd0 Internal Flash Registry and error history
0x6 "vtrm" tm0 Internal Flash NpDrm, Marlin and DevKit/TestKit activations files
0x7 "user" ur0 Internal Flash User resources, LiveArea cache, database, & other stuff
0x8 "userext" ux0 Internal Flash / Memory Card Memory Card
0x9 "gamero" gro0 Game Card Game Card read-only area
0xA "gamerw" grw0 Game Card Game Card writable area
0xB "updater" ud0 Internal Flash Updater application and PUP copied here before reboot
0xC "sysdata" sa0 Internal Flash Dictionary and font data
0xD "mediaid" Memory Card / Game Card Some data on Memory Card & Game Card
0xE "pidata" pd0 Internal Flash Welcome Park and welcome video (Partition not present in Prototype units)
0xF "unused" Unknown

Partition Type

The partition type indicates the file system or if there is no file system (for example, in the case of a SLB2 archive).

Partition Type Name
0x6 FAT16
0x7 exFAT
0xDA Raw data

Partition Flag

Some partitions (specifically os0 and the boot loaders) have a shadow redundant copy. On System Software update, only the inactive partition is written to and finally the active partition is swapped. For partitions that do not use this activation feature, this value is ignored.