实验
为Linux内核增加一个系统调用,并编写用户进程的程序来测试。要求该系统调用能够完成以下功能:
- (1) 该系统调用有1个整型参数,接收输入自己的学号;
- (2) 若参数为奇数,则返回自己学号的最后5位。如你的学号为130120101 ,则返回20101;
- (3) 若参数为偶数,则返回自己的学号的最后6位。如你的学号为130120102 ,则返回120102 。
1.解压内核文件
2.修改系统调用表
cd /usr/src/linux-2.6.32.60/arch/x86/kernel
sudo gedit syscall_table_32.S
在文件的最后一行添加一个系统调用
.long sys_mycall /* 337 */
直接从335到337,是因为335那行的系统调用是335,下面那一行的系统调用是336
3.修改系统调用号文件
因为你增加一个系统调用,所以要增加自己系统的系统调用号,并将系统总调用号加1.
cd /usr/src/linux-2.6.32.60/arch/x86/include/asm
sudo gedit unistd_32.h
修改内容
#define __NR_mycall 337
#deine NR_syscalls 338
4.定义自己的系统调用
(1)增加系统调用声明
cd /usr/src/linux-2.6.32.60/include/linux
sudo gedit syscalls.h
在倒数第二行处添加
asmlinkage long sys_mycall(int num);
long
是返回值,int num
是参数类型
(2)添加系统函数的调用实现
cd /usr/src/linux-2.6.32.60/kernel
sudo gedit sys.c
在倒数第二行处添加函数实现
asmlinkage long sys_mycall(int num){
if(num%2==0)
{
return num%1000000;
}
else
{
return num%100000;
}
}
5.制造内核镜像并更新引导
https://blog.csdn.net/sandalphon4869/article/details/102628888#2_56
cd /usr/src/linux-2.6.32.60
sudo make menuconfig
sudo make
sudo make modules_install
sudo make install
sudo update-initramfs -c -k 2.6.32.60
sudo update-grub
6.测试系统调用是否成功
写个c程序看看,调用方式是syscall(id,args...)
。
- id:是系统调用号,比如这里的337
- args:系统调用传入的参数
cd ~
gedit main.c
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
printf("%d\n",syscall(337,t));
return 0;
}
gcc main
./a.out