如果我在 Linux 内核中打开任何文件,几乎每个文件都有许多外部函数和许多#indef
宏#ifndef
,那么在编译时,当文件中包含超过 70 个头文件时,它如何准确映射所有函数和宏.c/.h
?
它完成这项任务的精确度和速度如何? GCC 只负责这些事情还是有其他程序可以完成所有这些任务?
答案1
好的,要完全回答你的问题,你需要阅读一本关于 C 语言编程入门的书塔南鲍姆和龙之书。从学习C开始。
帮助您入门的一些基本部分:编译 C 程序时,传统上有几个不同的阶段。 (现代编译器可能会进行跨阶段优化)这些阶段是:
- 前驱者。这涉及包含文件、#ifdef、#define 和宏扩展。
- 编译器。这会将 C 代码转换为更多机器级别的中间表示(有时是汇编程序)。
- 汇编器。这会将中间表示转换为实际的机器代码。
- 链接器。这会将所有部分组合在一起并处理内存问题。可能有多个链接传递。
gcc 可以完成上述所有操作,但由于内核很复杂,因此还使用了其他工具,其中大多数是特定于内核的。
现在内核在某些方面只是另一个程序,但它有很多差异,包括系统调用,这取决于硬件。
在典型的 Linux 程序中,当您要求内核执行打开文件之类的操作时
- 您的程序调用库函数,
- 库函数进行系统调用,
- 内核在调度表中查找系统调用,
- 内核进行身份验证检查,
- 内核完成工作,
- 内核将结果返回给库函数,
- 库函数将结果返回给您的程序。
这种情况每秒可能发生数百次。