歡迎您光臨本站 註冊首頁

Liunx用戶和內核空間之間的通信實現

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

系統調用

用戶空間和內核空間之間的通信實現

● 與系統調用相關的數據結構和函數

系統調用函數名以「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