syscall 系統呼叫陷入 trusty系統呼叫

2021-10-13 06:56:14 字數 2663 閱讀 9498

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...