Yaffs功能說明.docx_第1頁
Yaffs功能說明.docx_第2頁
Yaffs功能說明.docx_第3頁
Yaffs功能說明.docx_第4頁
Yaffs功能說明.docx_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1 背景 2 發(fā)牌 3 Yaffs 和 Yaffs 直接接口有哪些? 4 為什么使用 Yaffs 嗎? 5 源代碼和 Yaffs 資源 6 系統(tǒng)要求 7 如何與實(shí)時(shí)操作系統(tǒng)/Embedded 系統(tǒng)集成 Yaffs 7.1 源文件 7.2 整合POSIX應(yīng)用程序接口 7.3 RTO集成接口 8 Yaffs NAND模型 Yaffs1 8.1 NAND模型注意事項(xiàng) Yaffs2 8.2 NAND模型 9 NAND配置和訪問接口 9.1 常見配置項(xiàng) (Yaffs1 和 Yaffs2) 9.2 共同訪問函數(shù) (Yaffs1 和 Yaffs2) 9.3 Yaffs1 訪問函數(shù) 9.4 Yaffs2 訪問函數(shù) 10 使用POSIX文件系統(tǒng)接口 10.1 向 Windows POSIX差異-喜歡接口 10.2 基本概念 10.3 錯(cuò)誤代碼 10.4 鏈接 硬種 (不是符號(hào)鏈接) 10.5 符號(hào)鏈接 10.6 基于句柄的文件處理 10.7 更改文件大小 10.8 獲取/設(shè)置有關(guān)文件的信息 10.9 更改目錄結(jié)構(gòu)和名稱 10.10 搜索目錄 10.11 裝載控制 10.12 其他 11 示例: yaffs_readdir() 和 yaffs_stat()1 背景本文檔的目的是描述接口的 Yaffs 直接接口 (YDI) 以及提供足夠的信息,以允許 Yaffs 初步評價(jià)。這份文件試圖把重點(diǎn)放在重要的系統(tǒng)集成商的問題沒有得到 Yaffs 是如何工作的太詳細(xì)。其他文件提供 Yaffs 的工作原理進(jìn)行深入的討論。2 發(fā)牌Yaffs 最初被用于 Linux 下GNU公共許可證 (GPL) 發(fā)布。很快就查明,Yaffs 將他們應(yīng)用的理想選擇,但是卻不能使用GPL的各種嵌入式開發(fā)人員在其系統(tǒng)中基于代碼的。Aleph 一有替代的發(fā)牌安排,以支持此類應(yīng)用程序。3 Yaffs 和 Yaffs 直接接口有哪些?Yaffs 代表尚未另一個(gè) Flash 文件系統(tǒng)。Yaffs 是第一個(gè)文件為設(shè)計(jì)的系統(tǒng),從地上起來, nand 閃存存儲(chǔ)。2002 年 Aleph 一著手查明使用NAND閃存作為文件系統(tǒng)的文件系統(tǒng)選項(xiàng)。當(dāng)時(shí)可用的各種文件系統(tǒng)進(jìn)行評價(jià)和所有被發(fā)現(xiàn)缺乏一種方式或另一種。確定合適的nand 閃存存儲(chǔ)文件系統(tǒng)需要和 Yaffs 為了滿足這一需要。雖然 Yaffs 最初設(shè)計(jì)用于NAND閃存,它已經(jīng)被成功地用NOR閃存系統(tǒng),甚至作為RAM文件系統(tǒng)。這允許高可靠性文件系統(tǒng)構(gòu)造也不閃光,用為更高的密度和性能的NAND閃存未來的遷移路徑。Yaffs 最初被設(shè)計(jì)用于 Linux 的操作系統(tǒng),但非常模塊化的方式設(shè)計(jì)了。經(jīng)營系統(tǒng)特定代碼是主要的 Yaffs 文件系統(tǒng)代碼分開。這允許 Yaffs 相當(dāng)干凈地移植到其他操作系統(tǒng)通過操作系統(tǒng)個(gè)性模塊。這樣一個(gè)個(gè)性模塊是允許 Yaffs 將簡單地集成與嵌入式系統(tǒng),有或無的RTOS的 Yaffs 直接接口 (YDI).Yaffs 被用于許多產(chǎn)品使用各種操作系統(tǒng),包括 Windows CE和各種高昂,包括 ThreadX、 vXworks、 pSOS 舉幾個(gè)。請注意,對不使用YDI的 eCOS 的本機(jī)端口。這是支持并由 eCocCentric 分發(fā)。(/)。Yaffs2,Yaffs,較新版本支持更廣泛的NAND閃存組件包括 2 k 頁設(shè)備,并產(chǎn)生相等或更好的性能。它包括 Yaffs1 兼容性代碼,所以 Yaffs1 圖像仍然工作,遷移是相當(dāng)簡單。Nand 閃存文件系統(tǒng), YDI也提供提供給RAM仿真層,以允許 Yaffs 太作為RAM文件系統(tǒng)操作。雖然RAM仿真也許不是一個(gè)專用的RAM文件系統(tǒng)盡可能高效的這允許一個(gè)行之有效的文件系統(tǒng),使用兩個(gè)RAM和 flash。4 為什么使用 Yaffs 嗎?Yaffs 是專門針對NAND閃存的第一次,和也許是唯一的文件系統(tǒng)。這意味著設(shè)計(jì)了 Yaffs 變通的各種限制和怪癖的NAND閃存,以及利用與非門實(shí)現(xiàn)一個(gè)有效的文件系統(tǒng)的各種功能??紤]一些特點(diǎn): Yaffs 已被很好的證明,并已被用于大量使用許多不同的操作系統(tǒng)、 編譯器和處理器的幾種產(chǎn)品在出貨。 Yaffs 是便攜式用 C 編寫的是中性的字節(jié)序。 Yaffs 提供壞塊處理和ECC算法來處理在NAND閃存中的不足之處。 Yaffs 是日志結(jié)構(gòu)文件系統(tǒng),使電力故障等導(dǎo)致了腐敗非常穩(wěn)健。 Yaffs 具有高度優(yōu)化和可預(yù)測的垃圾收集策略。這使得高性能和非常確定性時(shí)相比相似的文件系統(tǒng)。 Yaffs 具有較低的內(nèi)存占用比大多數(shù)其他日志結(jié)構(gòu)的閃存文件系統(tǒng)。 Yaffs 提供了種類繁多的POSIX-樣式文件系統(tǒng)支持,包括目錄,符號(hào)和硬鏈接等通過標(biāo)準(zhǔn)文件系統(tǒng)接口調(diào)用。 Yaffs 是高度可配置工作與各種閃光的幾何形狀,不同的ECC選項(xiàng)、 緩存選項(xiàng)等。 Yaffs 直接接口是簡單整合在一個(gè)系統(tǒng) 只有幾個(gè)接口功能的需要。 Yaffs 可以用廣泛的內(nèi)存技術(shù)。5 源代碼和 Yaffs 資源請注意適用于使用 Yaffs 代碼的許可條款。作為 Yaffs 的所有信息的樞紐。本文檔是廣泛指 Yaffs 源代碼。并且可以通過此站點(diǎn)上的下載鏈接。有其他各種文件和 Yaffs 討論 Yaffs 郵件列表。咨詢服務(wù)也是可用的。6 系統(tǒng)要求確定最低系統(tǒng)要求往往是相當(dāng)困難的。以下介紹只是指引了。如果與聯(lián)系 Aleph 一進(jìn)行更詳細(xì)的分析要求。 Yaffs 是中性的字節(jié)序和小端字節(jié)序和大端字節(jié)序處理器工作正常。 Yaffs 代碼已經(jīng)被成功地與許多不同的 32 位和 64 位 Cpu 包括MIPS,68000, ARM、 PowerPC、 ColdFire x 86 變種。Yaffs 應(yīng)使用 16 位 Cpu 太,但這是一般未經(jīng)測試,可能需要一些調(diào)整,具體取決于編譯器選項(xiàng)。 由于 Yaffs 是日志結(jié)構(gòu)的RAM被需要建立可接受的性能的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。作為一個(gè)經(jīng)驗(yàn)法則,預(yù)算大約每 2 個(gè)字節(jié)塊的NAND閃存,在一大塊通常是NAND的一頁。NAND與 512 字節(jié)的頁,預(yù)算大約 4kbytes 的RAM每 1Mbyte 的nand 閃存。2kbyte 頁設(shè)備預(yù)算大約每 1Mbyte NAND 1 kb.7 如何與實(shí)時(shí)操作系統(tǒng)/Embedded 系統(tǒng)集成 YaffsYaffs 直接接口 (YDI) 包裝 Yaffs 是簡單整合的方式。您需要提供幾個(gè)函數(shù) Yaffs 使用談?wù)勀挠布筒僮飨到y(tǒng)。Yaffs 提供了一整套的POSIX-兼容功能應(yīng)用程序可以使用跟它說話。除了 Yaffs 核心文件系統(tǒng), YDI有三個(gè)部分,每個(gè)所述在進(jìn)一步章節(jié)中詳細(xì): POSIX應(yīng)用程序界面: 這是應(yīng)用程序代碼使用訪問 Yaffs 文件系統(tǒng)的接口。(打開、 關(guān)閉、 讀取、 寫入、 等) 實(shí)時(shí)操作系統(tǒng)集成接口: 這些都是必須為 Yaffs 訪問實(shí)時(shí)操作系統(tǒng)系統(tǒng)資源提供的功能。(初始化、 鎖定、 解鎖、 時(shí)間、 設(shè)置錯(cuò)誤) 閃存配置和訪問接口: 這些都是必須為 Yaffs 訪問NAND閃存提供的功能。(初始化,讀取數(shù)據(jù)塊,寫塊,擦除塊,等等)。這些函數(shù)可能由芯片組供應(yīng)商提供,或者可能需要寫的系統(tǒng)集成商。7.1 源文件下面的源代碼文件包含核心文件系統(tǒng):yaffs_allocator.c分配 Yaffs 對象和 tnode 結(jié)構(gòu)。yaffs_checkpointrw.c檢查點(diǎn)數(shù)據(jù)寫入流光yaffs_ecc.cECC代碼yaffs_guts.c主要的 Yaffs 算法。yaffs_nand.cFlash 接口抽象。yaffs_packedtags1.cyaffs_packedtags2.c標(biāo)記包裝代碼yaffs_qsort.c在 Yaffs2 掃描期間使用 Qsortyaffs_tagscompat.c要支持 Yaffs1 模式的標(biāo)記兼容性代碼。yaffs_tagsvalidity.c標(biāo)簽有效性檢查。Yaffs 直接接口是在 yaffsfs.c 的接口函數(shù)與在 yaffsfd.h 中定義的結(jié)構(gòu)。示例和測試生成文件:dtest.c測試工具。也可以用于更好地理解某些函數(shù)如何調(diào)用工作的示例代碼。yaffscfg2k.c測試配置。yaffs_fileem.cyaffs_fileem2k.cNand 閃存仿真使用一個(gè)文件作為后備存儲(chǔ)。yaffs_norif1.c亦不閃光模擬和接口的示例。這被配置為 M18 閃光。yaffs_ramdisk.cyaffs_ramem2k.c使用RAM模擬.ynorsim.c另一個(gè)也不模擬。進(jìn)一步測試文件是直接測試和直接/python。7.2 整合POSIX應(yīng)用程序接口在 yaffsfs.h 中定義的應(yīng)用程序接口。這些提供了POSIX文件系統(tǒng)接口。大多數(shù)情況下,該接口由前綴為yaffs_的標(biāo)準(zhǔn)俱樂部函數(shù)名稱。例如, yaffs_open(), yaffs_close()等。還有很大的靈活性,在如何使用這些函數(shù)和系統(tǒng)集成商需要確定系統(tǒng)的最佳策略。這些函數(shù)可以直接使用,與編寫使用這些名稱的代碼。舉個(gè)例子int main(.)/ initialisationf = yaffs_open(.);yaffs_read(f,.);yaffs_close(f);Yaffs 功能的包裝也可以以某種方式允許使用 yaffs 而無需修改現(xiàn)有代碼。例如:#define open(path, oflag, mode) yaffs_open(path, oflag, mode).int main(.)/ initialisationf = open(.);read(f,.);close(f);如果使用多個(gè)文件系統(tǒng)可以使用更復(fù)雜的方法是提供重定向功能。例如:int open(const char *path,.)/ Determine which file system is being used if(it_is_a_yaffs_path(path)return yaffs_open(.);else/ Do something else一些實(shí)時(shí)操作系統(tǒng)提供一種靈活方式集成的案例YDI可以通常使用這些接口來訪問 yaffs 文件系統(tǒng)的文件系統(tǒng)。7.3 RTO集成接口可以使用 Yaffs 之前,它需要與系統(tǒng)集成和配置,以便執(zhí)行正確的操作。為此,您需要修改配置文件。在 yaffscfg.c 和 yaffscfg2k.c 提出了一個(gè)示例配置文件。這是一個(gè)比較簡單的過程,并定義RTO訪問函數(shù)。實(shí)時(shí)操作系統(tǒng)訪問函數(shù)包括: void yaffsfs_SetError(int err): 由 Yaffs 設(shè)置的系統(tǒng)誤差。 void yaffsfs_Lock(void): 由 Yaffs 鎖定 Yaffs 從多線程訪問調(diào)用。 void yaffsfs_Unlock(void): 由 Yaffs 解鎖 Yaffs 調(diào)用。 _u32 yaffsfs_CurrentTime(void): 從 RTO 獲取當(dāng)前時(shí)間。 void yaffsfs_LocalInitialisation(void): 調(diào)用以初始化 RTO 上下文。如果在多線程環(huán)境中使用 Yaffs,然后通常yaffs_LocalInitialisation()將初始化一個(gè)合適的 RTOS 信號(hào)量和yaffs_Lock()和yaffs_Unlock()將調(diào)用適當(dāng)?shù)暮瘮?shù)來鎖定和釋放信號(hào)量。yaffs_CurrentTime()可以對系統(tǒng)的使用任何時(shí)間增量。如果這不是必需的它是很好,只是使用一個(gè)函數(shù),可以直接返回零。雖然這里沒有顯示,Yaffs 也需要內(nèi)存分配/釋放功能的malloc()和free()的默認(rèn)。這些,以及其他一些功能可以調(diào)整在文件 ydirectenv.h應(yīng)用程序代碼使用 Yaffs 之前,必須調(diào)用yaffs_StartUp()函數(shù),必須安裝適當(dāng)?shù)姆謪^(qū)。這通常是在系統(tǒng)啟動(dòng)代碼:./* System boot code: Start up Yaffs. */yaffs_StartUp();yaffs_mount(/boot);.8 Yaffs NAND模型在定義之前閃存集成接口,它是重要的是理解的模型和相應(yīng)的命名整個(gè) Yaffs 和它的文檔中使用。Yaffs 采用較高的抽象模型對NAND閃存。這樣很大的靈活性,它可以利用的方式。Yaffs 為NAND flash 設(shè)計(jì),使下面的假設(shè)和定義: Flash 被安排在塊中。每個(gè)塊的大小相同,包括塊一個(gè)整數(shù)。每個(gè)數(shù)據(jù)塊被視為一個(gè)單一的可擦寫項(xiàng)目。一個(gè)塊包含塊的數(shù)目。 一大塊,就相當(dāng)于閃存的分配單元。為 Yaffs1,每個(gè)塊等于 512 字節(jié)或更大的NAND頁 (即 512 字節(jié)或更大的數(shù)據(jù)部分和一個(gè) 16 字節(jié)的備用區(qū)域)。對于 Yaffs2,一大塊通常是較大 (如。 2 k 頁在設(shè)備上,一大塊通常會(huì)單 2 k 的網(wǎng)頁: 2kbytes 數(shù)據(jù)和 64 字節(jié)的備用)。Yaffs2 是能夠通過使用帶內(nèi)標(biāo)記和較小的塊大小工作。 (讀取和寫入) 的所有訪問都是塊頁面對齊。一些讀取可能只讀標(biāo)簽存放備用區(qū)。 當(dāng)編程的NAND flash 時(shí),只有零中的位被編程的模式是相關(guān)的,一位是不在乎。例如,如果一個(gè)字節(jié)已經(jīng)包含二進(jìn)制模式 1010年,然后編程 1001年將導(dǎo)致的模式,即是邏輯和這兩種模式。1000.這是不同的NOR閃存,通常會(huì)中止嘗試轉(zhuǎn)換成 1 的 0。Yaffs 標(biāo)識(shí)按塊編號(hào)塊和塊大塊的 id。一大塊 Id 計(jì)算如下:chunkId = block_id * chunks_per_block + chunk_offset_in_blockYaffs 將視為被免費(fèi)或擦除一塊空白 (0xFF 填充)。因此,相當(dāng)于一個(gè) Yaffs 分區(qū)的格式是抹去并不是壞的所有塊。Yaffs2 具有廣義的標(biāo)記接口以提供更好的靈活性,以滿足廣泛的具有較大的頁面和更嚴(yán)格的編程限制的設(shè)備。Yaffs2 因此處理比 Yaffs1 更抽象的構(gòu)造而更多的努力所需的nand 閃存接口.Yaffs1 8.1 NAND模型注意事項(xiàng)歷史的 Yaffs1 標(biāo)簽結(jié)構(gòu)是符合 SmartMedia 規(guī)范使用 512 字節(jié)的頁。還有現(xiàn)在可以配置更多的靈活性,在事情。Yaffs1 是能用作各種內(nèi)存布局,所以只要 flash 支持能力覆蓋標(biāo)簽區(qū)域,將刪除標(biāo)記設(shè)置為零。如果未設(shè)置 yaffs_Device useNANDECC 提起,然后 yaffs 將執(zhí)行ECC計(jì)算。如果這個(gè)學(xué)會(huì)然后 yaffs 會(huì)期望NAND驅(qū)動(dòng)程序 todo 任何所需的ECC檢查。在不使用ECC的設(shè)備,例如NOR,設(shè)置 useNANDECC = 1,然后不做任何的ECC 。Yaffs1 閃蒸模型預(yù)計(jì)面積 16 備用字節(jié),其中一些用于標(biāo)記。在 yaffs_packedtags1.c 中指定的空閑字節(jié)數(shù)和字節(jié)的使用之間的映射曾經(jīng)在許多NORYaffs1 模型 基于系統(tǒng)。一個(gè)特別是 flash 的很好的例子是 flash 的在 yaffs_norif1.c 上英特爾 M18 閃光使用 1 k 數(shù)據(jù)頁和模擬備用區(qū)可重寫領(lǐng)域?qū)崿F(xiàn) Yaffs1 模式。這不使用ECC ,但相反使用校驗(yàn)和。Yaffs2 8.2 NAND模型Yaffs2 使用一個(gè)不同的標(biāo)簽布局比 Yaffs1。Yaffs2 使用 yaffs_ExtendedTags structure.which 是按照 yaffs_packedtags2.c 中的代碼包裝。與非門處理程序?qū)颖仨毷褂没蛱畛涞淖侄巍W侄尉哂幸韵潞x: validMarker0設(shè)置為 0xAAAAAAAA chunkUsed如果為 0 然后這一塊是不會(huì)使用 objectId這塊屬于該對象。如果為 0 然后這不是對象的一部分 (即.未使用)。 chunkId如果 0,那么這個(gè)是標(biāo)題,其他文件中的指定位置的數(shù)據(jù)塊 byteCount文本塊中的數(shù)據(jù)字節(jié)數(shù)。只有有效的數(shù)據(jù)塊以下字段才有意義,當(dāng)我們讀到 eccResultECC 檢查閱讀時(shí)的結(jié)果 blockBad如果為 0 然后塊不是壞的。對 Yaffs1 有意義和應(yīng)為零的 Yaffs 以下字段: chunkDeleted如果非零,塊標(biāo)記為已刪除。 serialNumber2 位的序列號(hào)。以下字段 Yaffs1 的涵義,并應(yīng)該是零為 Yaffs2: sequenceNumber此塊的序列號(hào)可選的額外信息,如果這是對象頭 (只有 Yaffs2)。使 Yaffs1 為零。如果設(shè)置了extraHeaderInfoAvailable , extraXXX的所有字段都必須有效。 extraHeaderInfoAvailable有可用的額外信息如果這不是零。 extraParentObjectId父對象 id。 extraIsShrinkHeader它是一個(gè)縮頭嗎? extraShadows這造成暗影另一個(gè)對象? extraObjectType哪種對象類型? extraFileLength如果它是一個(gè)文件的長度。 extraEquivalentObjectId等效對象 Id,如果它是一個(gè)硬鏈接。最后: validMarker1必須是 0x55555555。有相當(dāng)多的字段,其中有些是可選的。extraXXXX的所有字段都都塞入方式可加快掃描對象標(biāo)頭標(biāo)記更多的數(shù)據(jù)的一種方式。這些都是可選的都應(yīng)為零如果不支持。最簡單的方法來處理yaffs_ExtendedTags是使用函數(shù)給出了在 yaffs_packedtags2.h 做包裝和拆包。這些都是:yaffs_PackTags2()和yaffs_UnpackTags2().這些函數(shù)創(chuàng)建或使用包裝的標(biāo)簽結(jié)構(gòu)可以被存放在NAND備用區(qū)。在 yaffs_fileem2.c 中給出實(shí)例,如何做到這一點(diǎn)9 NAND配置和訪問接口有關(guān)如何配置示例,請參閱 yaffs_cfg.c 和 yaffs_cfg2k.c。配置的這一部分涉及到配置芯片和合適的接入功能。這是在yaffs_StartUp().在啟動(dòng)之前到該設(shè)備的配置,這是操作的重要的是操作的理解 Yaffs 支持兩種不同模式: Yaffs1: 這是原來的運(yùn)作模式,只是供每頁 512 字節(jié)設(shè)備。 Yaffs2: 這種運(yùn)作模式支持較大的頁面大小。大多數(shù)配置選項(xiàng)都是相同的兩個(gè),但他們有不同的NAND訪問功能。你可能有一個(gè)系統(tǒng),使用 Yaffs1 和 Yaffs2 分區(qū)的組合。9.1 常見配置項(xiàng) (Yaffs1 和 Yaffs2)配置包括兩個(gè)部分: 設(shè)置裝載點(diǎn)表。 設(shè)置設(shè)備。Yaffsfs_DeviceConfiguration 是一個(gè)條目,有兩個(gè)部分: 裝入點(diǎn)名稱和指向 yaffs_Device 結(jié)構(gòu)的指針。裝入點(diǎn)名稱用于確定特定的 yaffs_Device 將可能被找到,將會(huì)在目錄結(jié)構(gòu)中??梢杂腥我鈹?shù)量的掛載點(diǎn),它們可以嵌套。例如:static yaffsfs_DeviceConfiguration yaffsfs_config = /, &ramDev, /flash/boot, &bootDev, /flash/flash, &flashDev, /ram2k, &ram2kDev,(void *)0,(void *)0 /* Terminate list */;每個(gè)邏輯存儲(chǔ)實(shí)體被稱為 yaffs_Device,雖然是最好的作為分區(qū)描述符。每個(gè) yaffs_Device 可以對應(yīng): 整個(gè)閃存設(shè)備。 閃存設(shè)備的一部分。 閃存設(shè)備以外 (例如也許RAM仿真)。在測試期間,常用這種仿真功能使用主機(jī)系統(tǒng)硬磁盤文件或 nfs 掛載的文件作為一種替代存儲(chǔ)機(jī)制。兩個(gè)或多個(gè) yaffs_Devices 可以駐留在單個(gè)物理閃存設(shè)備通過指定不同的開始和結(jié)束塊。例如這里有一個(gè)例子,單個(gè)設(shè)備分為兩個(gè)分區(qū):/ /boot.bootDev.param.startBlock = 0; / First block.bootDev.param.endBlock = 55; / Last block in 2MB./ /disk.diskDev.param.startBlock = 56; / First block after 2MBdiskDev.param.endBlock = 1023; / Last block in 16MB必須根據(jù) Yaffs 優(yōu)化文檔配置所有的 yaffs_Device 結(jié)構(gòu)。9.2 共同訪問函數(shù) (Yaffs1 和 Yaffs2)Yaffs1 和 Yaffs2 配置必須提供指向以下函數(shù):int (*eraseBlockInNAND)(struct yaffs_DeviceStruct *dev,int blockInNAND)Yaffs 調(diào)用這個(gè)函數(shù)來擦除閃存塊。int (*initialiseNAND)(struct yaffs_DeviceStruct *dev)Yaffs 調(diào)用此函數(shù)在開始之前得到調(diào)用其他函數(shù)來訪問 yaffs_Device。這允許系統(tǒng)集成商控制點(diǎn)來執(zhí)行任何所需的初始化 (eg。 設(shè)置芯片選擇等.)。9.3 Yaffs1 訪問函數(shù)對于 Yaffs1 分區(qū) yaffs_Device 配置還指定指向兩個(gè) Yaffs 調(diào)用來訪問NAND的這個(gè) yaffs_Device 的進(jìn)一步函數(shù)的指針。為更好地了解這些功能,請參閱 Yaffs NAND模型。這些函數(shù)是:int (*writeChunkToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const _u8 *data, yaffs_Spare *spare)Yaffs 調(diào)用這個(gè)函數(shù),將數(shù)據(jù)寫入nand 閃存。數(shù)據(jù)指針可能為 NULL ,如果只正在寫入備用區(qū),發(fā)生在大塊正在刪除或退休。如果數(shù)據(jù)指針是空然后就不要寫數(shù)據(jù)。業(yè)余的指針將不能為空.int (*readChunkFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, _u8 *data, yaffs_Spare *spare)當(dāng)從 flash 中讀取一大塊,Yaffs 調(diào)用這個(gè)函數(shù)。參數(shù)的含義從以上所述,是顯而易見的但請注意數(shù)據(jù)和備用字段可能為 NULL,在這種情況下不應(yīng)引用這些指針。9.4 Yaffs2 訪問函數(shù)操作的 Yaffs2 模式是操作的靈活得多的 Yaffs1 模式。這允許更多不同類型的閃光,但略有增加用于NAND訪問函數(shù)的復(fù)雜性。與操作的 Yaffs1 模式,Yaffs 執(zhí)行壞塊檢測和標(biāo)記,可以選擇執(zhí)行ECC。它可以這樣做,是因?yàn)樗俣∟AND備用區(qū)以某種方式結(jié)構(gòu)。操作的 Yaffs2 模式不再可以使這些假設(shè)這意味著系統(tǒng)集成商必須提供稍微復(fù)雜的函數(shù)。然而,接口是還比較簡單,特別是如果現(xiàn)有代碼作為基礎(chǔ)的。int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,int chunkInNAND, const _u8 * data,const yaffs_ExtendedTags * tags)int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,int chunkInNAND, _u8 * data,yaffs_ExtendedTags * tags)int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,yaffs_BlockState * state, int *sequenceNumber)writeChunkWithTagsToNAND()和readChunkWithTagsFromNAND()函數(shù)必須保存或檢索的數(shù)據(jù)和擴(kuò)展的標(biāo)記。請參閱 Yaffs2 NAND 模型更好地了解如何處理標(biāo)記的解釋。請注意,在某些情況下,數(shù)據(jù)和標(biāo)記指針可能為 NULL,驅(qū)動(dòng)程序代碼應(yīng)該忽略轉(zhuǎn)讓從或都為 NULL 的指針。Nand 閃存訪問函數(shù)還必須提供一種機(jī)制用于標(biāo)記和跟蹤壞塊。如果檢測到壞塊,Yaffs 決定將那塊標(biāo)記壞,則調(diào)用markNANDBlockBad()函數(shù)。queryNANDBlock()函數(shù)做兩件事: 它確定的塊狀態(tài) 如果塊是在使用它也檢索塊的序列號(hào)。到目前為止最簡單的方法來理解這一切是指提供的示例代碼。10 使用POSIX文件系統(tǒng)接口本節(jié)的目標(biāo)可能不是很熟悉訪問文件系統(tǒng)通過POSIX和POSIX的讀者-界面等。10.1 向 Windows POSIX差異-喜歡接口MSDOS和 Windows 提供POSIX-艾克接口。如果您熟悉這然后這會(huì)幫助你。有的不過一些略有差異,最重要的是: Windows 有沒有鏈接的概念,并有文件名稱和文件之間的 1:1 映射。POSIX支持文件與零,一個(gè)或很多名稱。請參閱鏈接和取消鏈接文件部分。例如POSIX允許您取消鏈接的文件 (即刪除的文件的名稱) 時(shí)仍在使用。你可以繼續(xù)讀/寫文件但盡快關(guān)閉該文件最后一個(gè)文件句柄,它將被刪除。另一方面,Windows,不允許你要取消鏈接的文件,在使用時(shí)。 Windows 命名驅(qū)動(dòng)器的一封信。POSIX已沒有驅(qū)動(dòng)器盤符。整個(gè)的POSIX文件系統(tǒng)是在單個(gè)目錄樹。 同一件事的目錄和文件夾。10.2 基本概念文件文件是存儲(chǔ)在文件系統(tǒng)中的對象。yaffs 支持以下文件類型:一個(gè)正常的文件是存儲(chǔ)在文件系統(tǒng)中的字節(jié)序列。目錄保存到其他文件的鏈接。符號(hào)鏈接保存到另一個(gè)文件的名稱。一個(gè)特殊的文件保存設(shè)備 id 或類似的信息。目錄這是一種結(jié)構(gòu),包含鏈接,允許按名稱找到的文件。請注意,單個(gè)文件可能有很多聯(lián)系 (即名稱) 很多人會(huì)發(fā)現(xiàn)在很多地方的目錄結(jié)構(gòu)中。鏈接這是一個(gè)允許要找到的文件的名稱。有兩種類型的鏈接: (有時(shí)稱為硬鏈接) 的真正鏈接和符號(hào) (或軟) 鏈接。句柄文件句柄提供上下文,從中可以訪問和操縱文件。一個(gè)句柄具有當(dāng)前的文件位置指針,它指向該文件在哪里被讀取或?qū)懭搿6鄠€(gè)句柄可以同時(shí)訪問單個(gè)文件。文件模式模式是一組定義的文件,以及與該文件關(guān)聯(lián)的當(dāng)前權(quán)限類型的標(biāo)志。路徑這是一個(gè)定義的目錄和文件名稱的字符串。例如:/ 數(shù)據(jù)/直接-1/file1文件元數(shù)據(jù)這是有關(guān)文件,不包括該文件的內(nèi)容的信息。元數(shù)據(jù)包括名稱、 模式、 大小和其他詳細(xì)信息。山,分區(qū),文件系統(tǒng)所有這些術(shù)語都是指單一的安裝 flash 區(qū)域。每個(gè)安裝掛接到一個(gè)共同的目錄結(jié)構(gòu)。使用既為一個(gè)單一的安裝分區(qū)的文件系統(tǒng)有時(shí)會(huì)令人困惑,因?yàn)樗且辉~,以及文件系統(tǒng)的代碼。換句話說,我們可以說,兩個(gè)/ 引導(dǎo)是一個(gè)文件系統(tǒng),也可以說,yaffs 是一個(gè)文件系統(tǒng)。inode 號(hào)Inode 號(hào)是標(biāo)識(shí)內(nèi)裝載的對象的唯一編號(hào)。請注意,inode 之間不是唯一兩個(gè)或更多的坐騎。有是沒有辦法達(dá)成一個(gè)文件的 inode,只能通過它的聯(lián)系。10.3 錯(cuò)誤代碼大多數(shù)功能導(dǎo)致錯(cuò)誤代碼如果函數(shù)執(zhí)行不成功。在這些情況下 yaffs 調(diào)用一個(gè)函數(shù),稱為yaffs_SetError()的錯(cuò)誤值。此函數(shù)可以將配置為錯(cuò)誤交付系統(tǒng)的錯(cuò)誤機(jī)制。對于返回整數(shù)的函數(shù),返回的值小于 0 指示錯(cuò)誤發(fā)生。如果出現(xiàn)錯(cuò)誤,返回指針的函數(shù)將返回NULL 。10.4 鏈接 硬種 (不是符號(hào)鏈接)起初我們只在考慮實(shí)際鏈接和不符號(hào)鏈接。有時(shí)真正的鏈接也稱為硬鏈接來區(qū)分它們的符號(hào)鏈接 (這有時(shí)被稱為軟鏈接)。鏈接和文件之間的區(qū)別是微妙的可能會(huì)造成混淆。簡要: 文件是文件系統(tǒng)中存儲(chǔ)的對象 鏈接是如何連接到的目錄結(jié)構(gòu)。第一個(gè)鏈接到一個(gè)文件使用創(chuàng)建的文件創(chuàng)建電話: yaffs_open()、 yaffs_mknod()、 yaffs_symlink() 、 yaffs_mkdir().使用yaffs_unlink()函數(shù),可以破壞的鏈接。目錄摧毀使用yaffs_rmdir()函數(shù) (哦,和目錄必須為空)。一旦文件既未使用 (有沒有句柄打開它) 并沒有指向它然后刪除。鏈接可以使用yaffs_rename()函數(shù)重命名。文件可能有很多聯(lián)系??梢允褂脃affs_link()函數(shù)創(chuàng)建這些。所有的鏈接訪問同一個(gè)文件,還有沒有人鏈接被認(rèn)為是真正聯(lián)系和其他人被重復(fù)鏈接。所有鏈接到的文件都具有相同的優(yōu)先級。如果你看看 inode 號(hào),a和b,然后他們會(huì)是一樣的因?yàn)樗鼈兪峭耆嗤奈募⒖?。因?1. 如果我們開始與一個(gè)文件稱為a,然后我們現(xiàn)在有兩個(gè)鏈接指向同一個(gè)文件的調(diào)用yaffs_link(“a”, “b”) 。我們無法分辨它們。2. 如果我們現(xiàn)在取消鏈接a,文件仍然存在下b的鏈接。3. 如果我們現(xiàn)在取消鏈接b將不再鏈接文件。如果有一個(gè)句柄打開到文件,然后我們還可以通過句柄訪問該文件并繼續(xù)讀取或修改的文件。如果沒有鏈接到它刪除該文件。4. 如果未鏈接的文件保持活著,因?yàn)楸淮蜷_的句柄,文件不會(huì)顯示在目錄結(jié)構(gòu)中 (因?yàn)樗褯]有聯(lián)系) 和盡快關(guān)閉句柄 (或如果是卸載的文件系統(tǒng)) 將被刪除。有一些限制,在如何使用鏈接: 您要鏈接到的現(xiàn)有文件必須存在。 你的鏈接到的文件必須在同一山 (分區(qū)) 作為您正在創(chuàng)建的鏈接。 你無法創(chuàng)建鏈接到目錄,因?yàn)檫@將允許創(chuàng)建遞歸循環(huán)。 新的鏈接名稱必須不存在。10.5 符號(hào)鏈接現(xiàn)在,您了解鏈接的努力,我們將介紹符號(hào) (或軟) 的鏈接。符號(hào)鏈接保存為一個(gè)不同的對象的別名。在路徑中使用的符號(hào)鏈接時(shí)使用別名。到那程度上硬鏈接和符號(hào)鏈接是相同的。您可以刪除yaffs_unlink()函數(shù),就像硬鏈接和符號(hào)鏈接。然而,有一些重要的差異。符號(hào)鏈接只是其鏈接的功能,當(dāng)評估路徑,從而: 你正在創(chuàng)建一個(gè)別名來不必存在的文件。 您正在創(chuàng)建一個(gè)別名文件必須不在同一座山。 您可以創(chuàng)建指向目錄的符號(hào)鏈接。 符號(hào)鏈接將不保持文件本身。只有一個(gè)硬鏈接可以這樣做。因此:1. 如果我們開始與一個(gè)文件稱為a,然后調(diào)用yaffs_symlink(“a”, “b”)我們現(xiàn)在有一個(gè)鏈接到的文件稱為a和符號(hào)鏈接 aliasising 從b為a。2. 如果我們使用yaffs_open(“a”)或yaffs_open(“b”)他們將打開同一個(gè)文件。路徑的決議機(jī)制替代品的別名,所以會(huì)抬頭a。這同樣適用于幾乎所有需要的路徑,如yaffs_truncate(), yaffs_stat()等的功能。唯一的例外是yaffs_lstat()和yaffs_readlink()將視為指向符號(hào)鏈接而不是文件路徑。3. 你可以告訴a和b分開使用yaffs_lstat()。yaffs_lstat(“a”)將顯示文件的信息a。yaffs_lstat(“b”)將顯示為符號(hào)鏈接本身的信息。注意與硬鏈接的區(qū)別。硬鏈接與yaffs_lstat(“a”)和yaffs_lstat(“b”)將顯示相同的結(jié)果,因?yàn)樗麄兪峭瑯拥氖虑楸灰谩?. 如果我們現(xiàn)在取消鏈接a。該文件不再鏈接,然后將不再可從b。注意與硬鏈接的區(qū)別。10.6 基于句柄的文件處理句柄是允許我們訪問的常規(guī)文件內(nèi)容的文件訪問器。該句柄標(biāo)識(shí)以及下一步在哪里讀或?qū)懖僮鲗l(fā)生位置指針跟蹤被訪問的文件。一個(gè)句柄標(biāo)識(shí)的值大于或等于 0 的整數(shù)。一個(gè)句柄創(chuàng)建通過使用yaffs_open()調(diào)用和返回的句柄值。如果不能創(chuàng)建的句柄然后返回一個(gè)負(fù)的值和設(shè)置 yaffs 錯(cuò)誤代碼。一個(gè)句柄一直有效,直到由yaffs_close()關(guān)閉句柄.yaffs_open()調(diào)用采用三個(gè)參數(shù): 名稱: 被打開的文件的完整路徑名稱。 訪問標(biāo)志: 標(biāo)志被用來打開此句柄 創(chuàng)建模式: 在創(chuàng)建文件時(shí)使用的模式標(biāo)志。訪問標(biāo)志是一個(gè)或多個(gè):O_CREAT如果不存在,請創(chuàng)建文件。O_EXCL僅使用 O_CREAT。如果它不存在,請創(chuàng)建文件。如果該文件已經(jīng)存在則失敗。O_TRUNC如果文件存在,并且打開具有寫訪問權(quán)限,然后長截?cái)酁榱阕止?jié)文件。O_APPEND無論手柄的位置,總是寫到文件的結(jié)尾。O_RDWR讀/寫訪問權(quán)限的打開。O_WRONLY打開寫訪問權(quán)限和沒有讀訪問權(quán)限。如果 O_RDWR 或 O_WRONLY 既不設(shè)置然后會(huì)打開文件進(jìn)行只讀訪問。他們并不互相排斥,通常組合這些標(biāo)志。例如:O_CREAT | O_TRUNC | O_RDWR : 創(chuàng)建一個(gè)新文件,如果它不存在否則如果該文件已經(jīng)存在然后截?cái)嚅L度為零。通常用來覆蓋文件或如果它尚不存在,則創(chuàng)建。O_CREAT | OEXCL | O_WRONLY : 創(chuàng)建一個(gè)新文件,打開它的只寫的。如果已存在的文件,失敗。有三種模式的標(biāo)志,可以控制或設(shè)置。通過創(chuàng)建該文件的打開或稍后yaffs_chmod()可能會(huì)設(shè)置這些標(biāo)志.S_IREAD可能打開文件進(jìn)行讀取訪問權(quán)限。S_IWRITE可能打開文件進(jìn)行寫訪問。S_IEXEC可能打開該文件以供執(zhí)行。這不是通過 yaffs 執(zhí)行。一旦您已打開句柄,然后你可以對該文件的各種操作。yaffs_close(handle)關(guān)閉該句柄。它不再是可用的。yaffs_fsync(handle)同花順出任何緩存寫入該文件,因?yàn)槲募脑獢?shù)據(jù)。yaffs_datasync(handle)Yaffs_fsync() 但沒有文件元數(shù)據(jù)相同。yaffs_flush(handle)和 yaffs_fsync() 一樣yaffs_dup(handle)復(fù)制句柄。yaffs_lseek(handle, offset, whence)設(shè)置句柄讀取/寫入位置。請注意這不會(huì)修改該文件。你可以尋求該文件的末尾。這不會(huì)修改的文件大小。yaffs_ftruncate(handle, size)更改文件的大小??煞糯蠡蚩s小。這并不改變句柄讀取/寫入位置。yaffs_fstat(handle, buf)獲取文件狀態(tài)。yaffs_fchmod(handle, mode)更改文件 mose。yaffs_read(handle, buffer, nbytes)從文件指針和更新指針在文件中讀取數(shù)據(jù)。yaffs_pread(handle, buffer, nbytes, position)從指定位置的文件中讀取數(shù)據(jù)。不修改文件指針yaffs_write(handle, buffer, nbytes)寫入數(shù)據(jù)文件在文件指針和更新指針。yaffs_pread(handle, buffer, nbytes, position)數(shù)據(jù)寫入文件在指定的位置。不修改文件指針10.7 更改文件大小yaffs_truncate(path, newSize)yaffs_ftruncate(handle, newSize)這些更改文件的大小。注意,截?cái)啵⒉恢皇且馕吨刮募冃?。該文件也可以變大。Yaffs 將它不需要的字節(jié)不存儲(chǔ)。如果您使用截形使文件變大,然后這不一定會(huì)沉入醉鄉(xiāng)更多閃存空間。請參閱yaffs_lseek()太。注意, yaffs_lseek() 只更改寫入指針的位置,除非雙方書面文件不影響文件的大小。10.8 獲取/設(shè)置有關(guān)文件的信息yaffs_chmod(path, mode)yaffs_fchmod(handle, mode)yaffs_access(path,amode)yaffs_stat(path, struct yaffs_stat *buf) yaffs_fstat(handle, struct yaffs_stat *buf)yaffs_lstat(path, struct yaffs_stat *buf)yaffs_readlink(path, buf, bufsize)Chmod 調(diào)用允許您設(shè)置該文件的不同模式標(biāo)志。這些只用于操作權(quán)限標(biāo)志并不更改模式標(biāo)志有關(guān)的文件的類型。yaffs_access() 測試可以在指定的模式訪問該文件。此調(diào)用返回零上成功,則返回-1情況下是一個(gè)位掩碼的下列值:R_OK檢查讀取是OKW_OK檢查寫沒關(guān)系X_OK檢查執(zhí)行是OK.0 (zero)只是檢查該文件存在這些是可以結(jié)合的。例如:if(yaffs_access(path, R_OK | W_OK) = 0)the file exists and can be read and writtenif(yaffs_access(path, 0) = 0)the file existsStat 調(diào)用檢索數(shù)據(jù)是在 yaffsfs.h 中定義的 yaffs_stat 的結(jié)構(gòu)。有三個(gè)版本:yaffs_fstat: 需要一個(gè)句柄。yaffs_stat: 采用路徑名稱,并遵循符號(hào)鏈接。yaffs_lstat: 將路徑但不是遵循符號(hào)鏈接。因此,如果路徑是一個(gè)符號(hào)鏈接, yaffs_fstat() 將給信息的文件的鏈接點(diǎn),而yaffs_lstat()將給鏈接本身有關(guān)的信息。yaffs_readlink()將讀入讀鏈接值所提供的緩沖區(qū)。例如:yaffs_symlink(“target”,”/link”); /* create a link called link to target */yaffs_readlink(“/link”,buffer,10); /* now buffer contains “target” */10.9 更改目錄結(jié)構(gòu)和名稱yaffs_open(path, flags, mode)yaffs_mkdir(path, mode)yaffs_symlink(targetPath, linkPath)yaffs_mknod(pathname, mode, dev)yaffs_link(existingPath, newath)yaffs_unlink(path)yaffs_rmdir(path)yaffs_rename(oldPath, newPath)通過yaffs_open(), yaffs_mkdir(), yaffs_symlink()和yaffs_mknod()函數(shù)創(chuàng)建的各種類型和他們的第一個(gè)鏈接文件。yaffs_link()可以用于創(chuàng)建后續(xù)鏈接指向的文件。請注意,你不能創(chuàng)建目錄的鏈接。yaffs_rename()允許您重命名鏈接。請注意,在另一個(gè)鏈接重命名一個(gè)鏈接是一個(gè)原子操作。這意味著,即使因停電中斷運(yùn)營,結(jié)果將完成或不會(huì)發(fā)生。如果目標(biāo)鏈接的目錄,然后重命名只會(huì)工作如果目標(biāo)目錄是空的。10.10 搜索目錄yaffs_DIR *yaffs_opendir(const YCHAR *d

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論