related files in kernel:
arch/arm/kernel/calls.S 聲明了系統調用函數和sys_call_table
include/asm-arm/unistd.h 定義了系統調用的調 用號規則
vector_swi定義在arch/arm/kernel/entry-common.S
vector_IRQ定義在 arch/arm/kernel/entry-armv.S
vector_FIQ定義在arch/arm/kernel/entry- armv.S
========================================
大家都知道linux的應用程式要想訪問核心必須使用系統調用從而實現從usr模式轉 到svc模式。下面咱們看看它的實現過程。
系統調用是os作業系統提供的服務,使用者程式通過各種系統調用,來引用核心提供的各種服務,系 統調用的執行讓使用者程式陷入核心,該陷入動作由swi非強制中斷完成。
#define __syscall(name) "swi/t" __sys1(__NR_##name) "/n/t" //arm mode
#define __sys2(x) #x
#define __sys1(x) __sys2(x)
#define __NR_SYSCALL_BASE 0x900000 //此為OS_NUMBER << 20運算值
#define __NR_open (__NR_SYSCALL_BASE+ 5) //0x900005
舉一個例子來 說:open系統調用,庫函數最終會調用__syscall(open),宏展開之後為swi #__NR_open,即,swi #0x900005觸發中斷,中 斷號0x900005存放在[lr,#-4]地址中,處理器跳轉到arch/arm/kernel/entry-common.S中vector_swi 讀取[lr,#-4]地址中的中斷號,之後查詢arch/arm/kernel/entry-common.S中的sys_call_table系統調用表,該表內容在arch/arm/kernel/calls.S中定義,__NR_open在表中對應的順序號為
__syscall_start:
...
.long SYMBOL_NAME(sys_open) //第5個
...
將 sys_call_table[5]中內容傳給pc,系統進入sys_open函數,處理實質的open動作
================================================
在2.6.21中,認真研究大家會發現,你迴避不了這樣一個概念,EABI是什麼東西?
核心裡面談EABI,OABI,其實相對於系統調用的方式,當然我們所說的系統限於arm系統。
EABI (Extended ABI),說的是這樣的一種新的系統調用方式
mov r7, #num
swi 0x0
原來的系統調用方式是這樣,
swi (#num | 0x900000) (0x900000是個magic值)
也就是說原來的調用方式(Old ABI)是通過跟隨在swi指令中的調用號來進行的,現在的是根據r7中的值。
現在看兩個宏,一個是
CONFIG_OABI_COMPAT 意思是說和old ABI相容
另一個是
CONFIG_AEABI 意思是說指定現在的方式為EABI
這兩個宏可以同時配置,也可以都不配,也可以配置任何一種。
You can refer to : http://free-electrons.com/doc/arm-linux.pdf
=========================================================
vector_swi定義在arch/arm/kernel/entry-common.S
ret_fast_syscall ret_slow_syscall ret_from_fork call-calls.S-to-init-syscalltable
arch/arm/kernel/entry-header.S
restore_user_regs
store_user_sp_lr
load_user_sp_lr
scno .req r7 @ syscall number
tbl .req r8 @ syscall table pointer
why .req r8 @ Linux syscall (!= 0)
tsk .req r9 @ current thread_info
asmlinkage...必須從堆棧而不是寄存器取參數
堆棧的切換 refer to the register mode in arm Architecture Reference