http://tenlee.info/2015/11/15/Linuxaddsyscall/
第一步:
去此网址 http://www.kernel.org/ 下载自己想要的内核源码,建议3.10.93,本人下载的就是3.10.93,测试成功
Ubuntu安装menuconfig,如下命令复制到终端1
sudo apt-get install libncurses5-dev
第二步:
将下载好的tar.xz压缩包解压到 /usr/src/文件夹下,在终端输入如下命令1
sudo tar -xvf linux-3.10.93.tar.xz -C /usr/src/
并进入该文件夹,如下命令1
cd /usr/src/linux-3.10.93
第三步:
将原来的配置文件拷过来,
先到/usr/src/linux-3.10.93
文件夹底下cd /usr/src/linux-3.10.93
由于我当前的Ubuntu内核版本是3.19.0.25,所以我的配置文件是 /usr/src/linux-headers-3.19.0-25-generic/.config
这个文件,你的对应的只是不同的版本号
uname -a
查看当前系统内核。我在终端执行如下命令:
1 | sudo cp /usr/src/linux-headers-3.19.0-25-generic/.config .config |
第四步:
改内核的系统调用库函数,进入arch/x86/syscalls文件夹(因为我是32位,所以进入x86),修改syscall_32.tbl,
执行如下命令1
sudo vim /usr/src/linux-3.10.93arch/x86/syscalls/syscall_32.tbl
在最后一行添加自己的系统调用, 如下1
351 i386 lsproc sys_lsproc
第五步:
声明一下函数原型,在 syscall.h中sudo vim include/linux/syscalls.h
,不懂vim的用sudo gedit include/linux/syscalls.h
在最后添加 函数原型:asmlinkage int sys_lsproc(int num);
第六步:
定义自己的系统调用函数, 进入 kernel 文件夹,执行命令 sudo vim kernel/sys.c
,添加自己定义的函数
第七步:配置内核,
1 | sudo make menuconfig |
这个时候,终端的窗口最好最大化,否则可能会报错。
选Load,然后Ok,然后Save。
依次执行如下命令,要慢慢等待。1
2
3
4make bzImage //生成新内核
make modules //编译模块
make modules_install //安装模块
make install // 安装内核
安装成功之后重启虚拟机,重启的时候按着ESC键(此时的鼠标应该定位在虚拟机里面),进入Ubuntu grub界面,选择Ubuntu高级选项,选择3.10内核
第八步:
进入了3.10内核,编写 test.c文件,使用自己的系统调用,
小白 终端调用 输入命令 gedit test.c,写一下内容1
2
3
4
5
6
7
8
9
10#include <linux/unistd.h>
#include <sys/syscall.h>
//系统调用号根据实验具体
//#define __NR_ mysyscall 223
//数字而定
int main()
{
syscall(351, 1)//依次是调用号,参数
return 0;
}
编译并运行。
输出成功,结束