之前做應用程式的開發,就知道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。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...