内核系统调用中的链接机制为何如此之快?

内核系统调用中的链接机制为何如此之快?

如果我在 Linux 内核中打开任何文件,几乎每个文件都有许多外部函数和许多#indef#ifndef,那么在编译时,当文件中包含超过 70 个头文件时,它如何准确映射所有函数和宏.c/.h

它完成这项任务的精确度和速度如何? GCC 只负责这些事情还是有其他程序可以完成所有这些任务?

答案1

好的,要完全回答你的问题,你需要阅读一本关于 C 语言编程入门的书塔南鲍姆龙之书。从学习C开始。

帮助您入门的一些基本部分:编译 C 程序时,传统上有几个不同的阶段。 (现代编译器可能会进行跨阶段优化)这些阶段是:

  1. 前驱者。这涉及包含文件、#ifdef、#define 和宏扩展。
  2. 编译器。这会将 C 代码转换为更多机器级别的中间表示(有时是汇编程序)。
  3. 汇编器。这会将中间表示转换为实际的机器代码。
  4. 链接器。这会将所有部分组合在一起并处理内存问题。可能有多个链接传递。

gcc 可以完成上述所有操作,但由于内核很复杂,因此还使用了其他工具,其中大多数是特定于内核的。

现在内核在某些方面只是另一个程序,但它有很多差异,包括系统调用,这取决于硬件。

在典型的 Linux 程序中,当您要求内核执行打开文件之类的操作时

  1. 您的程序调用库函数,
  2. 库函数进行系统调用,
  3. 内核在调度表中查找系统调用,
  4. 内核进行身份验证检查,
  5. 内核完成工作,
  6. 内核将结果返回给库函数,
  7. 库函数将结果返回给您的程序。

这种情况每秒可能发生数百次。

相关内容