系统调用简单总结

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 ",a);

   return 0;

}

    或者

#include 
  _syscall1(int,mycall,int,ret) 
  main() 
  
  printf("%d n",mycall(100)); 
  

原文地址:https://www.cnblogs.com/happyliuyi/p/5126744.html