Linux系统调用的整体流程为:
1、应用程序【用户态】通过syscall或glibc进行内核功能调用,这一部分在glibc源码中进行的
2、CPU收到syscall,Linux内核响应syscall调用【内核态】,这一部分在linux源码中进行的
3、返回结果到应用程序【用户态】
本节,给Linux系统,增加一个新系统调用功能,获取cpu数量。
1、新建一个源码编译目录
mkdir kernelbuild
2、下载源码,解压
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.59.tar.gz tar -xzf linux-5.10.59.tar.gz cd linux-5.10.59
3、清理
make mrproper
4、修改文件
4.1、arch/x86/entry/syscalls/syscall_64.tbl #在440后面增加一行 441 common get_cpus sys_get_cpus 4.2、include/linux/syscalls.h #在最后一个asmlinkage增加一行 asmlinkage long sys_get_cpus(void); 4.3、kernel/sys.c #在最后一个SYSCALL_DEFINE0后面增加下面几行 //获取系统中有多少CPU SYSCALL_DEFINE0(get_cpus) { return num_present_cpus(); }
5、内核配置
make menuconfig make oldconfig
6、修改.config,去掉一个证书
CONFIG_SYSTEM_TRUSTED_KEYS=“”
7、编译
make -j4
8、安装
sudo make modules_install sudo make install
9、测试
9.1、新建文件cpus.c
#include <stdio.h> #include <unistd.h> #include <sys/syscall.h> int main(int argc, char const *argv[]) { //syscall就是根据系统调用号调用相应的系统调用 long cpus = syscall(441); printf("cpu num is:%d\n", cpus);//输出结果 return 0; }
9.2、编译
gcc main.c -o cpus
9.3、运行
./cpus 在没有修改的内核上返回是-1 在修改过的为num_present_cpus数量