linux系统调用编写方法变化

在2.6的时代,写一个linux的系统调用的步骤是这样的:

  1. 编写实际操作函数
  2. 在linux/include/asm-i386/unistd.h中添加宏定义
    #define __NR_myfunctioin 399

  3. 在linux/arch/i386/kernel/entry.S中添加
    .long SYMBOL_NAME(myfunction)

  4. 编译内核
  5. 通过_syscall[1-6](type, name, type, arg1)来调用
而最新版本的kernel对应位置找不到相应的宏定义文件了

unistd.h文件修改为分别对32和64位的版本的引用,并分别放置在了/arch/x86/include/uapi/asm/unistd_[32|64|x32].h,arm的放置在了/arch/arm/uapi/asm/unistd.h中,其它架构的也差不多的位置

另外有些文件修改为了__SYSCALL(n, call)方式定义

entry.S文件也中sys_call_table的相关定义也放置在了syscall.h文件中,将原来的汇编并修改为C数组的定义方式

__SYSCALL是宏

#define __SYSCALL(n, call) [nr] = (call),
#define __SYSCALL_XX(n, sym, compat)
另外添加了sys_call_table[NR_syscalls]数组

void *sys_call_table[NR_syscalls] = {
    [0 ... NR_syscalls-1] =  sys_ni_syscall,
#include <asm/unistd.h>
}

目前,kernel中存在直接使用宏定义数字和__SYSCALL两种方式方式来定义系统调用的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值