操作系統使用系統調用表將系統調用編號翻譯為特定的系統調用。系統調用表包含有實現每個系統調用的函數的地址。例如,read()?系統調用函數名為sys_read。read()系統調用編號是 3,所以sys_read()?位于系統調用表的第四個條目中(因為系統調用起始編號為0)。從地址?sys_call_table + (3 * word_size)?讀取數據,得到sys_read()的地址。
找到正確的系統調用地址后,它將控制權轉交給那個系統調用。我們來看定義sys_read()的位置,即fs/read_write.c文件。這個函數會找到關聯到 fd 編號(傳遞給 read() 函數的)的文件結構體。那個結構體包含指向用來讀取特定類型文件數據的函數的指針。進行一些檢查后,它調用與文件相關的 read() 函數,來真正從文件中讀取數據并返回。與文件相關的函數是在其他地方定義的 —— 比如套接字代碼、文件系統代碼,或者設備驅動程序代碼。這是特定內核子系統最終與內核其他部分協作的一個方面。
讀取函數結束后,從sys_read()返回,它將控制權切換給?ret_from_sys。它會去檢查那些在切換回用戶空間之前需要完成的任務。如果沒有需要做的事情,那么就恢復用戶進程的狀態,并將控制權交還給用戶程序。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态