trusty中,可以通過系統呼叫陷入kernel,獲取kernel服務。
這裡記錄一下trusty的系統呼叫框架結構,**基於google trusty原始碼
1、應用程式介面
在檔案lib/include/trusty_syscalls.h中,申明了上層呼叫的syscall介面。如:
1 //send_msg()系統呼叫的號碼是0x23
2 #define __nr_send_msg 0x23
3 //send_msg()系統呼叫原型申明
4 long send_msg (uint32_t handle, ipc_msg_t *msg);
這樣,應用層程式可以呼叫這些介面獲取系統服務了。
2、陷入核心
在lib/lib/libc-trusty/arch/arm/trusty_syscall.s檔案中,
// 各個系統呼叫函式對應的彙編**
.section .text.send_msg
function(send_msg)
ldr r12,=__nr_send_msg //系統呼叫號置入r12暫存器
swi #0 //通過swi陷入核心,執行核心**
bx lr //返回lr暫存器位置
使用者空間的這些**是通過指令碼解析生成的,看注釋。具體生成方式方法需要在明確要再明確一下。
3、核心中系統呼叫服務函式申明
lk/trusty/lib/syscall目錄定好了trusty核心處理系統呼叫的框架。
在lk/trusty/lib/trusty/include/syscall_table.h定義了一系列巨集,其餘使用者空間的syscall號碼一一對應。
形如:def_syscall(0x23, send_msg, long, 2, uint32_t handle, ipc_msg_t *msg)
在lk/trusty/lib/syscall/syscall.c檔案中其進行展開,得到系統呼叫函式陣列:
#define def_syscall(nr, fn, rtype, nr_args, ...) rtype sys_##fn (void);
=》long sys_send_msg(void);
#define def_syscall(nr, fn, rtype, nr_args, ...) [(nr)] = (unsigned long) (sys_##fn),
=》[0x23] = (unsigned long) sys_send_msg,
前乙個做函式原型申明,後乙個定義了函式指標陣列,
1 long sys_send_msg(void);2
3 const unsigned long syscall_table =;
這些sys_***類似的函式要在kernel中實現功能。
4、系統呼叫過程
使用者呼叫到swi指令,這是arm軟中斷指令,此時cpu會強制從系統異常向量表的軟中斷異常處開始執行(可能為0x00000008),
trusty中這裡安排了一條跳轉指令,直接跳到arm_syscall符號處。
external/lk/arch/arm/arm/start.s
1 .section ".text.boot"
2 .globl _start3 _start:
4 b platform_reset5 b arm_undefined6 b arm_syscall7 b arm_prefetch_abort8 b arm_data_abort9 b arm_reserved10 b arm_irq11 b arm_fiq12 #if with_smp13 b arm_reset14 #endif
該標號在
lk/trusty/lib/syscall/arch/arm/syscall.s中有定義:
1 /* arm syscallabi2 * ***************3 * only syscalls with 4args (max) are currently supported4 * r0-r3 = args5 * r0-r1 = return value (r0 only if 32-bit retval)6 * r12 = syscallnumber, expected to be trashed.7 * syscalls run with interrupts enabled8 */9 function (arm_syscall)10 srsdb sp!, #mode_svc11 sub sp, sp, #8
12 stmia sp, ^13 // 儲存r13、r14、spsr相關暫存器14
15 cpsie iaf16 // 開中斷,cpsr中相關位17
18 ldr r14, =nr_syscalls19 ldr r14, [r14]20 // 將nr_syscalls的值放入r14,nr_syscalls是當前系統支援的系統呼叫個數21 cmpr12, r1422 // 比較r12與r14,如r12儲存的是中斷請求號23
24 ldrlo r14, =syscall_table25 // ldrlo是條件載入,如果r12= r14?)33 blx r1434 // 跳轉執行r14指示的syscall程式35
36 cpsid iaf37 // 關中斷38
39 ldmia sp, ^40 add sp, sp, #8
41 rfeia sp!42 // 恢復之前的r13、r14等暫存器
這樣上層請求的系統呼叫最終會進入核心中對應的服務函式中執行
Linux系統呼叫 syscall 原理
linux體系結構 核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。如下圖所示 linux 體系結構圖 從上圖得知,linux由使用者空間和核心空間 一般情況下,使用者程序是不能訪問核心的。它既不能訪問核心所在的記憶體空間,也不能呼叫核心中的...
Linux系統呼叫 使用syscall
博主的另一篇博文介紹了如何使用int 0x80指令進行linux系統呼叫,這一篇博文介紹一下如何使用另一種方式 syscall指令進行linux系統呼叫,然後會簡要說明二者的不同。通過syscall指令進行linux系統呼叫與通過int 0x80指令進行linux系統呼叫在使用上差別不大,系統呼叫號...
Syscall系統呼叫Linux核心跟蹤
在linux的使用者空間,我們經常會呼叫系統呼叫,下面我們跟蹤一下read系統呼叫,使用的linux核心版本為linux2.6.37。不同的linux版本其中的實現略有不同。在一些應用中我們可以看到下面的一些定義 define real read fd,buf,count syscall sys r...