文档背景介绍
架构:arm
内核版本:linux-5.4
sdk: tina
芯片:t113-i
实现步骤
1.添加新的系统调用号
linux-5.4\arch\arm\tools\syscall.tbl :
434 common pidfd_open sys_pidfd_open
435 common clone3 sys_clone3
436 common my_syscall sys_my_syscall ==》添加系统调用号 436
2.添加系统调用函数说明:
linux-5.4\include\linux\syscalls.h
asmlinkage long sys_ni_syscall(void);
// asmlinkage long sys_my_syscall(void);
asmlinkage long sys_my_syscall(int x,const char __user *buf); ==》函数声明
3.添加调用函数源文件
linux-5.4\kernel\Makefile
async.o range.o smpboot.o ucount.o my_syscall.o ==》添加编译
my_syscall.c:
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/fsnotify.h>
#include <linux/module.h>
#include <linux/tty.h>
#include <linux/namei.h>
#include <linux/backing-dev.h>
#include <linux/capability.h>
#include <linux/securebits.h>
#include <linux/security.h>
#include <linux/mount.h>
#include <linux/fcntl.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/personality.h>
#include <linux/pagemap.h>
#include <linux/syscalls.h>
#include <linux/rcupdate.h>
#include <linux/audit.h>
#include <linux/falloc.h>
#include <linux/fs_struct.h>
#include <linux/ima.h>
#include <linux/dnotify.h>
#include <linux/compat.h>
#include <asm/uaccess.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/fs.h>
SYSCALL_DEFINE2(my_syscall, int,x,const char __user *,buf1)
{
char str[50] = {0};
int i;
for(i = 0;i<16;i++)
str[i] = 0xff;
char __user *buf = (char __user *)buf1;
int ret;
ret = copy_to_user(buf, str, strlen(str) + 1);
return ret ? -EFAULT : 0;
}
4.测试程序
syscall.c:
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main()
{
long ret;
char buf[50] = {0};
ret=syscall(436,10,buf);
printf("ret = %ld\n",ret);
for(int i=0;i<16;i++)
printf("buf[%d] = %x\n",i,buf[i]);
return 0;
}