关于system call 的调用过程本文不在此赘述,笔者只想在此说明如何在linux0.11内核的基础上添加系统调用。
要增加系统调用,分别需要在这7个地方进行改动,分别是内核代码中的:
1. include/unistd.h 中添加系统调用号
2. 在lib中增加用户接口源文件
3. include/linux/sys.h 中添加系统调用函数定义
4. kernel/system_call.s 修改系统调用总数
5. kernel中增加系统调用的具体实现
6. 修改Makefile 文件
以及usr/include/下的用户接口文件unistd.h
下面以增加一个系统调用hello()为例进行说明:
1. 添加内核系统调用号
打开源文件include/unistd.h,在132行处添加
#define __NR_hello 72
2. 增加用户接口源文件
进入lib目录,新建源文件hello.c
#define __LIBRARY__
#include<unistd.h>
_syscall0(int,hello)
3. 添加系统调用函数的定义
打开include/linux/sys.h,分别在73行和sys_call_table[]数组中添加
extern int sys_hello();
sys_hello
4. 修改系统调用总数
打开kernel/system_call.s ,将61行改为
nr_system_calls = 73
5.增加系统调用的具体实现
进入kernel目录,新建源文件sys_hello.c
int sys_hello()
{
printk("Hello From kernel\n");
}
6.修改Makefile文件
进入kernel目录,打开Makefile,在OBJS 那一项后面添加
sys_hello.o
在最后一行添加
sys_hello.s sys_hello.o : sys_hello.c ../include/linux/kernel.h ../include/unistd.h
然后返回源文件根目录,make 编译内核。
7.添加编译器系统调用号
进入系统后,在/usr/include/unistd.h
文件132行添加(与第一步不同)
#define __NR_hello 72
系统调用即添加完毕,新建hello.c文件进行测试:
#define __LIBRARY__
#include <unistd.h>
#include<stdio.h>
int errno;
_syscall0(int,hello)
int main()
{
hello();
return 0;
}
使用gcc 编译并运行,显示输出:
Hello From kernel