日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

解析主分区数量

發(fā)布時(shí)間:2025/4/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析主分区数量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 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, // 無(wú)效類型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ū)是否活動(dòng)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; // 相對(duì)于該驅(qū)動(dòng)器開(kāi)始的相對(duì)扇區(qū)數(shù)u32_t total_sectors; // 總的扇區(qū)數(shù) }mbr_part_t;#define MBR_PRIMARY_PART_NR 4 // 4個(gè)分區(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 查詢的存儲(chǔ)設(shè)備* @param count 分區(qū)數(shù)存儲(chǔ)的位置* @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)記出哪個(gè)分區(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中添加測(cè)試代碼:

/*** 本源碼配套的課程為 - 從0到1動(dòng)手寫(xiě)FAT32文件系統(tǒng)。每個(gè)例程對(duì)應(yīng)一個(gè)課時(shí),盡可能注釋。* 作者:李述銅* 課程網(wǎng)址:http://01ketang.cc* 版權(quán)聲明:本源碼非開(kāi)源,二次開(kāi)發(fā),或其它商用前請(qǐng)聯(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測(cè)試,測(cè)試通過(guò)要注意關(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; }

參考資料:

  • 手把手教你學(xué)用嵌入式操作系統(tǒng)
  • 總結(jié)

    以上是生活随笔為你收集整理的解析主分区数量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。