我已经.S
在各种项目中看到过文件,例如 Linux 内核、FreeBSD 内核或其他一些项目中的文件。这些文件有什么作用,为什么我们不能有.c
文件呢?
8 回答
.S
文件是用汇编编写的源代码文件。汇编是一种极低级的编程形式。这些文件包含按顺序发送到处理器的汇编指令,并且通常基于选定的体系结构进行编译。此类文件的示例经常出现在特定架构的 linux 内核中,例如 x86、sparc、ARM 等。
有关汇编语言的更多信息:
- X86 汇编/GAS 语法
- x86 指令列表
- TLDP Linux 汇编方法
- Linux 内核中的示例:arch/x86/net/bpf_jit.S
那.S
就是汇编语言。通常那是
没有人提到的是为什么大写S?
.S
(大写的 S)代表仍必须通过预处理器的汇编代码。这意味着它可以具有#include
和#define
其他宏。它也可以看作是扩展.sx
.s
(lower s) 是可以编译成对象的纯汇编代码。
为什么不使用.c
?好吧,作为一个操作系统,不可能用C编写所有内容。实际上,这将是理想的,并且 C 语言本身具有与帮助创建操作系统和减少编写代码所需的汇编量相关的背景历史。但是许多低级操作过于依赖机器。
这是一个用于 linux 引导的内存复制例程的一个很好的例子,它使用
#include <linux/linkage.h>
*.S 文件是汇编文件。
为什么是 .S 和为什么不是 .c 文件?
这是因为机器相关的东西/像设置缓存和内存这样的早期初始化只能通过汇编级指令来完成,比如 I/O 指令。
内核没有 libc 库来处理各种资源的初始设置。甚至在应用程序执行期间的任何时候,硬件资源都会依次调用系统调用,这些调用调用以汇编语言编码的 I/O 例程。
它们是汇编代码文件:
汇编语言是用于计算机、微处理器、微控制器和其他可编程设备的低级编程语言,其中每个语句对应于单个机器语言指令。与大多数高级编程语言相比,汇编语言特定于特定的计算机体系结构,后者可能更具可移植性。
因此这些文件与 C 代码文件不同。
请注意,C 文件可以内联汇编指令。
.S 文件是汇编语言文件。它们是机器代码的一种形式。它处于较低的编程水平。所有机器相关的代码都是用汇编语言编写的。不同的处理器的汇编语言是不同的。
.S 文件是用汇编语言编写的代码,即低级编程。在linux内核源码中,.S一般是linux内核启动时内核运行的启动文件(如:-head.S)。我们将其写在 .S 而不是 .C 中,因为此时我们还没有准备好运行 .C 编译的 .O 文件。我们需要使用与架构相关的寄存器并启动内核。
为了完整起见:还有另一个“.s”文件,不是汇编,而是用于对微控制器进行编程的“SREC”二进制文件(以 ASCII 编码)。
https://en.wikipedia.org/wiki/SREC_(file_format)
打开这样的文件后,您会看到如下所示的文本行:
S315000000500C9413110C94D510189518950C949710B0
S31500000060189518950C941010189518950C946A10FC
S31500000070189518950C9403131895189518951895B6
S315000000800C940B1218951895189518950C944912FE
S315000000900C943D101895189518951895189518955F