核心中讀寫檔案

2021-05-23 09:24:12 字數 1066 閱讀 4899

在使用者態,可以使用open,close,read,write等系統呼叫來訪問檔案。那麼核心中呢?使用filp->open等函式進行操作,但是這些操作又有些需要注意的地方。

在實際應用中,我們可以把系統執行的一些狀態記錄到記憶體中,但記憶體畢竟小,而且在系統重啟後,資料會丟失。那麼是否可以在核心中開啟乙個執行緒將這些資料記錄記憶體中的資料拷貝到磁碟的檔案上呢?

在呼叫filp->f_op->read和filp->f_op->write等對檔案的操作之前,應該先設定fs。

預設情況下,filp->f_op->read或者filp->f_op->write會對傳進來的引數buff進行指標檢查。如果不是在使用者空間會拒絕訪問。因為是在核心模組中,所以buff肯定不在使用者空間,所以要增大其定址範圍。

拿filp->f_op->write為例來說明:

filp->f_op->write最終會呼叫access_ok ==> range_ok.

而range_ok會判斷訪問的位址是否在0 ~ addr_limit之間。如果在,則ok,繼續。如果不在,則禁止訪問。而核心空間傳過來的buff肯定大於addr_limit。所以要set_fs(get_ds())。

這些函式在asm/uaccess.h中定義。以下是這個標頭檔案中的部分內容:

#define make_mm_seg(s)    ((mm_segment_t) )

#define kernel_ds    make_mm_seg(-1ul)

#define user_ds        make_mm_seg(page_offset)

#define get_ds()    (kernel_ds)

#define get_fs()    (current_thread_info()->addr_limit)

#define set_fs(x)    (current_thread_info()->addr_limit = (x))

#define segment_eq(a, b)    ((a).seg == (b).seg)

可以看到set_fs(get_ds())改變了addr_limit的值。這樣就使得從模組中傳遞進去的引數也可以正常使用了。

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...

在linux核心中讀寫檔案

1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...