添加一个系统调用

Posted Li-Yongjun

tags:

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

前言

系统调用是内核向应用层提供的接口,今天我们就添加一个系统调用。

平台

硬件:树莓派3B+
软件:linux-5.10.92

实现

① 添加系统调用号和处理函数
arch/arm/tools/syscall.tbl

438	common	pidfd_getfd			sys_pidfd_getfd
439	common	faccessat2			sys_faccessat2
440	common	process_madvise			sys_process_madvise
# 441 为新增
441 common  get_cpu_number       sys_get_cpu_number

② 添加函数声明
include/linux/syscalls.h

asmlinkage long sys_get_cpu_number(void);

③ 添加函数定义
kernel/sys.c

SYSCALL_DEFINE0(get_cpu_number)

	return num_present_cpus();

④ 重新编译内核

$ make O=RPi3/ linux-rebuild -j4

⑤ 替换树莓派内核,并重启

mkdir kernel -p
mount /dev/mmcblk0p1 kernel/
tftp -gr zImage 192.168.31.224 && cp zImage kernel
sync
reboot

⑥ 编写应用程序
syscall_get_cpu_nums.c

#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>

int main(int argc, char *argv[])

	int cpu_nums;

	cpu_nums = syscall(441);
	printf("cpu_nums = %d\\n", cpu_nums);

	return 0;

Makefile


CC=/home/liyongjun/project/board/buildroot/RPi3/host/bin/arm-buildroot-linux-gnueabihf-gcc

TARGET=syscall_get_cpu_nums

all:
	$CC $TARGET.c -o $TARGET.out

clean:
	rm *.out

⑦ 编译应用程序,下载到树莓派运行

# tftp -gr syscall_get_cpu_nums.out 192.168.31.224 && chmod +x syscall_get_cpu_nums.out
# ./syscall_get_cpu_nums.out 
cpu_nums = 4

成功🎉

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

如何在Linux内核里增加一个系统调用?

添加非 root 用户通常不可用的“有用”系统调用

如何在 xv6 中添加系统调用/实用程序

linux arch/arm64 添加系统调用

通过内核编译法向Linux内核添加系统调用

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