版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一、通過格式化命令-看磁盤文件系統(tǒng)的建立過程 1、添加 format 命令,單步調(diào)試 所有的底層驅(qū)動(dòng)函數(shù)都已經(jīng)準(zhǔn)備好。添加格式化命令 format 后,編譯下載。 Format 命令的執(zhí)行主要是調(diào)用 f_mkfs()函數(shù),下面進(jìn)行單步調(diào)試。 以下主要列出函數(shù)的主要執(zhí)行步驟: res=f_mkfs( 0, 1, 4096 ); //1表示不需要引導(dǎo)扇區(qū)。4096是8個(gè)扇區(qū)。 進(jìn)入 f_mkfs()函數(shù),這里只列出主要執(zhí)行步驟: i
2、f (disk_ioctl(drv, GET_SECTOR_COUNT, 所以文件系統(tǒng)確定為 FAT32類型。 n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表示 FAT 要占據(jù)974個(gè)扇區(qū)。 n_rsv = 33 - partition; 保留扇區(qū)32個(gè)。 n_dir = 0; b_fat = b_part + n_rsv; /* FATs sta
3、rt sector 32扇區(qū)*/ b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于 FAT 表個(gè)數(shù)設(shè)為1個(gè),所以目錄區(qū)=FAT 起始+FAT 占用扇區(qū)數(shù)*/ b_data = b_dir + n_dir; /* Data start sector */ 以上三項(xiàng)確定 FAT 區(qū)域、根目錄區(qū)、數(shù)據(jù)區(qū)的起始扇區(qū)。 disk_ioctl(drv
4、, GET_BLOCK_SIZE, n_fat += (n - b_data) / N_FATS;這兩句話對 fat 所占扇區(qū)數(shù)進(jìn)行了修正,保證擦除時(shí),以32個(gè)扇區(qū)為一個(gè)單位。 n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; =0x1E588。 tbl = fs->win; /* Clear buffer */ mem_set(tbl, 0, SS
5、(fs)); 清零文件系統(tǒng)緩沖區(qū)。 mem_set(tbl, 0, SS(fs)); ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per c
6、luster */ ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ 上面的工作主要是填充 引導(dǎo)扇區(qū)緩沖區(qū),也就是常說的 DBR 扇區(qū)緩沖,等所有的參數(shù)寫好,就可以 寫回磁盤。 ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ if (disk_write(drv, tbl, b_part+0, 1) != RES_OK)
7、return FR_DISK_ERR; //這就是在寫有效引導(dǎo)標(biāo)志 sec[510]=0x55, sec[511]=0xAA。 if (fmt == FS_FAT32) disk_write(drv, tbl, b_part+6, 1); //FAT32在第六扇區(qū)有個(gè)備份引導(dǎo)扇區(qū)。 for (m = 0; m win, 0, 1) != RES_OK) return FR_DISK_ERR; partition = 0xF8; //M
8、BR 標(biāo)志。 } else { partition = 0xF0; } 3、觀察在有 MBR 區(qū)域的情況下,如何檢查文件系統(tǒng) fmt = check_fs(fs, bsect = 0); /* 檢查0扇區(qū)的時(shí)候,沒有發(fā)現(xiàn) FAT 文件系統(tǒng)扇區(qū),但是有0x55 0xAA 標(biāo) 志,說明這是有效磁盤,但是返回1. */ if (fmt == 1) { /* 表明可能存在分區(qū) */ /* Check a partition listed
9、 in top of the partition table */ tbl = /* Partition table */ if (tbl[4]) { 實(shí)際這里應(yīng)該是0x0c,表示 FAT32系統(tǒng)。 bsect = LD_DWORD( /* 這個(gè)是文件系統(tǒng) 引導(dǎo)扇區(qū)的號碼。 */ fmt = check_fs(fs, bsect); /* 再到這個(gè)扇區(qū)檢查是否存在 FAT 文件系統(tǒng)標(biāo)志。 */ } } 執(zhí)行過后,仍然能夠建立完整的
10、 文件系統(tǒng)信息 結(jié)構(gòu)體,只是里面的 FAT 分配起始扇區(qū)、數(shù)據(jù)區(qū)起始 扇區(qū)地址相對 沒有 MBR 的時(shí)候改變了,其它都差不多。 二、將 二、將 SD 卡格式化成具有兩個(gè)分區(qū)的磁盤。 卡格式化成具有兩個(gè)分區(qū)的磁盤。 1、目的 、目的 (1)深入理解 )深入理解 MBR、DPT 等概念。 等概念。 (2)修改 )修改 ff.c 中的 中的 f_mkfs 函數(shù),得到一個(gè)新函數(shù), 函數(shù),得到一個(gè)新函數(shù),f_format(u8 partitio
11、n,u16 allocsize),前一個(gè)參數(shù) 前一個(gè)參數(shù)是指 是指磁盤等分的個(gè)數(shù), 磁盤等分的個(gè)數(shù),接受 接受 1、2、3、4四個(gè)參數(shù),默認(rèn)為 四個(gè)參數(shù),默認(rèn)為1,最大為 ,最大為4。后一個(gè)參數(shù)是指 。后一個(gè)參數(shù)是指 每簇占 每簇占用的 用的字節(jié)數(shù)。 字節(jié)數(shù)。 (3)添加 )添加命令 命令 fdisk,調(diào)用上述函數(shù)。執(zhí)行完成后,用讀卡器在 ,調(diào)用上述函數(shù)。執(zhí)行完成后,用讀卡器在 PC 上讀取該 上讀取該 SD 卡, 卡,應(yīng)該顯示兩個(gè)可
12、應(yīng)該顯示兩個(gè)可移動(dòng)磁盤。 移動(dòng)磁盤。 2、f_format()函數(shù)的編寫 ()函數(shù)的編寫 首先新建一個(gè) 首先新建一個(gè)文件 文件 fext.c,該文件就實(shí)現(xiàn)一個(gè) ,該文件就實(shí)現(xiàn)一個(gè)函數(shù) 函數(shù) f_format.c,首先將 ,首先將 f_mkfs()函數(shù) ()函數(shù)復(fù)制過來,在此 復(fù)制過來,在此基礎(chǔ)上修改。 基礎(chǔ)上修改。 編譯后,首先解決警告和錯(cuò)誤: 編譯后,首先解決警告和錯(cuò)誤:包含頭文件 包含頭文件 ff.h 和 diskio.h。引用了
13、。引用了 ff.c 中的 中的靜態(tài)函數(shù) 靜態(tài)函數(shù) mem_set()和mem_clr(),復(fù)制過來。定義 ,復(fù)制過來。定義 Null 為0。將 。將 FATFS * FatFs[_Drives]做外部聲明。 做外部聲明。 同時(shí)發(fā) 同時(shí)發(fā)現(xiàn), 現(xiàn),不同 不同 c 源文件中 源文件中 #define 同樣的宏相互之間是不影響的 同樣的宏相互之間是不影響的。說明預(yù)處理的時(shí)候是一個(gè)一個(gè)文 。說明預(yù)處理的時(shí)候是一個(gè)一個(gè)文件處理的,不檢查相互之間的
14、關(guān)聯(lián)。 件處理的,不檢查相互之間的關(guān)聯(lián)。但同一個(gè)文件中,一個(gè)宏不能兩次定義。 但同一個(gè)文件中,一個(gè)宏不能兩次定義。 #ifndef NULL #define NULL 0 #endif //采取這種方式,主要是防止其他 采取這種方式,主要是防止其他 包含的頭文件也對 包含的頭文件也對 NULL 進(jìn)行了定義。 進(jìn)行了定義。 函數(shù)中主要修改的地方就是: 函數(shù)中主要修改的地方就是: n_part = n_part /drv; //進(jìn)行 進(jìn)行
15、 drv 等分。 等分。每個(gè)磁盤的扇區(qū)總數(shù)就是這么多。 每個(gè)磁盤的扇區(qū)總數(shù)就是這么多。 在 DPT 對應(yīng)增加的分區(qū)部分, 對應(yīng)增加的分區(qū)部分,填好分區(qū)表 填好分區(qū)表16個(gè)字節(jié)。 個(gè)字節(jié)。特別重要的是四個(gè)地方 特別重要的是四個(gè)地方:0字節(jié)寫為 字節(jié)寫為00或0x80,第四字節(jié)寫入 第四字節(jié)寫入0xc0表示 表示 FAT32系統(tǒng) 系統(tǒng)。 (第一次調(diào)試找不到新磁盤,就是由于這個(gè)字節(jié)默認(rèn)為 。 (第一次調(diào)試找不到新磁盤,就是由于這個(gè)字節(jié)默認(rèn)為0
16、) 。第 ) 。第8-11寫入分區(qū)引導(dǎo)扇區(qū)的線性扇區(qū)地址。 寫入分區(qū)引導(dǎo)扇區(qū)的線性扇區(qū)地址。第12-15寫入該磁盤分區(qū)的大小。 寫入該磁盤分區(qū)的大小。 for ( i=“0“; i<drv; i++){ //每個(gè)分區(qū)都要做一次, 每個(gè)分區(qū)都要做一次,DBR 的寫入, 的寫入,F(xiàn)AT 分配表初始化,根目錄初始化。 分配表初始化,根目錄初始化。 b_part+= i*n_part; //調(diào)整該分區(qū)引導(dǎo)扇區(qū)和 調(diào)整該分區(qū)引導(dǎo)扇區(qū)和 FA
17、T 表起始地址。 表起始地址。 b_fat=b_part + n_rsv; 3、其它修改的地方 、其它修改的地方 定義 定義 _DRIVE 為2,定義 ,定義_MULTI_PARTITION 為1,表示支持多分區(qū)。同時(shí)初始化磁盤 ,表示支持多分區(qū)。同時(shí)初始化磁盤 物理驅(qū)動(dòng)與 物理驅(qū)動(dòng)與分區(qū)號轉(zhuǎn)換結(jié)構(gòu)體(每個(gè)邏輯磁盤對應(yīng)一個(gè)結(jié)構(gòu)體) 。 分區(qū)號轉(zhuǎn)換結(jié)構(gòu)體(每個(gè)邏輯磁盤對應(yīng)一個(gè)結(jié)構(gòu)體) 。 主程序中也要定義兩個(gè)文件系統(tǒng)結(jié)構(gòu)體, 主程序中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深入理解計(jì)算機(jī)系統(tǒng)習(xí)題答案
- 外文翻譯---深入理解android系統(tǒng)安全性
- 深入理解c語言指針的奧秘
- 深入理解矩陣式團(tuán)隊(duì)管理
- 深入理解硬盤分區(qū)表
- 外文-深入理解安卓系統(tǒng)的安全性
- 深入理解 sql server 2008 的鎖機(jī)制
- 深入理解鄉(xiāng)村振興戰(zhàn)略的總要求
- 深入理解鄉(xiāng)村振興戰(zhàn)略的總要求
- 深入理解鄉(xiāng)村振興戰(zhàn)略的總要求
- 外文-深入理解安卓系統(tǒng)的安全性.pdf
- 外文-深入理解安卓系統(tǒng)的安全性.pdf
- 深入理解中國之路、中國之治、中國之理
- 手機(jī)系統(tǒng)外文翻譯---深入理解安卓系統(tǒng)的安全性
- 手機(jī)系統(tǒng)外文翻譯---深入理解安卓系統(tǒng)的安全性
- 手機(jī)系統(tǒng)外文翻譯---深入理解安卓系統(tǒng)的安全性
- 深入理解ids,ips的工作原理和機(jī)制
- android外文翻譯--深入理解安卓系統(tǒng)的安全性
- 手機(jī)系統(tǒng)外文翻譯---深入理解安卓系統(tǒng)的安全性.docx
- 手機(jī)系統(tǒng)外文翻譯---深入理解安卓系統(tǒng)的安全性.docx
評論
0/150
提交評論