解析主分区数量
文章目錄
- 1 解析主分區(qū)數(shù)量
- 1.1 實(shí)現(xiàn)原理
- 1.2 代碼實(shí)現(xiàn)
1 解析主分區(qū)數(shù)量
1.1 實(shí)現(xiàn)原理
先看一下PC機(jī)上分區(qū)的情況:
為什么要使用分區(qū)?
PC如何解析磁盤中的分區(qū)的?
原理如下:
分區(qū)標(biāo)志類型:
1.2 代碼實(shí)現(xiàn)
xdisk中添加相關(guān)數(shù)據(jù)結(jié)構(gòu)定義:
/*** 文件系統(tǒng)類型*/ typedef enum {FS_NOT_VALID = 0x00, // 無效類型FS_FAT32 = 0x01, // FAT32FS_EXTEND = 0x05, // 擴(kuò)展分區(qū)FS_WIN95_FAT32_0 = 0xB, // FAT32FS_WIN95_FAT32_1 = 0xC, // FAT32 }xfs_type_t;#pragma pack(1)/*** MBR的分區(qū)表項(xiàng)類型*/ typedef struct _mbr_part_t {u8_t boot_active; // 分區(qū)是否活動u8_t start_header; // 起始headeru16_t start_sector : 6; // 起始扇區(qū)u16_t start_cylinder : 10; // 起始磁道u8_t system_id; // 文件系統(tǒng)類型u8_t end_header; // 結(jié)束headeru16_t end_sector : 6; // 結(jié)束扇區(qū)u16_t end_cylinder : 10; // 結(jié)束磁道u32_t relative_sectors; // 相對于該驅(qū)動器開始的相對扇區(qū)數(shù)u32_t total_sectors; // 總的扇區(qū)數(shù) }mbr_part_t;#define MBR_PRIMARY_PART_NR 4 // 4個分區(qū)表/*** MBR區(qū)域描述結(jié)構(gòu)*/ typedef struct _mbr_t {u8_t code[446]; // 引導(dǎo)代碼區(qū)mbr_part_t part_info[MBR_PRIMARY_PART_NR];u8_t boot_sig[2]; // 引導(dǎo)標(biāo)志 }mbr_t;#pragma pack()xdisk.c中實(shí)現(xiàn)獲取主分區(qū)的函數(shù):
/*** 獲取設(shè)備上總的分區(qū)數(shù)量* @param disk 查詢的存儲設(shè)備* @param count 分區(qū)數(shù)存儲的位置* @return*/ xfat_err_t xdisk_get_part_count(xdisk_t *disk, u32_t *count) {int r_count = 0, i = 0;mbr_part_t * part;u8_t * disk_buffer = temp_buffer;// 讀取mbr區(qū)int err = xdisk_read_sector(disk, disk_buffer, 0, 1);if (err < 0) {return err;}// 解析統(tǒng)計(jì)主分區(qū)的數(shù)量,并標(biāo)記出哪個分區(qū)是擴(kuò)展分區(qū)part = ((mbr_t *)disk_buffer)->part_info;for (i = 0; i < MBR_PRIMARY_PART_NR; i++, part++) {if (part->system_id == FS_NOT_VALID) {continue;} else {r_count++;}}*count = r_count;return FS_ERR_OK; }main.c中添加測試代碼:
/*** 本源碼配套的課程為 - 從0到1動手寫FAT32文件系統(tǒng)。每個例程對應(yīng)一個課時(shí),盡可能注釋。* 作者:李述銅* 課程網(wǎng)址:http://01ketang.cc* 版權(quán)聲明:本源碼非開源,二次開發(fā),或其它商用前請聯(lián)系作者。*/ #include <stdio.h> #include <string.h> #include "xdisk.h" #include "xfat.h"extern xdisk_driver_t vdisk_driver;const char * disk_path_test = "disk_test.img"; const char * disk_path = "disk.img";static u32_t write_buffer[160*1024]; static u32_t read_buffer[160*1024];xdisk_t disk;// io測試,測試通過要注意關(guān)掉 int disk_io_test (void) {int err;xdisk_t disk_test;memset(read_buffer, 0, sizeof(read_buffer));err = xdisk_open(&disk_test, "vidsk_test", &vdisk_driver, (void *)disk_path_test);if (err) {printf("open disk failed!\n");return -1;}err = xdisk_write_sector(&disk_test, (u8_t *)write_buffer, 0, 2);if (err) {printf("disk write failed!\n");return -1;}err = xdisk_read_sector(&disk_test, (u8_t *)read_buffer, 0, 2);if (err) {printf("disk read failed!\n");return -1;}err = memcmp((u8_t *)read_buffer, (u8_t *)write_buffer, disk_test.sector_size * 2);if (err != 0) {printf("data no equal!\n");return -1;}err = xdisk_close(&disk_test);if (err) {printf("disk close failed!\n");return -1;}printf("disk io test ok!\n");return 0; }int disk_part_test (void) {u32_t count;xfat_err_t err = FS_ERR_OK;printf("partition read test...\n");err = xdisk_get_part_count(&disk, &count);if (err < 0) {printf("partion count detect failed!\n");return err;}printf("partition count:%d\n", count);return 0; }int main (void) {xfat_err_t err;int i;for (i = 0; i < sizeof(write_buffer) / sizeof(u32_t); i++) {write_buffer[i] = i;}// err = disk_io_test(); // if (err) return err;err = xdisk_open(&disk, "vidsk", &vdisk_driver, (void *)disk_path);if (err) {printf("open disk failed!\n");return -1;}err = disk_part_test();if (err) return err;err = xdisk_close(&disk);if (err) {printf("disk close failed!\n");return -1;}printf("Test End!\n");return 0; }參考資料:
總結(jié)
- 上一篇: 中国现役军人有多少 详细解析中国现役军人
- 下一篇: 怎么制作usb安装系统安装win7系统