Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux/Android 區塊裝置扇區級讀寫實作指南

編輯:Linux 教學

在 Linux 核心或 Android 系統開發中,有時需要繞過檔案系統,直接對區塊裝置(如 SD 卡、eMMC 分區)進行扇區級的原始讀寫。這在韌體更新、資料救援、檔案系統底層測試等場景極為常見。本文以 Android 2.1 環境下的 TF 卡操作為例,說明核心步驟與關鍵程式碼實作。

核心步驟概覽

  1. 定位正確的區塊裝置節點: 在 Android 2.1 中,SD 卡的區塊裝置節點通常為 /dev/block/mmcblk0(整張卡)或 /dev/block/mmcblk0p1(第一分區),絕非 掛載點 /sdcard 或 /mnt/sdcard。
  2. 修改裝置節點權限: 預設權限不允許普通程序直接開啟區塊裝置。需透過 adb shell 取得 root 權限後執行:
    chmod 777 /dev/block/mmcblk0p1
  3. 編寫使用 O_DIRECT 旗標的讀寫程式: 繞過頁面快取,直接對扇區操作。
  4. 交叉編譯並推送至裝置執行。

關鍵程式碼實作

1. 開啟裝置(需對齊記憶體)

int fd = open("/dev/block/mmcblk0", O_RDWR | O_DIRECT, 0666);

關鍵點: 必須加上 O_DIRECT 旗標,告知核心略過頁面快取直接存取磁碟。此外,讀寫緩衝區的記憶體位址與大小必須符合扇區大小(通常 512 位元組)的整數倍對齊需求,否則 O_DIRECT 會失敗返回 EINVAL。

2. 記憶體對齊緩衝區配置

char *iobuf = NULL;
iobuf = memalign(getpagesize(), getpagesize()); // 取得頁面大小對齊的緩衝區(通常 4096 bytes)

或使用 posix_memalign()。配置大小建議為頁面大小(4KB)的整數倍,以滿足 O_DIRECT 的對齊限制。

3. 扇區讀寫封裝函式範例

以下範例示範如何定位至特定扇區(此處為第 2 個扇區,偏移 1024 位元組)進行讀寫:

// 寫入單一扇區 (512 bytes)
int WriteSectors(int fd, char *buf) {
    if (lseek(fd, 1024, SEEK_SET) == -1) return -1; // 定位至第 2 扇區起始處
    return write(fd, buf, 512);
}

// 讀取單一扇區 (512 bytes)
int ReadSectors(int fd, char *buf) {
    if (lseek(fd, 1024, SEEK_SET) == -1) return -1;
    return read(fd, buf, 512);
}

注意: 實際專案中應根據扇區號動態計算偏移量 sector_num * 512,並檢查 read/write 返回值是否為 512,以確保完整讀寫。

實戰提醒

  • 資料毀損風險極高: 直接寫入區塊裝置會破壞檔案系統結構,務必在測試環境或備份後操作。
  • 分區表與檔案系統: 若裝置已掛載檔案系統,直接寫入會導致資料不一致,建議先 umount 卸載。
  • Android 版本差異: 新版 Android (10+) 對裝置節點存取有 SELinux 限制,可能需設定 SELinux 為 Permissive 模式或配置對應的 .te 政策檔。
  • 扇區大小: 現代儲存裝置可能為 4KB 扇區(Advanced Format),程式碼中硬編碼 512 可能不適用,建議透過 ioctl(fd, BLKSSZGET, &sector_size) 動態取得。

掌握扇區級讀寫,能讓你在檔案系統層失效時,仍能直搗黃龍進行底層資料操作與診斷。

Copyright © Windows教程網 All Rights Reserved