1.file_operations資料結構
核心內部通過file結構識別裝置,通過file_operations資料結構提供檔案系統的入口點
函式。file_operations定義在中的函式指標表。這個結構的每乙個成員的名字都對應著乙個系統呼叫。從某種意義上說,寫驅動程式的任務之一就是完成file_operations中的函式指標。如果在2.4版本核心下開發的驅動很可能在2.6版本中無法使用,需要進行移植。通常file_operations提供了包括open()、write()、read()、release()、poll()、ioctl()等檔案系統的入口函式。
下面簡單描述一下幾個重要的入口函式。
1)open():
static int mydriver_open(struct inode *inode, struct file *filp)
當上層對mydriver執行open操作時呼叫該函式,其中引數inode為裝置特殊檔案的inode(索引節點)結構指標,引數file是指向這一裝置的檔案結構指標。open()的主要任務是確定硬體處在就緒狀態、驗證次裝置號的合法性(次裝置號可以用minor(inode→i - rdev)取得)、控制使用裝置的程序數、根據執**況返回狀態碼(0表示成功,負數表示存在錯誤)等。
2)write():
static ssize_t mydriver_write(struct file *filp, const char *buf, size_t size, loff_t *offp)
當裝置特殊檔案進行write系統呼叫時,將呼叫驅動程式的write()函式,向裝置傳送資料。如果沒有這個函式,write 系統呼叫會向呼叫程式返回乙個-einval。如果返回值非負,則表示成功寫入的位元組數。write函式通常就是把資料從使用者空間複製到核心空間,所以在write函式裡經常會看到copy_from_user()函式。
3)read():
static ssize_t mydriver_read(struct file *filp, char *buf, size_t size, loff_t *offp)
當對裝置特殊檔案進行read系統呼叫時,將呼叫驅動程式read()函式,用來從裝置中讀取資料。當該函式指標被賦為null 值時,將導致read 系統呼叫出錯並返回-einval(「invalid argument,非法引數」)。函式返回非負值表示成功讀取的位元組數(返回值為「signed size」資料型別,通常就是目標平台上的固有整數型別)。read()函式則通常是把資料從核心空間複製到使用者空間,一般都會呼叫copy_to_user()函式。
4)release():
static int mydriver_release(struct inode *inode, struct file *filp)
當最後乙個開啟裝置的使用者程序執行close()系統呼叫時,核心將呼叫驅動程式的release()函式,release()函式的主要任務是清理未結束的輸入/輸出操作、釋放資源、使用者自定義其他標誌的復位等。
5)ioctl():
static int mydriver_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
該函式是特殊的控制函式,可以通過它向裝置傳遞控制資訊或從裝置取得狀態資訊,unsigned int引數為裝置驅動程式需要執行的命令**,由使用者自定義。unsigned long引數為相應的命令提供引數,型別可以是整型、指標等。如果裝置不提供ioctl入口點,則對任何核心未預先定義的請求,ioctl系統呼叫將返回錯誤(-enotty,「no such ioctl fordevice,該裝置無此ioctl命令」)。如果該裝置方法返回乙個非負值,那麼該值會被返回給呼叫程式以表示呼叫成功。
6)poll():
static unsigned int mydriver_poll(struct file *filp, poll_table *wait)
poll方法是poll和select 這兩個系統呼叫的後端實現,用來查詢裝置是否可讀、可寫或是否處於某種特殊狀態。
2.inode(索引節點)
檔案系統處理的檔案所需要的資訊在inode(索引節點)中。乙個filesystem可以粗略地分成inode table與data area兩部分。inode table上有許多的inode,每個inode分別記錄乙個檔案的屬性,以及這個檔案分布在哪些data block上。inode包含檔案訪問許可權、屬主、組、大小、生成時間、訪問時間、最後修改時間等資訊。它是linux管理檔案系統的最基本單位,也是檔案系統連線任何子目錄、檔案的橋梁。inode結構中的靜態資訊取自物理裝置上的檔案系統,由檔案系統指定的函式填寫,它只存在於記憶體中,可以通過inode快取訪問。雖然每個檔案都有相應的inode節點,但是只有在需要的時候,系統才會在記憶體中為其建立相應的inode資料結構,建立的inode結構將形成乙個鍊錶,可以通過遍歷這個鍊錶得到所需要的檔案節點。
3.file結構
file結構主要用於與檔案系統對應的裝置驅動程式使用。在linux裡,每乙個檔案都有乙個file結構和inode結構,inode結構是用來讓kernel做管理的,而file結構則是平常對檔案讀、寫或開啟,關閉所使用的。當然,從user的觀點來看是看不出什麼的。比起inode結構,file結構就顯得小多了,file結構也是用序列來管理的,f_next會指到下乙個file結構,而f_pprev則會指到上乙個file結構的位址,f_dentry會記錄其inode的dentry位址,f_mode為檔案訪問種類,f_pos則是目前檔案的offset,每次讀寫都從offset記錄的位置開始讀寫,f_count是此file結構的reference cout,f_flags則是開啟此檔案的模式,f_reada,f_ramax, f_raend,f_ralen,f_rawin則是控制read ahead的引數,f_owner記錄了要接收sigio和sigurg的行程id或行程群組id,private_data則是tty driver所使用的字段。
linux 塊裝置驅動(二) 塊裝置資料結構
本文 於 1.塊裝置相關的資料結構以及介面 塊裝置介面則相對複雜,讀寫api沒有直接到塊裝置層,而是直接到檔案系統層,然後再由檔案系統層發起讀寫請求。一 block device block device結構代表了核心中的乙個塊裝置。它可以表示整個磁碟或乙個特定的分割槽。當這個結構代表乙個分割槽時,...
驅動主要資料結構
驅動物件 driver object typedef struct driver object driver object typedef struct driver object pdriver object n is 結構圖 裝置物件 deviceobject typedef struct de...
資料結構 關鍵路徑
aov aoe都是有權無向圖,aov邊不帶權值,aoe帶權值。關鍵路徑是aoe中,開始頂點到結束頂點的所有路徑中,具有最大路徑長度的路徑成為關鍵路徑,路徑上的點是關鍵活動。1 關鍵路徑如果有多條,至提高一條關鍵路徑上的關鍵活動並不能縮短工期,必須要加快所有關鍵路徑上的關鍵活動才能加快工期。2 關鍵路...