系統調用
用戶空間和內核空間之間的通信實現
● 與系統調用相關的數據結構和函數
系統調用函數名以「sys_」開頭,後面是該系統調用的名字,由此構成了221個形似sys_name()的函數名。include/asm-i386/unistd.h中為每一個系統調用規定了惟一的編號,假設用name來表示系統調用的名稱,那麼系統調用號與系統調用響應函數的關係是:以系統調用號__NR_name作為下標,可找出系統調用表sys_call_table中對應表項的內容,它也就是該系統調用的響應函數sys_name的入口地址。
● 系統調用具體執行流程
當執行一個系統調用時,處理器跳轉到地址 0xc00。
參考代碼:
arch/ppc/kernel/head.S
/* System call */
. = 0xc00
SystemCall:
EXCEPTION_PROLOG
/* EXCEPTION_PROLOG 是一個宏,負責從用戶空間到內核空間的切換,並需要保存用戶進程的寄存器狀態*/
stw r3,ORIG_GPR3(r21)
li r20,MSR_KERNEL
rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
bl transfer_to_handler
.long DoSyscall
.long ret_from_except
有關DoSyscall,它在文件arch/ppc/kernel/entry.S 中定義。這個函數最終使用系統調用編號將系統調用表的地址和索引載入,操作系統使用系統調用表將系統調用編號翻譯為特定的系統調用。
系統調用表名為 sys_call_table,在 arch/ppc/kernel/misc.S 中定義。系統調用表包含有實現每個系統調用的函數的地址。
_GLOBAL(sys_call_table)
.long sys_ni_syscall /* 0 old "setup()" system call */
long sys_getegid /* 50 */
.long sys_acct
.long sys_umount /* recycled never used phys() */
.long sys_ni_syscall /* old lock syscall holder */
.long sys_ioctl /* 54 */
.long sys_fcntl /* 55 */
[火星人
]
Liunx用戶和內核空間之間的通信實現已經有369次圍觀
http://coctec.com/docs/linux/show-post-189123.html