Linux 檔案系統與驅動

2021-10-05 17:45:12 字數 3741 閱讀 9371

之前做應用程式的開發,就知道linux系統的一大特點就是一切皆檔案,一直以來對所有裝置的操作都是使用系統函式open read write close來實現的,就沒關心過系統裡面是怎麼實現對各種裝置的區分和控制櫃,直到開始看linux裝置驅動方面的知識以後,感覺像發現了新大陸一樣的神奇,故把相關知識記錄下來,方便以後自己查詢。

int

open

(const

char

*pathname,

int flags)

;int

open

(const

char

*pathname,

int falgs, mode_t mode)

;

open函式有兩個形式,其中第乙個引數是需要開啟的檔案路徑及檔名(預設是當前路徑),flags是一下值的乙個或者幾個的組合:

標誌(flag)

含義o_rdonly

唯讀方式

o_wronly

只寫方式

o_rdwr

可讀可寫

追加的方式

o_creat

建立乙個檔案

o_exec

如果使用了o_creat而且檔案已經存在,就會發生乙個錯誤

o_noblock

以非阻塞的方式

o_trunc

如果檔案已經存在就刪除檔案內容

o_rdonly ,o_wronly ,o_rdwr這三個標誌位只能使用其中的乙個

如果使用了o_creat標誌,那麼呼叫的函式需要指定第三個引數mode標誌,以表示檔案的訪問許可權:

標誌(flag)

含義s_irusr

使用者可以讀

s_iwusr

使用者可以寫

s_ixusr

使用者可以執行

s_irwxu

使用者可讀,可寫,可執行

s_irgrp

組可讀s_iwgrp

組可寫s_ixgrp

組可執行

s_irwxg

組可讀,可寫,可執行

s_iroth

其他人可以讀

s_iwoth

其他人可寫

s_ixoth

其他人可執行

s_irwxo

其他人可讀,可寫,可執行

s_isuid

設定使用者執行id

s_isgid

設定組id

除了通過以上巨集第一或運算產生標誌位以外,可以自己用數字生產標誌位規則如下:

byte位

含義備註

第一位 (byte 4)

設定使用者id

第二位 (byte 3)

設定組id

第三位 (byte 2)

使用者自己的許可權

可取 1(可執行),2 (可寫),4(可讀),0(無)或者這些值的和

第四位 (byte 1)

組的許可權

第五位 (byte 0)

其他人許可權

open

("test"

, o_creat,

10705);

open

("test"

, o_creat, s_irwxu | s_iroth | s_ixoth | s_isuid)

;

上面兩個函式等價:當前路徑下建立乙個使用者可讀可寫可執行,組沒有許可權,其他人可讀可執行並設定使用者id名為test的檔案

int

read

(int fd,

const

void

*buf, size_t length)

;int

write

(int fd,

const

void

*buf, size_t length)

;

引數 fd 為open函式返回的檔案描述符,buf為指向緩衝區的指標,length為緩衝區大小;

read()從fd所指的檔案裡面讀取length個位元組到buf緩衝區,返回實際讀取到的位元組數;

write()把length個位元組從緩衝區buf中寫到fd指向的檔案去,返回實際寫進去的位元組數;

int

lseek

(int fd, offset_t offset,

int whence)

;

將檔案指標相對whence移動offset個位元組,操作成功時返回檔案指標相對於檔案頭的位置,whence可以取:

lseek(fd, 0, seek_end);返回的就是檔案的長度

lseek(fd, -5 , seek_cur);將檔案指標相對當前位置向前移動5位元組

int

close

(int fd)

;

linux應用程式和設定之間的關係如下圖所示:

應用程式通過系統呼叫,作業系統通過虛擬檔案系統中的file_operations結構體去呼叫相應的裝置驅動,file_operations結構體定義了一系列函式指標,相應的裝置驅動實現這些函式,並把函式賦值給file_operations的函式指標,然後把驅動註冊到核心。file_operations結構體定義如下(include/linux/fs.h):

struct file_operations  __randomize_layout;
file_operations核心函式

使用者空間函式

備註llseek()

lseek()

用來修改乙個檔案的當前讀寫位置,並將新位置返回,出錯時返回乙個負數

read()

read() fread()

從裝置中讀取資料,成功返回讀取的位元組數,失敗返回負數,0暗示end-of-file

write()

write() fwrite()

向裝置傳送資料,成功返回傳送的位元組數,失敗返回負數,如果此函式未被實現,使用者調研write()以後講收到-einval返回值

unlocked_ioctrl()

ioctrl() fcntl()

提供裝置相關控制命令呼叫,成功返回非負值,失敗返回負數

mmap()

mmap()

幀緩衝被對映到使用者空間,應用程式可以直接訪問,不需要再核心空間和使用者空間進行記憶體複製,如果此函式未被實現,使用者調研mmap()以後講收到-einval返回值

poll()

select() poll()

用於查詢裝置是否可被非阻塞的進行讀寫,當查詢的調節未觸發時,使用者空間進行select() 和 poll()查詢系統呼叫時將引起程序的阻塞

aio_read() aio_write

對裝置進行非同步讀寫操作,當該函式實現以後,使用者空間可以對裝置執行sys_io_setup、sys_io_submit、sys_io_getevents、sys_io_destory等系統呼叫進行讀寫

Linux檔案系統與裝置驅動

應用程式與vfs virtual filesystem 之間的介面是系統呼叫。vfs與檔案系統及裝置檔案之間的介面是file operation 結構體成員函式。結構成員函式過多,基本上程式設計用到的有.read write open owner this module 在對file opreati...

Linux 驅動相關檔案系統

1.dev 裝置檔案目錄,存放所有系統中device 裝置 的相關資訊。dev snd 音效卡裝置 2.etc 系統配置檔案 3.opt 表示可選擇,自定義軟體安裝的地方 4.proc 作業系統執行時,程序相關資訊,由系統動態生成。proc ioports 可以檢視i o埠使用情況。proc mod...

linux檔案系統與根檔案系統

檔案系統 與 根檔案系統 要不我們就統一簡稱為fs和rfs 檔案系統 file system fs 根檔案系統 root file system rfs。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...