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 [] ={4 ……5 [0x23] = (unsigned long) sys_send_msg,6 ……7 };

这些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, { r13-r14 }^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, { r13-r14 }^40 add sp, sp, #8

41 rfeia sp!42 // 恢复之前的r13、r14等寄存器

这样上层请求的系统调用最终会进入内核中对应的服务函数中执行

syscall 系统调用陷入_trusty系统调用相关推荐

  1. syscall 系统调用陷入_系统调用深度剖析(上)

    原文:Anatomy of a system call, part 1 翻译:RobotCode俱乐部 系统调用是用户空间程序与Linux内核交互的主要机制.考虑到它们的重要性,不难发现内核包含了各种 ...

  2. syscall 系统调用陷入_linux 系统调用open 篇一

    内核源码:linux-4.4 目标平台:ARM体系结构 源码工具:source insight 4 说明: 文中由于 md 语法问题,无法在代码高亮的同时而忽略由于 __ 或者 * 造成斜体的 问题, ...

  3. Golang标准库-syscall(什么是系统调用/Go 语言中的系统调用)

    文章目录 一.什么是系统调用 二.Golang标准库-syscall 1. syscall无处不在 2. syscall demo举例: go版本的strace Strace go版本的strace ...

  4. 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表

    文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...

  5. linux中swi指令,Linux系统调用、新增系统调用方法

    说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源,可以通过系统调用来完成. 在linux中,系统调用是用户空间访问内核的一种手段,除异常和中断外,他们是进入内核的合法 ...

  6. 系统调用表与系统调用号-=>数组与下标

    文件include/asm/unisted.h为每个系统调用规定了唯一的编号. 在我们系统中/usr/include/asm/unistd_32.h,可以通过find / -name unistd_3 ...

  7. 什么是c语言系统调用,什么是系统调用?为什么要用系统调用?

    描述 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们.从某种角度来看,系统调用和普通的函数调用非常相似.区别 ...

  8. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌

    本篇说清楚系统调用 读本篇之前建议先读鸿蒙内核源码分析(总目录)工作模式篇. 本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去. 先看图,这里的模式可以理解为空 ...

  9. linux下系统调用接口,LINUX系统调用

    系统调用是用户程序和linux内核交互的接口,linux的系统调用有下面三种方式: int 80 在x86与x86_64的系统中,都可以使用int $0x80指令来执行系统调用,参数使用如下: 调用号 ...

最新文章

  1. Sun Solaris 9 下Squid 代理服务器的配置笔记
  2. 错误LNK1107文件无效或损坏: 无法在 0x338 处读取
  3. oracle表决盘奇数,Oracle 的OCR,表决盘与ASM SPFILE恢复方法
  4. Elasticsearch根据条件进行删除索引命令
  5. BZOJ 1257 [CQOI2007]余数之和sum ——Dirichlet积
  6. c实现三角形角度大于一个值_初中数学三角形知识点小结
  7. 什么情况下需要创建MySQL索引
  8. 以命令行的方式运行activity
  9. MOSS 2007 错误0x80040E14解决
  10. sql中截取字符串函数_SQL Server 2017中的顶级SQL字符串函数
  11. sqli-labs在线网站
  12. 记录:Linux 设置文件夹 0777 权限失效问题
  13. IDEA与SVN集成
  14. webpack-开发服务器-配置
  15. linux lib文件夹,Linux下的lib文件故障解决实例
  16. 低代码真的是“行业毒瘤”?
  17. linux yum zlib安装,Centos升级zlib库导致yum运行错误
  18. HMS华为账号登入全部流程加详解流程机制
  19. cas202268-34-6/苯酚,4,4‘-(10,20-二苯基-21H,23H-卟吩-5,15-二酰基)双酚/分子量:646.73/分子式:C44H30N4O2
  20. maven wagon插件实现自动化部署

热门文章

  1. bzoj3171: [Tjoi2013]循环格(费用流)
  2. 简单动态启停图 js jquery css3
  3. 90%的用户都不知道手机内部功能
  4. 探索.NET中事件机制(续)——虚事件和事件重写问题,微软的Bug?!
  5. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  6. python 数据的读取
  7. selenium+Headless Chrome实现不弹出浏览器自动化登录
  8. 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
  9. 关于series的统计
  10. 什么是 AIDL 以及如何使用