系統呼叫sys write的過程

2021-07-31 04:47:48 字數 1463 閱讀 8333

user space 只能通過系統呼叫來訪問kernel提供的函式,下面以sys_read 為例

sys_write函式宣告在include/linux/syscalls.h檔案中。這個檔案中申明了linux kernel提供的所有系統呼叫

asmlinkage long sys_write(unsigned int fd, const char __user *buf, size_t count);

其函式實現在fs/read_write.c

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

size_t, count)

return ret;

}在這個系統呼叫中呼叫vfs提供的寫函式vfs_write,vfs_write 通過在fs/read_write.c 這個檔案中實現。

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

inc_syscw(current);

file_end_write(file);

}return ret;

}vfs_write 中通過rw_verify_area 驗證可以操作這個檔案後,就呼叫__vfs_write開始寫

ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,

loff_t *pos)

__vfs_write 這個函式中就呼叫具體檔案系統的寫函式,從可以可以看到優先呼叫file->f_op->write。

其中file->f_op是在呼叫檔案系統註冊的時候賦值的,這裡以ext4 為例

const struct file_operations ext4_file_operations = ;

這裡的write是null,因此呼叫write_iter,也就是ext4_file_write_iter

ext4_file_write_iter->__generic_file_write_iter->generic_file_direct_write->filemap_write_and_wait_range->__filemap_fdatawrite_range->do_writepages->generic_writepages->write_cache_pages->__writepage->ext4_writepage->ext4_bio_write_page->io_submit_add_bh

可見最終的寫操作還是在ext4 中實現,寫操作由於不同的flag,走的flow有所不同,這裡只是舉例而已。

總結一下,user space 只能通過系統呼叫來呼叫kernel space 提供的介面函式。kernel space 對外通過vfs這個通用介面,各個檔案系統自己實現read/write 介面,並把自己註冊到檔案系統的列表中.

Linux系統呼叫的過程

系統呼叫使用者態切換核心態的引發原因 呼叫系統呼叫函式 軟中斷 缺頁異常 硬中斷 系統呼叫的過程 產生0x80號中斷,儲存當前程序的現場資訊,將系統呼叫的系統呼叫號寫入eax暫存器中。中斷處理程式執行,也即切換到了核心態,此處也是執行程式呼叫的程式,從eax暫存器中讀出系統呼叫號,查詢系統呼叫表,找...

系統呼叫實現過程

系統呼叫的實現與一般過程呼叫的實現相比,兩者間有很大差異。對於系統呼叫,控制是由原來的使用者態轉換為系統態,這是借助於中斷和陷入機制來完成的,在該機制中包括中斷和陷入硬體機構及中斷與陷入處理程式兩部分。中斷和陷入硬體機構 圖1所示為中斷的處理過程。中斷可進一步分為外中斷和內中斷。外中斷是指由於外部裝...

fork系統呼叫的執行過程

1.linux提供了三個系統呼叫用於建立程序,分別是fork,vfork,clone fork系統呼叫 核心採用寫時複製技術對傳統的fork函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....