【问题标题】:Using the _syscall macro for user-space application为用户空间应用程序使用 _syscall 宏
【发布时间】:2013-07-05 08:10:48
【问题描述】:

我看过这个例子:

#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;
 }

我有两个问题:

  • 我想知道为什么需要使用系统调用来查找两个数字之间的差异?
  • 一般来说,我们什么时候需要使用系统调用?

【问题讨论】:

    标签: kernel system-calls


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多