目錄
使用者空間的
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實現中,這裡我結合一些源 來解釋如何使得一 個簡簡單單的...