参考链接: 操作系统实验:Linux新增系统调用_CY_BRYANT的博客-CSDN博客_linux增加系统调用实验报告
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h
index 32640c43..7cba573c 100644
--- a/arch/arm/include/asm/unistd.h
+++ b/arch/arm/include/asm/unistd.h
@@ -19,7 +19,7 @@
* This may need to be greater than __NR_last_syscall+1 in order to
* account for the padding in the syscall table
*/
-#define __NR_syscalls (388)
+#define __NR_syscalls (392) // 需要4字节对齐
/*
* *NOTE*: This is a ghost syscall private to the kernel. Only the
diff --git a/arch/arm/include/uapi/asm/unistd.h b/arch/arm/include/uapi/asm/unistd.h
index 0c3f5a0d..12c942d3 100644
--- a/arch/arm/include/uapi/asm/unistd.h
+++ b/arch/arm/include/uapi/asm/unistd.h
@@ -414,6 +414,7 @@
#define __NR_memfd_create (__NR_SYSCALL_BASE+385)
#define __NR_bpf (__NR_SYSCALL_BASE+386)
#define __NR_execveat (__NR_SYSCALL_BASE+387)
+#define __NR_select_sort (__NR_SYSCALL_BASE+388)
/*
* The following SWIs are ARM private.
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index bfea78f1..97c6a295 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -21,7 +21,7 @@ CFLAGS_psci.o = -O
obj-y := elf.o entry-common.o irq.o opcodes.o \
process.o ptrace.o return_address.o \
setup.o signal.o sigreturn_codes.o \
- stacktrace.o sys_arm.o time.o traps.o
+ stacktrace.o sys_arm.o time.o traps.o select_sort.o
obj-$(CONFIG_ATAGS) += atags_parse.o
obj-$(CONFIG_ATAGS_PROC) += atags_proc.o
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
index 05745eb8..b1d8dcb6 100644
--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -397,6 +397,7 @@
/* 385 */ CALL(sys_memfd_create)
CALL(sys_bpf)
CALL(sys_execveat)
+ CALL(sys_select_sort)
#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 76d1e38a..b42f3750 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -884,4 +884,6 @@ asmlinkage long sys_execveat(int dfd, const char __user *filename,
const char __user *const __user *argv,
const char __user *const __user *envp, int flags);
+asmlinkage int sys_select_sort(int *a,const int n);
+
#endif
新增文件 select_sort.c
// 新增文件 select_sort.c
#include<linux/linkage.h>
#include<linux/types.h>
asmlinkage int sys_select_sort(int *a,const int n)
{
int temp,temp1,min,i,j;
for(i=0;i<n-1;i++)
{
temp=i;
min=*(a+i);
for(j=i+1;j<n;j++)
{
if(*(a+j)<min)
{
temp=j;
min=*(a+j);
}
}
if(i != temp)
{
temp1=*(a+i);
*(a+i)=*(a+temp);
*(a+temp)=temp1;
}
}
return 0;
}