dan*_*_pa 9 linux assembly kernel inline-assembly
我的问题有些奇怪,但我会尽力解释.
看看linux内核的语言,我得到了C和汇编,即使我读了一篇文章说[引用] Unix的第二次迭代完全用C语言编写[/ quote]
我认为这是误导性的,但当我说内核有汇编代码时,我得到了两个问题
如果Linux内核真的完全用C语言编写,那么它是如何获得编译所需的GCC的呢?
我做了一个完整的find / -name *.s
,只是在/ usr/src/linux-headers- `uname -r/中的某处有一个汇编文件(asm-offset.s)
不知怎的,我不认为这有助于GCC的工作,那么linux如何在没有组装的情况下工作,或者如果它使用汇编它在哪里以及它如何在依赖于arch时稳定.
提前致谢
bro*_*oot 13
1.为什么要使用装配?
因为某些事情只能在汇编中完成,因为汇编会产生更快的代码.例如,"您可以访问处理器的异常编程模式(例如16位模式,以便在Intel PC上连接启动,固件或遗留代码)".请阅读此处了解更多原因.
2.使用什么汇编文件?
来自:https://www.kernel.org/doc/Documentation/arm/README
"最初进入内核是通过head.S,它使用与机器无关的代码.机器在输入时由'r1'的值选择,必须保持唯一."
来自https://www.ibm.com/developerworks/library/l-linuxboot/
"当调用bzImage(用于i386映像)时,从开始汇编例程中的./arch/i386/boot/head.S开始(主流程见图3).此例程执行一些基本的硬件设置和调用./arch/i386/boot/compressed/head.S中的startup_32例程.这个例程设置一个基本环境(堆栈等)并清除符号开始的块(BSS).然后通过一个解压缩内核调用一个名为decompress_kernel的C函数(位于./arch/i386/boot/compressed/misc.c).当内核被解压缩到内存中时,它被调用.这是另一个startup_32函数,但是这个函数在. /arch/i386/kernel/head.S".
除了这些汇编文件之外,很多linux内核代码都使用内联汇编.
3.架构依赖?
你是正确的依赖于架构,这就是为什么linux内核代码被移植到不同的架构.
主要在Linux中汇编的东西:
sysenter/syscall而不是int 0x80在可用时),并实现某些系统调用而无需上下文切换(例如:) gettimeofday().tcpdump,用于,secmode模式2,...)为了支持不同的体系结构,Linux为它支持的每个体系结构编写了汇编代码(重新编写)(有时,对于使用相同CPU体系结构的不同平台,有一些代码的实现).只需看看下面的所有子目录arch/