system call Note — based on ARM

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.