注:所有清單中**均來自 linux2.6.11 核心原**
讀資料之前,必須先開啟檔案。處理 open 系統呼叫的核心函式為 sys_open 。
所以我們先來看一下該函式都作了哪些事。清單1顯示了 sys_open 的**(省略了部分內容,以後的程式清單同樣方式處理)
清單1 sys_open 函式**
asmlinkage long sys_open(const char __user * filename, int flags, int mode)
……return fd;……}
**解釋:
f->f_op = fops_get(inode->i_fop);
這個賦值語句把和具體檔案系統相關的,操作檔案的函式指標集合賦給了 file 物件的 f _op 變數(這個指標集合是儲存在 inode 物件中的),在接下來的 sys_read 函式中將會呼叫 file->f_op 中的成員 read 。
圖3顯示了 sys_open 函式返回後, file 物件和當前程序描述符之間的關聯關係,以及 file 物件中操作檔案的函式指標集合的**(inode 物件中的成員 i_fop)。
圖3 file 物件和當前程序描述符之間的關係
到此為止,所有的準備工作已經全部結束了,下面開始介紹 read 系統呼叫在圖1所示的各個層次中的處理過程。
虛擬檔案系統層的處理:
核心函式 sys_read() 是 read 系統呼叫在該層的入口點,清單2顯示了該函式的**。
清單2 sys_read 函式的**
asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
return ret;
}**解析:
if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);
struct file_operations ext2_file_operations = ;
該成員 read 指向函式
generic_file_read 。所以, inode->i_fop.read 指向 generic_file_read 函式,進而
file->f_op.read 指向 generic_file_read 函式。最終得出結論: generic_file_read
函式才是 ext2 層的真實入口。
ext2 檔案系統層的處理
圖4 read 系統呼叫在 ext2 層中處理時函式呼叫關係
int mpage_readpage(struct page *page, get_block_t get_block)
該函式首先呼叫函式
do_mpage_readpage 函式建立了乙個 bio
請求,該請求指明了要讀取的資料塊所在磁碟的位置、資料塊的數量以及拷貝該資料的目標位置——快取區中 page 的資訊。然後呼叫
mpage_bio_submit 函式處理請求。 mpage_bio_submit 函式則呼叫 submit_bio
函式處理該請求,後者最終將請求傳遞給函式 generic_make_request ,並由 generic_make_request
函式將請求提交給通用塊層處理。
到此為止, page cache 層的處理結束。
通用塊層的處理
generic_make_request 函式是該層的入口點,該層只有這乙個函式處理請求。清單7顯示了函式的部分**
清單7 generic_make_request 函式部分**
void generic_make_request(struct bio *bio)
while (ret);
}主要操作:
到此為止,通用塊層的操作結束。
io 排程層的處理
對 make_request_fn 函式的呼叫可以認為是 io 排程層的入口,該函式用於向請求佇列中新增請求。該函式是在建立請求佇列時指定的,**如下(blk_init_queue 函式中):
q->request_fn = rfn;
blk_queue_make_request(q, __make_request);
函式 blk_queue_make_request 將函式 __make_request 的位址賦予了請求佇列 q 的 make_request_fn 成員,那麼, __make_request 函式才是 io 排程層的真實入口。
__make_request 函式的主要工作為:
檔案系統 read系統呼叫剖析(一)
一 read系統呼叫剖析 1,kernel層的read系統呼叫的入口函式是在kernel fs read write.c檔案中,如下所示 372 syscall define3 read,unsigned int,fd,char user buf,size t,count 373 386 retur...
read系統呼叫
read系統呼叫是glibc庫裡面的乙個函式,是對系統呼叫函式sys read 的封裝與實現。glic庫會將read函式在使用者態下進行解析,通過暫存器將引數儲存起來,並借助於系統呼叫名稱獲得系統呼叫號,該系統呼叫號又可以作為系統呼叫函式在sys call table中的索引獲取函式入口位址,該錶位...
read系統呼叫,mmap系統呼叫
read系統呼叫,mmap系統呼叫 2012 07 23 09 54 28 分類 linux 標籤 linux 檔案系統 虛擬記憶體 儲存系統 字型大小 訂閱 一般情況下,操作檔案既可以使用標準i o,也可直接使用系統呼叫。兩者有何區別呢?在輸入輸出中,直接使用底層的系統呼叫效率是非常低的,為什麼?...