系统调用简单总结
1.系统调用:在用户态,程序员不能直接调用系统函数,系统调用必须在内核模式下实现。
所以在用户态某些C库函数通过汇编指令产生软中断异常,进入内核模式,然后我们就可以将系统调用号和参数传给内核使用系统调用。即系统调用是作为一种异常类型来实现处理的。
2. 添加新的系统调用
1)系统调用号:在unistd.h 文件中 #define _NR_XXX(XXX:系统调用名称) NNN(NNN:系统调用号)
2)系统调用服务进程:sys_xitongdiaoyongname();
eg:在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkage int sys_mycall(int number)
{
return number;
}
3)在/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
.long SYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化。该数组包含指向内核中每个系统调用的指针。这样就在数组中增加了新的内核函数的指针。我们在清单最后添加一行:
.long SYMBOL_NAME(sys_mycall)
3. 使用系统调用的两种方式:
1)c库中封装了系统调用,通过C库间接调用。
eg:通过调用C库中printf()函数,去调用系统调用write();
2) 传递系统调用号,利用syscall()函数(注意该函数为内核提供给用户的一个函数)直接调用;
eg:
int main(void)
{
int a=syscall(318,100);//318是系统调用号,100是参数
printf("%d\n",a);
return 0;
}
或者
#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d n",mycall(100));
}