Linux kernel FAT32檔案系統實現

2021-08-31 09:25:29 字數 1289 閱讀 9371

1.     fat表操作

fat檔案系統中,使用fat表標記哪個cluster被占用,哪個沒被占用。在linux核心**中,與fat表操作對應的是fat_entry,fatent_ops結構和fat_cache_id快取等。

1.1 fat_entry

fat中的fat entry用於描述fat檔案系統的fat分配表。

struct fat_entry u;

int nr_bhs;                         // buffer_head數目,可能是1也可能是2,fat32是1

struct buffer_head *bhs[2];         // fat表的扇區的buffer_head

struct inode *fat_inode;                // 超級塊的inode

fat檔案系統中對fat12/16/32,分別實現了乙個fatent_operations。fatent_operations的初始化在fat_ent_access_init函式,大意是根據超級塊裡的fat_bits判斷當前fat型別,然後將對應的fatent_operations賦值到超級塊的fatent_ops中。

對於fat32,超級塊的fatent_ops會指向fat32_ops;fatent_shift為2,代表乙個簇的編號占用4個位元組:

static struct fatent_operations fat32_ops = ;

readpage

static int fat_readpage(struct file *file, struct page *page)

return mpage_readpage(page, fat_get_block);

int mpage_readpage(struct page *page, get_block_t get_block)

struct bio *bio = null;

sector_t last_block_in_bio = 0;

struct buffer_head map_bh;

unsigned long first_logical_block = 0;

map_bh.b_state = 0;

map_bh.b_size = 0;

bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio,

&map_bh, &first_logical_block, get_block);

if (bio)

mpage_bio_submit(read, bio);

關於 0x3f3f3f3f 的問題

0x3f3f3f3f是乙個很有用的數值,它是滿足以下兩個條件的最大整數。1 整數的兩倍不超過 0x7f7f7f7f,即int能表示的最大正整數。2 整數的每8位 每個位元組 都是相同的。我們在程式設計中經常需要使用 memset a,val,sizeof a 初始化乙個陣列a,該語句把數值 val ...

0x3f3f3f3f(無窮大數)

一般定義無窮大數都是inf 99999999,或者0x7f ff ff ff,但是有的時候inf過大,雖然保證了沒有數超過它,但是在需要加上乙個數的時候,inf a可能會導致溢位,最終變成乙個負數。而0x3f3f3f3f的數量級也1e9的,一般題不會給超過1e9的數 在把它當成無窮大的時候,兩個0x...

Python3物件導向 3 異常(3)異常作用

當丟擲異常時,看起來好像立即停止了程式的執行。丟擲異常之後的所有 都不會執行,除非處理了這一異常,程式將會退出並給出錯誤資訊。def no return print i am about to raise an exception raise exception this is always rai...