系统调用:sys_exit(),SYS_exit和exit()之间的区别

SYS_exit,sys_exit()和exit()有什么区别?

我明白:

  • Linux内核提供了系统调用,这些man 2 syscallsman 2 syscalls中列出。
  • glibc提供的系统调用的封装函数与系统调用的名称大多相似。

我的问题:在man 2 syscalls ,没有提及SYS_exit和sys_exit()。 他们是什么?

注意:这里的系统调用exit只是一个例子。 我的问题确实是:什么是SYS_xxx和sys_xxx()?

Solutions Collecting From Web of "系统调用:sys_exit(),SYS_exit和exit()之间的区别"

我将使用exit(),虽然这适用于所有系统调用。

sys_exit()形式的函数是内核例程的实际入口点,它实现了你认为是exit()的函数。 这些符号甚至对于用户模式程序员都是不可用的。 也就是说,除非你正在窃取内核,否则你不能链接到这些函数,因为它们的符号在内核之外是不可用的。 如果我写了libmsw.a,它有一个文件范围函数

 static int msw_func() {} 

定义在里面,你不会试图链接到它,因为它不会被导出到libmsw符号表中; 那是:

 cc your_program.c libmsw.a 

会产生如下错误:

 ld: cannot resolve symbol msw_func 

因为它没有出口; 内核中包含的sys_exit()同样适用。

为了让用户程序进入内核例程,需要使用syscall(2)接口来实现从用户模式切换到内核模式。 当模式切换(有时称为陷阱)发生时,使用一个小整数来查找将整数映射到内核函数的内核表中正确的内核例程。 表格中的条目具有表格

 {SYS_exit, sys_exit}, 

SYS_exit是一个预处理器宏

 #define SYS_exit (1) 

而且在你出生之前一直是1,因为没有理由去改变它。 它也恰好是系统调用表中的第一个条目,它使查找一个简单的数组索引。

正如你在你的问题中注意到的,正常的用户模式程序访问sys_exit的正确方法是通过glibc(或类似的核心库)中的薄包装器。 如果您正在编写内核代码,那么您只需要使用SYS_exit或sys_exit即可。