将_syscall宏用于用户空间应用程序

时间:2013-07-08 04:13:07

标签: kernel system-calls

我见过这个例子:

#include <stdio.h>
#include <linux/unistd.h>
#include <sys/syscall.h>

#define __NR_getjiffies     320
#define __NR_diffjiffies    321
#define __NR_pdiffjiffies   322

_syscall0( long, getjiffies );
_syscall1( long, diffjiffies, long, ujiffies );
_syscall2( long, pdiffjiffies, long, ujiffies, long*, presult );

int main()
{
  long jifs, result;
  int err;

  jifs = getjiffies();

  printf( "difference is %lx\n", diffjiffies(jifs) );

  err = pdiffjiffies( jifs, &result );

  if (!err) {
     printf( "difference is %lx\n", result );
  } else {
     printf( "error\n" );
  }

     return 0;
 }

我有两个问题:

  • 我想知道为什么需要使用系统调用来查找两个数字之间的区别?
  • 通常我们什么时候需要使用系统调用?

1 个答案:

答案 0 :(得分:0)

为什么需要使用系统调用来查找两个数字之间的差异? - 我不知道你在哪里看到过这段代码,但你当然可以用一个简单的减去来计算多少时间过去。

为什么我们需要系统调用? - 因为1982年的处理器使用了一种称为“保护模式”的东西,这意味着CPU是硬连线的,可以让你有限地访问东西,同时它在保护模式下运行。因此,每次您想要使用硬件(打印到屏幕,写入文件,通过网卡发送内容等)时,您都无法在保护模式下执行此操作。因此,您使用系统调用来请求内核为您执行此操作(内核不以受保护模式运行),内核可能会执行此操作,可能会报告问题或只是告诉您没有权限。因此,简而言之:您需要系统调用才能执行特殊操作,例如使用硬件。