裝置驅動(6) file operations

2021-09-26 06:33:04 字數 1663 閱讀 1502

int scull_open(struct inode *inode, struct file *filp)

void *kmalloc(size_t size, int flags);

void kfree(void *ptr);

對於kmalloc的呼叫將試圖分配size個位元組大小的記憶體;其返回值為指向該記憶體的指標,分配失敗時返回null,flags引數用來描述記憶體的分配方法,我們目前只會用到gfp_kernel,由這個函式分配的記憶體應該通過kfree釋放。我們不應該將非kmalloc返回的指標傳遞給kfree。但是給kfree傳遞乙個空指標是合法的。

#include

unsigned

long

copy_to_user

(void __user *to,

const

void

*from,

unsigned

long count)

;unsigned

long

copy_from_user

(void

*to,

const

void __user *from,

unsigned

long count)

;

這兩個函式的作用並不限於在核心空間和使用者空間之間拷貝資料,他們還檢查使用者空間的指標是否有效。如果指標無效,就不會進行拷貝;另一方面,如果在拷貝過程中遇到無效位址,則僅僅會複製部分資料。在這兩種情況下,返回值是還需要拷貝的記憶體數量。如果不需要檢查使用者空間的指標,那麼建議直接使用__copy_to_user和__copy_from_user。在預先知道引數已經檢查過的時候,這兩個函式非常有用。

無論read或者是write方法傳輸了多少資料,都應該更新offp鎖代表的檔案位置,以便反映在新系統呼叫成功之後當前檔案的位置。作業系統會在恰當的時機將offp更新回file結構體的f_pos中。

出錯時,read和write方法都返回乙個負值,大於等於0的返回值告訴呼叫程式成功傳輸了多少個位元組。如果在正確傳輸部分資料之後發生了錯誤,則返回值必須是成功傳輸的位元組數,但這個錯誤只能在下一次函式呼叫時才能得到報告。當然,這種實現慣例要求驅動程式必須記住錯誤的發生,這樣才能把錯誤狀態返回給應用程式。

如果發生了錯誤,返回值要可以指明發生了什麼錯誤,錯誤碼在中定義。比如:-eintr(系統呼叫被中斷)或-efault(無效位址)。

無論這些方法傳輸了多少資料,一般而言都應該更新* offp所表示的檔案位置,以便反映在新系統呼叫成功完成之後當前的檔案位置。在恰當的時候,核心會將檔案位置的改變傳播回file結構。

1)如果返回值等於傳遞給read系統呼叫的count引數,則說明所請求的位元組數傳遞成功完成了,這是最理想的情況

2)如果返回值是正的,但是比count小,則說明只有部分資料成功傳遞。

3)如果返回值為0,則表示已經到達了檔案尾

4)負值意味著發生了錯誤,該值指明了發生了什麼錯誤,錯誤碼在中定義。

write方法的返回值

1)如果返回值等於count,則完成了所請求資料的位元組傳送

2)如果返回值是正的,但是小於count,則只傳輸了部分資料

3)如果值為0,意味著什麼也沒有寫入,這並不是錯誤,而且沒有理由返回乙個錯誤碼。

4)負值意味著錯誤

裝置驅動例項 字元裝置驅動

在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...

裝置驅動程式學習筆記 6 裝置訪問控制

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 linux 裝置驅動程式 第六章。2.修改scull load 指令碼中的 mode 為 666 使普通使用者具有裝置讀寫許可權。3.希望本文對您有所幫助,也歡迎您給我提意見和建議。這裡描述的裝置訪問控制是在檔案系...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...