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函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....