linux-5.4新增系统调用

本文介绍了在Linux5.4内核的ARM架构上,针对T113-I芯片,如何为新功能添加系统调用号436(my_syscall),包括修改syscall.tbl、编写函数声明和源代码,以及测试程序的实现过程。
摘要由CSDN通过智能技术生成

文档背景介绍

	架构: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);
	 
	    // 如果复制成功返回0,失败返回-EFAULT
	    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);  /*436:对应新增系统调用的序号,10,buf,系统调用的两个参数,buf用来储存数据*/
    
	printf("ret = %ld\n",ret);		/*以16进制打印数据*/
	for(int i=0;i<16;i++)
	printf("buf[%d] = %x\n",i,buf[i]);	

	// printf("%s\n",buf);	

	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值