实现系统调用API

实现系统调用API

​ 系统调用API作为应用层与内核层的重要通信手段已被使用到各种应用场合,但应用层与内核层间的通信手段不只系统调用API一种,我们还可采用中断、地址重映射等方式在这两层间建立通信连接,不过最广泛使用的通信方式依然是系统调用API。

本次目的在于实现通过SYSENTER汇编指令完成应用层到内核层的跳转。

SYSENTER指令是一个快速进入0级特权的指令。在执行之前,处理器必须为其提供0级特权的衔接程序和0级特权全的栈空间,这些数据保存在MSR寄存器和通用寄存器当中。

  • IA32_SYSENTER_CS(MSR寄存器组地址174h处)。这个MSR寄存器的低16位装载的是0级特权的代码段选择子,该值也用于索引0特权级的栈段选择子(IA32_SYSENTER_CS[15:0]+8),因此其值不能为NULL。
  • IA32_SYSENTER_ESP(MSR寄存器组地址175h处)。这个MSR寄存器里的值将会被装载到RSP寄存器中,该值必须是Canonical型地址。在保护模式下只有寄存器的低32位会被装载到RIP寄存器中。
  • IA32_SYSENTER_EIP(MSR寄存器组地址176h处)。这个MSR寄存器里的值会被载入到RIP寄存器中,该值必须是Canonical型地址。在保护模式下,只有寄存器的低32位被装载到RIP寄存器中。

在SYSENTER指令的过程中。处理器会根据IA32_SYSENTER_CS寄存器的值加载到相应的段选择子CS和SS寄存器。

与CALL/RET指令不同的是,执行SYSENTER指令时,处理器不会保存用户代码的状态信息(如RIP和RSP寄存器值),而且均不支持内存参数的方式。

函数system_call_function的参数Regs记录着进程的执行环境,其中的成员变量Rax保存着系统调用的API向量号,目前定义为128个。数组system_call_table用于保存每个系统调用的处理函数,由于目前未实现,特为每个系统调用配置默认的处理函数no_system_call。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值