Linux VFS中write系統呼叫實現原理

2021-08-05 19:11:09 字數 2530 閱讀 8725

目錄

使用者空間的

write

函式在核心裡面的服務例程為

sys_write. 1

vfs_write

函式實現原理

... 2

word裡面的目錄複製過來似乎不能直接用。。還是放在這裡當主線看吧..

使用者空間的

write

函式在核心裡面的服務例程為

sys_write

root@syslab ~]# grep write /usr/include/asm/unistd_64.h

#define __nr_write1

__syscall(__nr_write, sys_write)

#define __nr_pwrite6418

__syscall(__nr_pwrite64, sys_pwrite64)

#define __nr_writev20

__syscall(__nr_writev, sys_writev)

#define __nr_pwritev296

__syscall(__nr_pwritev, sys_pwritev)

#define __nr_process_vm_writev311

__syscall(__nr_process_vm_writev, sys_process_vm_writev)

這裡根據經驗判斷,通常write

呼叫應該是

sys_write,

這裡我們討論

sys_write

函式的核心實現

syscall_define3(write, unsigned int, fd, const char __user *, buf,size_t, count)

return ret;

}可以看到,和

sys_read

系統呼叫不同的地方就是這裡呼叫了

vfs_write

函式來完成寫操作,所以這裡我們只看

vfs_write

都做了什麼,其餘部分請參看

linux

中read

系統呼叫實現原理

vfs_write

函式實現原理

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)

即把使用者空間的

char __user* buf

指向的記憶體位址裡面的內容寫入相應的裝置檔案

基本同vfs_read,

不過這裡變成了

如果檔案系統沒有實現

file_operation

或者既沒有實現

file_operation->write

,也沒有實現

file_operation->aio_write

,則報錯。(即檔案系統即沒有實現同步寫,也沒有實現非同步寫,那就報錯返回錯誤了)

如果檔案系統實現了

file->file_operation->write

(還記得我嗎在

open

系統呼叫中講到的嗎,在

open

系統呼叫中

file->file_operation

設定為了

inode->file_operation

)函式,則呼叫它來完成。

否則(說明檔案系統沒有實現

write

,但是實現了

file_operation->aio_write

)呼叫核心的預設函式

do_sync_write(file, buf, count, pos);

來做同步讀寫操作

;而核心的

do_sync_write

函式內部實現是

ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);

for (;;)

}這裡和

do_sync_read

不同在於基本也就

aio_read

換成了aio_write

了,do_sync_write

最後呼叫的是

file_operation->aio_write

方法,但是

iov陣列長度為

1,並且寫入過程中如果寫入操作沒有完成則顯式呼叫程序排程函式,本程序可能被掛起來且程序狀態為

task_uninterruptible

。直到最終寫入完成,讀取成功後程序狀態會變為

task_running,

且存放在使用者空間的

buf記憶體區的內容已經寫入硬體上為止

具體請參看

linux

中read

系統呼叫實現原理

參考:kernel 3.6.7

0

給主人留下些什麼吧!~~

linux VFS中dentry結構解析

linux vfs中dentry結構解析 先看 此書中對dentry,file,process,inode這幾個資料結構關係的解析。程序每開啟乙個檔案,就會有乙個file結構與之對應。同乙個程序可以多次開啟同乙個檔案而得到多個不同的file結構,file結構描述了被開啟檔案的屬性,讀寫的偏移指標等等...

linux驅動中的write函式

用檔案那樣向裝置傳送資料。可是為什麼使用者使用write函式就可以把資料寫到裝置裡面 去,這個過程到底是怎麼實現的呢?這個奧秘就在於裝置驅動程式的write實現中,這裡我結合一些源 來解釋如何使得一 個簡簡單單的write函式能夠完成向裝置裡面寫資料的複雜過程。這裡的源 主要來自兩個地方。第一是or...

linux驅動中的write函式

linux下我們在使用裝置的時候,都會用到write這個函式,通過這個函式我們可以象使 用檔案那樣向裝置傳送資料。可是為什麼使用者使用write函式就可以把資料寫到裝置裡面 去,這個過程到底是怎麼實現的呢?這個奧秘就在於裝置驅動程式的write實現中,這裡我結合一些源 來解釋如何使得一 個簡簡單單的...