加入新的linux系统调用

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加入新的linux系统调用相关的知识,希望对你有一定的参考价值。

上一篇详解了linux系统调用的原理,接下来依据上一篇的原理简介怎样创建新的linux系统调用

向内核中加入新的系统调用,须要运行3个步骤:
1. 加入新的内核函数
2. 更新头文件unistd.h
3. 针对这个新函数更新系统调用表calls.S


1. 在kernel/sys.c中加入函数:
asmlinkage int sysMul(int a, int b)
{
int c;
c = a*b;
return c;
}


2.在arch/arm/include/asm/unistd.h中加入系统调用编号:加入例如以下

#define __NR_preadv(__NR_SYSCALL_BASE+361)
#define __NR_pwritev (__NR_SYSCALL_BASE+362)
#define __NR_rt_tgsigqueueinfo (__NR_SYSCALL_BASE+363)
#define __NR_perf_event_open (__NR_SYSCALL_BASE+364)
#define __NR_sysMul(__NR_SYSCALL_BASE+365)

备注:在最后面加入


3.在arch/arm/kernel/calls.S中加入代码,指向新实现的系统调用函数:

/* 360 */ CALL(sys_inotify_init1)
CALL(sys_preadv)
CALL(sys_pwritev)
CALL(sys_rt_tgsigqueueinfo)
CALL(sys_perf_event_open)

CALL(sysMul)

备注:必须在最后面加入和unistd.h中的系统调用号一样


4.又一次编译内核

make  uImage ARCH=arm  CROSS_COMPILE=arm-linux-


5.把内核复制到tftp文件夹以下

cp arch/arm/boot/uImage  /tftpboot/

备注:第5步能够不用那个是为了通过tftp下载到开发板


6.使用系统调用

#include <stdio.h>
#include <linux/unistd.h>
main()
{

int result;
result = syscall(361,1, 2);//syscall过程 1、把系统调用号mov  r7,  #365  2、使用svc指令  

//syscall(系统调用号。參数1,參数2) 当中參数1和參数2是sysMul的两个參数
printf("result = ", result);
}





































以上是关于加入新的linux系统调用的主要内容,如果未能解决你的问题,请参考以下文章

Linux基于 Pintos 实现新的用户级程序的系统调用 | 冯诺依曼架构

如何使用克隆系统调用分配新的TLS区域

Linux内核——通过模块动态添加系统调用

看表情包学Linux冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用

看表情包学Linux冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用

看表情包学Linux冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用