```c typedef union _NMC_CH_MAPPING_TABLE { #pragma pack(push, 1) uint8_t byte[BYTES_PER_SLICE]; struct { union NMC_CH_MAPPING_PRE_INFO { uint8_t _pre_info_base[NMC_CH_MAPPING_PREFIX_INFO_BYTES];//NMC_CH_MAPPING_PREFIX_INFO_BYTES = 2 struct { uint8_t count; // NMC_CH_MAPPING_LIST_ENTRIES < 65535 uint8_t ch; //modified original }; } pre_info; union NMC_CH_MAPPING_PBA_LOC { uint16_t addr; struct { uint16_t blkNo : 12; uint16_t wayNo : 4; }; } pba[NMC_CH_MAPPING_LIST_ENTRIES];// NMC_CH_MAPPING_LIST_ENTRIES = 7680 union NMC_CH_MAPPING_POST_INFO { uint8_t _post_info_base[NMC_CH_MAPPING_POSTFIX_INFO_BYTES]; // NMC_CH_MAPPING_POSTFIX_INFO_BYTES = 1022 struct { union { uint8_t _[NMC_CH_MAPPING_POSTFIX_INFO_BYTES - NMC_FILENAME_MAX_BYTES]; // 766 struct { uint32_t magic; // magic number for checking uint16_t limit; // NMC_CH_MAPPING_LIST_ENTRIES < 65535 union // filetype, 16 bits { NMC_FILE_TYPES type; uint16_t type_padding; }; }; }; char title[NMC_FILENAME_MAX_BYTES]; // filename // NMC_FILENAME_MAX_BYTES:256 }; } post_info; union { uint8_t _spare_base[BYTES_PER_SPARE_REGION_OF_SLICE];// BYTES_PER_SPARE_REGION_OF_SLICE = 256 struct { // currently not used, just allocated for data buffer }; } spare; }; #pragma pack(pop) } NMC_CH_MAPPING_TABLE; ``` ``` 上面是儲存mapping table的格式 一個page 分為 data area + spare area data page 是我們實際儲存 mapping table 用到的空間,而 spare area 則是給 ECC 或其他資訊使用。 所以總共的page size 為 16384 Bytes(data area) + 256 Bytes(spare area) 下面講解我們的 mapping table 如何使用 data area ``` mapping table NMC_CH_MAPPING_PRE_INFO(2 Bytes) count:1 Bytes記錄說這個 mapping table 儲存多少 address ch :1 bytes NMC_CH_MAPPING_PBA_LOC(7680 * 2 = 15360 Bytes) 一個 address 一共: 2 Bytes address:0 ~ 11 bit 存 blkNo 12 ~ 15 bit 存 wayNo 最多存 7680 個 address NMC_CH_MAPPING_POST_INFO(1022 Bytes) 儲存一些metadta(ex.filename) Spare_area: 256 Bytes 所以基本上會一個page讀上以後 讀第1個 byte 得到他一共存了多少 address (count) 然後從第3個 byte 每次取兩個 byte 去得知,他存到了哪一些的 block,總共要取 count 次
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up