制作FAT12軟盤以查看軟盤的根目錄條目+文件屬性+文件內容


【-1】Before

for specific info , please visit http://wiki.osdev.org/Loopback_Device


##**【0】我們先上干貨,看到效果后,我們再說明每個步驟的緣由;** ![這里寫圖片描述](http://img.blog.csdn.net/20150912235204316)

【1】進入掛載目錄,添加相關文件(依個人意願)

這里寫圖片描述

Attention):要知道,以上文件和文件目錄往 /tmp 的寫入 就相當於寫入到 floppy.img 文件夾了,我們再看看掛載信息:

這里寫圖片描述

【2】卸載塊設備/dev/loop1

這里寫圖片描述

【3】以vim 命令打開 floppy.img 文件,並輸入 :%!xxd 以16進制查看該虛擬軟盤的內容;

Attention) FAT12文件系統用到扇區格式參見:http://blog.csdn.net/pacosonswjtu/article/details/48391467的“【2.1】FAT12的引導扇區格式:”
這里寫圖片描述
(糾錯1) 非常抱歉,上圖3.BPB_RootEntCnt=00e0=14 而不是15;

(補充):

4. BPB_FATSz16= 每 FAT 扇區數= offset(22) + length(2) = 0x0009 = 9(即每個FAT占用9個扇區)

這里寫圖片描述
這里寫圖片描述

【4】將為什么 RIVER.TXT 要從0x0002600這個字節開始呢?

這里寫圖片描述

從1.44大小的格式,我們知道,FAT12文件系統下的軟盤結構的第19個字節才是根目錄區,而每個扇區=512字節,所以19 * 512 =9728 = 0x2600處,Bingo!
而根目錄區的格式為:
這里寫圖片描述

  • 4.1) 找出river.txt的 在根目錄區的屬性值

  • 4.1.a)將 river.txt 的條目的32 個 字節復制下來,如下:

      	0002600: 5249 5645 5220 2020 5458 5420 0000 0000  RIVER   TXT ....
      	0002610: 0000 0000 0000 f4b6 2c47 0300 1000 0000  ........,G......
    
  • 4.1.b)則 該文件的屬性如下表所示:
    這里寫圖片描述

  • 4.2)在FAT中 尋找出 river.txt 的所有簇號
    Attention):由上圖的軟盤結構圖,我們知道FAT從第1個扇區開始,一個扇區512個字節,所以FAT從地址0x0200開始;
    這里寫圖片描述

  • 4.2.a)0000200: f0 ff ff 00 f0 ff ff ff ff ff ff ff ff 0f 0000 ................
    FAT表結構是怎樣的?參見 http://blog.csdn.net/pacosonswjtu/article/details/48391467

  • 4.2.a.1)我們看到,0-ff0、1-fff、2-000、3-fff、3-fff表示這個簇就是最后一個簇了,所以river.txt文件對應 的就是 簇3。
    (Attention):這里由於river.txt 只有15個字符,3個river strings 因此一個扇區就可以裝下了; 如果readers 有 interst, 不妨可以建立一個超過512字節(一個扇區)的文件,然后就可以演示出從FAT中找出該文件的所有簇號,不過你也可以參見 http://blog.csdn.net/pacosonswjtu/article/details/48391467中“【2.2】文件分配表-FAT”中的“看個荔枝”;

  • 4.2.a.2) 我們轉到數據區,看第3個簇內容;(前面已經提到,一個簇==一個或多個扇區)

  • 4.2.a.3)算數據區開始扇區號:
    step1) 通過文件系統的用到扇區數據結構找出 根目錄區條目數 BPB_RootEntCnt = 14 和 BPB_BytesPerSec = 512,(參見模塊3的第一張圖);
    step2) 所以算數據區開始扇區 =1 + 9 + 9 + 14 = 33 ,第33扇區的偏移量為 33*512 = 16896B, 16896/16=1056行,所以數據區的開始字節數為:16896B 。。。。(怎么計算出來的? 參見http://blog.csdn.net/pacosonswjtu/article/details/48391467 中的 “【2.3】根目錄區-root dir sector(如何計算根目錄區的扇區數量?)”)
    step3) 因為river.txt 的開始簇號為3,由於第1、2個FAT項不用,即簇0和簇1不用,所以簇號從2起算,即數據區的第一個扇區對應簇號2,所以簇號3對應第2個扇區,所以river.txt 的 起始地址為 16896 + 512 = 17408B,而17408 / 16 = 1088,正好與下圖匹配上。
    這里寫圖片描述
    (Bingo!)對, filesystem 就應該這么玩。


**(Attention)**以上演示效果完畢,下面,我們將制作FAT12虛擬軟盤並掛載到/tmp下的每一步的緣由;
##**【Reasons of precedure manufacturing virtual floppy with FAT12 file system】** ![這里寫圖片描述](http://img.blog.csdn.net/20150912235407418)
  • R1)dd if=/dev/zero of=floppy.img bs=512 count=2880 創建空虛擬軟盤
    /dev/zero : 在類UNIX 操作系統中, /dev/zero 是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。其中的一個典型用法是用它提供的字符流來覆蓋信息,另一個常見用法是產生一個特定大小的空白文件。

  • R2)sudo losetup /dev/loop1 floppy.img 給該軟盤文件關聯一個塊設備 /dev/loop1
    轉自: http://itlab.idcquan.com/linux/set/942370.html

    • loop設備介紹: loop 設備是一種偽設備(pseudo-device),或者也可以說是仿真設備。它能使我們像塊設備一樣訪問一個文件。在使用之前,一個loop設備必須要和一個文件進行連接。這種結合方式給用戶提供了一個替代塊特殊文件的接口。因此,如果這個文件包含有一個完整的文件系統,那么這個文件就可以像一個磁盤設備一樣被 mount 起來。

    • losetup 指令: 此命令用來設置循環設備。循環設備可把文件虛擬成塊設備,籍此來模擬整個文件系統,讓用戶得以將其視為硬盤驅動器,光驅或軟驅等設備,並掛入當作目錄來使用。

        losetup [ -e encryption ] [ -o offset ] loop_device file
        losetup [ -d ] loop_device
        -e 表示加密的方式
          -o 設置數據偏移量
          -d 卸載設備
          loop_device 循環設備名,在 linux 下如 /dev/loop0 , /dev/loop1 等。
          file 要與循環設備相關聯的文件名,這個往往是一個磁盤鏡象文件,如 *.img
      

Bingo!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM